![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменяемые сложные запросы [D7, XP]
Megabyte © (2006-09-28 11:39:00)СУБД FireBird 2.0
Компоненты IBX
Суть: У ИБ_Датасета есть свойства: ModifySQL, InsertSQL, DeleteSQL,
RefreshSQL.
Датасет связан с DBGrid. В него пользователь вносит изменения. Если DBGrid отображает данные с одной таблицы, то как заполнять эти свойства, мне понятно.
Не могу понять, как оформить SQL-запросы, если у меня DBGrid отображает данные, например, с 2-х таблиц.
Дано:
Таблица "Оборудование": Парт-номер, ID_Категории, Описание(eng), Описание(рус), Примечание.
Таблица "Категории": ID_Категории, Название_категории.
DBGrid отображает: Парт-номер, Название_категории, Описание(eng), Описание(рус), Примечание.
Пример:
update OBORUDOVANIE set PART_NUM = :PART_NUM,
NAME_TYPE = :NAME_TYPE, Eng_Description = :Eng_Description,
Rus_Description = :Rus_Description, Primechanie = :Primechanie
where PART_NUM = :OLD_PART_NUM and NAME_TYPE = :OLD_NAME_TYPE and
Eng_Description = :OLD_Eng_Description and Rus_Description = :OLD_Rus_Description and Primechanie = :OLD_Primechanie
Это код, сгенерированный IB_UpdateObject, естественно неправильный. Как я это примерно понимаю:
update OBORUDOVANIE set PART_NUM = :PART_NUM,
Type_Oborud = (select T.Id_Type from Type_Oborudovania T
where T.NAME_TYPE = :NAME_TYPE), Eng_Description = :Eng_Description,
Rus_Description = :Rus_Description, Primechanie = :Primechanie
where PART_NUM = :OLD_PART_NUM and
Eng_Description = :OLD_Eng_Description and Rus_Description = :OLD_Rus_Description
and Primechanie = :OLD_Primechanie and Type_Oborud = (select T.Id_Type from
Type_Oborudovania T where T.NAME_TYPE = :OLD_NAME_TYPE)
Это тоже не правильно, но это примерно то, что мне надо наверное(ругается, что поле NAME_TYPE неизвестно :( )...
Подскажите, как правильно оформить?
Megabyte (2006-10-02 09:51:00) [1]Спасибо, работает!
Desdechado (2006-09-29 18:12:00) [2]поставь присвоение полю в Dataset.BeforePost
Megabyte (2006-09-29 18:07:00) [3]
> 2. 0 должен быть в датасете, а не в запросе.
В Датасете DefaultExpression?
Блин, все равно не работает. :(
Desdechado (2006-09-29 17:50:00) [4]1. Надо BEFORE
2. 0 должен быть в датасете, а не в запросе.
Megabyte (2006-09-29 17:49:00) [5]
> Desdechado © (29.09.06 17:46) [17]
Если применять Before и там проверять на 0, то все равно ругается на то, что
ID_OBORUD должно иметь значение. Почему даже 0 не вставляется, я не пойму!
Desdechado (2006-09-29 17:46:00) [6]> active afterinsert
Как ты думаешь, будет ли работать триггер, когда пытаешься менять вставляемые данные, после того, как они уже сохранены в БД?
Megabyte (2006-09-29 17:42:00) [7]Странно, делаю так:
insert into OBORUDOVANIE
(ID_OBORUD, PART_NUM, TYPE_OBORUD, Eng_Description, Rus_Description,
Primechanie)
values
(0, :PART_NUM, :TYPE_OBORUD, :Eng_Description, :Rus_Description,
:Primechanie)
Все равно ругается, что ID_OBORUD должно иметь значение. :/
И еще, делаю такой вот триггер:
create trigger "for_ID_Oborud" for oborudovanie
active after insert
as
begin
if (new.ID_oborud = 0) then
new.ID_oborud = gen_ID(gen_oborud, 1);
end;
Если делать с помощью мастера, то код компилится, но не коммитится. Выдает ошибку: This Column cannot be updated because it is derived from an SQL function or expression. attempted update of read-only column
Desdechado (2006-09-29 17:07:00) [8]ругается компонент дельфей, а он не знает о триггерах ничего
вставляй какой-нибудь 0 по умолчанию, а в триггере на 0 проверяй
Megabyte (2006-09-29 16:35:00) [9]Почему-то не добавляется новая запись(остальные операции работают нормально). Ругается, что первичный ключ должен иметь значение. В списке бновляемых полей редактируемого запроса я его и ставил и удалял - все равно.
Хотя первичный ключ добавляется по триггеру. :(
Megabyte (2006-09-28 17:13:00) [10]Все, работает. Спасибо.
Sergey13 (2006-09-28 15:39:00) [11]> [10] Megabyte © (28.09.06 15:36)
> А первичный ключ не отображается у меня и его вообще нет в запросе на выборку.
Вот это плохо. ПК должен присутствовать, те более в редактируемом датасете. Отображать его в гриде необязательно.
> Подключил к Датасету IB_UpdateObject, он сгенеировал это.
Добавь в запрос ключевое поле и укажи его на формочке генерации запросов.
Megabyte (2006-09-28 15:36:00) [12]
> Sergey13 © (28.09.06 15:19) [9]
Я просто не рюхаю, как правильно оформить. Подключил к Датасету IB_UpdateObject, он сгенеировал это.
А первичный ключ не отображается у меня и его вообще нет в запросе на выборку.
Megabyte (2006-09-28 15:36:00) [13]
> Sergey13 © (28.09.06 15:19) [9]
Я просто не рюхаю, как правильно оформить. Подключил к Датасету IB_UpdateObject, он сгенеировал это.
А первичный ключ не отображается у меня и его вообще нет в запросе на выборку.
Sergey13 (2006-09-28 15:19:00) [14]> [7] Megabyte © (28.09.06 15:13)
А зачем тогда так длинно?
where
PART_NUM = :OLD_PART_NUM and
TYPE_OBORUD = :OLD_TYPE_OBORUD and
Eng_Description = :OLD_Eng_Description and
Rus_Description = :OLD_Rus_Description and
Primechanie = :OLD_Primechanie
Только не говори мне что все эти поля - составной ключ. 8-)
Ketmar (2006-09-28 15:15:00) [15]извиняюсь, больше влезать не буду. но не могу промолчать:
>У тебя первичного ключа нет что-ли?
>Есть, конечно. Он вводится в триггере через
>генератор.
отвелекитесь от сабжа. попробуйте это прочесть как обычные, нормальные существа. %-)
Megabyte (2006-09-28 15:13:00) [16]Есть, конечно. Он вводится в триггере через генератор.
Sergey13 (2006-09-28 14:46:00) [17]> [5] Megabyte © (28.09.06 14:35)
У тебя первичного ключа нет что-ли?
Megabyte (2006-09-28 14:35:00) [18]Стоп, или теперь связь будет автоматически работать на добавление?
update OBORUDOVANIE
set
PART_NUM = :PART_NUM,
TYPE_OBORUD = :TYPE_OBORUD,
Eng_Description = :Eng_Description,
Rus_Description = :Rus_Description,
Primechanie = :Primechanie
where
PART_NUM = :OLD_PART_NUM and
TYPE_OBORUD = :OLD_TYPE_OBORUD and
Eng_Description = :OLD_Eng_Description and
Rus_Description = :OLD_Rus_Description and
Primechanie = :OLD_Primechanie
Megabyte (2006-09-28 14:24:00) [19]
> ЮЮ © (28.09.06 12:00) [1]
Лукап-полем я сделал, но как запрос оформить(без хранимки), не разобрал. :/
Sergey13 (2006-09-28 13:50:00) [20]> [0] Megabyte © (28.09.06 11:39)
Это порочный путь (даже теоретически), ИМХО. Где гарантия, что узер введет строку, которая содержится в справочнике?