Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Вниз

Изменяемые сложные запросы   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.044 c
15-1159518713
Курдль
2006-09-29 12:31
2006.10.22
Бага у гуглей.


2-1160404805
*Стажер*
2006-10-09 18:40
2006.10.22
TWebBrowser и TStream


15-1159520389
Yanis
2006-09-29 12:59
2006.10.22
Никто книжку не желает продать


4-1149756324
Balkon
2006-06-08 12:45
2006.10.22
Необходимо ли операции с СОМ портом, выполняемые из различных..


2-1160197894
novice_man
2006-10-07 09:11
2006.10.22
Функция Format





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский