Текущий архив: 2006.10.22;
Скачать: CL | DM;
Вниз
Изменяемые сложные запросы Найти похожие ветки
← →
Megabyte © (2006-09-28 11:39) [0]СУБД 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 неизвестно :( )...
Подскажите, как правильно оформить?
← →
ЮЮ © (2006-09-28 12:00) [1]Cktletn Название_категории сделать Lookup полем. Добавлять в запрос вторую таблицу следует, только если требуется сортировка по этому полю, да и то поля из неё в DataSet тянуть не следует
← →
Desdechado © (2006-09-28 13:36) [2]если запрос на сохранение данных сложный или из нескольких этапов, заверни вызов в хранимку и подставляй ее
← →
Sergey13 © (2006-09-28 13:50) [3]> [0] Megabyte © (28.09.06 11:39)
Это порочный путь (даже теоретически), ИМХО. Где гарантия, что узер введет строку, которая содержится в справочнике?
← →
Megabyte © (2006-09-28 14:24) [4]
> ЮЮ © (28.09.06 12:00) [1]
Лукап-полем я сделал, но как запрос оформить(без хранимки), не разобрал. :/
← →
Megabyte © (2006-09-28 14:35) [5]Стоп, или теперь связь будет автоматически работать на добавление?
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
← →
Sergey13 © (2006-09-28 14:46) [6]> [5] Megabyte © (28.09.06 14:35)
У тебя первичного ключа нет что-ли?
← →
Megabyte © (2006-09-28 15:13) [7]Есть, конечно. Он вводится в триггере через генератор.
← →
Ketmar © (2006-09-28 15:15) [8]извиняюсь, больше влезать не буду. но не могу промолчать:
>У тебя первичного ключа нет что-ли?
>Есть, конечно. Он вводится в триггере через
>генератор.
отвелекитесь от сабжа. попробуйте это прочесть как обычные, нормальные существа. %-)
← →
Sergey13 © (2006-09-28 15:19) [9]> [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-)
← →
Megabyte © (2006-09-28 15:36) [10]
> Sergey13 © (28.09.06 15:19) [9]
Я просто не рюхаю, как правильно оформить. Подключил к Датасету IB_UpdateObject, он сгенеировал это.
А первичный ключ не отображается у меня и его вообще нет в запросе на выборку.
← →
Megabyte © (2006-09-28 15:36) [11]
> Sergey13 © (28.09.06 15:19) [9]
Я просто не рюхаю, как правильно оформить. Подключил к Датасету IB_UpdateObject, он сгенеировал это.
А первичный ключ не отображается у меня и его вообще нет в запросе на выборку.
← →
Sergey13 © (2006-09-28 15:39) [12]> [10] Megabyte © (28.09.06 15:36)
> А первичный ключ не отображается у меня и его вообще нет в запросе на выборку.
Вот это плохо. ПК должен присутствовать, те более в редактируемом датасете. Отображать его в гриде необязательно.
> Подключил к Датасету IB_UpdateObject, он сгенеировал это.
Добавь в запрос ключевое поле и укажи его на формочке генерации запросов.
← →
Megabyte © (2006-09-28 17:13) [13]Все, работает. Спасибо.
← →
Megabyte © (2006-09-29 16:35) [14]Почему-то не добавляется новая запись(остальные операции работают нормально). Ругается, что первичный ключ должен иметь значение. В списке бновляемых полей редактируемого запроса я его и ставил и удалял - все равно.
Хотя первичный ключ добавляется по триггеру. :(
← →
Desdechado © (2006-09-29 17:07) [15]ругается компонент дельфей, а он не знает о триггерах ничего
вставляй какой-нибудь 0 по умолчанию, а в триггере на 0 проверяй
← →
Megabyte © (2006-09-29 17:42) [16]Странно, делаю так:
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:46) [17]> active after insert
Как ты думаешь, будет ли работать триггер, когда пытаешься менять вставляемые данные, после того, как они уже сохранены в БД?
← →
Megabyte © (2006-09-29 17:49) [18]
> Desdechado © (29.09.06 17:46) [17]
Если применять Before и там проверять на 0, то все равно ругается на то, что
ID_OBORUD должно иметь значение. Почему даже 0 не вставляется, я не пойму!
← →
Desdechado © (2006-09-29 17:50) [19]1. Надо BEFORE
2. 0 должен быть в датасете, а не в запросе.
← →
Megabyte © (2006-09-29 18:07) [20]
> 2. 0 должен быть в датасете, а не в запросе.
В Датасете DefaultExpression?
Блин, все равно не работает. :(
← →
Desdechado © (2006-09-29 18:12) [21]поставь присвоение полю в Dataset.BeforePost
← →
Megabyte © (2006-10-02 09:51) [22]Спасибо, работает!
Страницы: 1 вся ветка
Текущий архив: 2006.10.22;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.033 c