Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменяемые сложные запросы [D7, XP]


Страницы:   1 2

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)

Это порочный путь (даже теоретически), ИМХО. Где гарантия, что узер введет строку, которая содержится в справочнике?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо