Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.05 c
15-1159441851
Palladin
2006-09-28 15:10
2006.10.22
Авторизация на сервере


2-1159429147
Megabyte
2006-09-28 11:39
2006.10.22
Изменяемые сложные запросы


3-1155899628
Bless
2006-08-18 15:13
2006.10.22
Коды ошибок провайдера.


2-1160040129
dim2001
2006-10-05 13:22
2006.10.22
хвостовые пробелы


2-1160294954
ArtemESC
2006-10-08 12:09
2006.10.22
Возврат из вызываемой процедуры или функции...