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

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

Как работает IBDataSet [D6, IB6.x]


lejik ©   (2002-09-27 12:57:00) 

Доброе время суток!
У меня возникла следующая проблемка. Использую компонент IBDataSet у которого в свойстве InsertSQL прописано что-то типа INSERT INTO TABLE (NAME) VALUES(NILL). В таблице есть еще поле ID значение которого привязано к генератору, существут триггер BEFORE INSERT в котором значению поля ID присвоивается значение. Так вот при вызове метода IBDataSet.Insert а затем IBDataSet.ApplyUpdates вылетае ошибка что поле ID должно иметь значение (оно в таблице NOT NULL), почему не срабатывает триггер, в чем ошибка? Заранее спасибо!


kaif   (2002-09-29 14:53:00) [1]

Нет, при вызове метода Insert SQL оператор прописанный в свойстве InsertSQL вызываться не будет. Метод Insert просто переводит TDataSet в режим State = dsInsert. Ведь пользователь может отказаться от сохранения новой записи вызовом метода TDataSet.Cancel.
SQL-оператор, прописанный в InsertSQL, сработает в тот момент, когда происходит DataSet.Post, если DataSet к этому времени находится в состоянии State = dsInsert.
Посмотри в Help состояния свойства State, которые принимает любой DataSet или любой его потомок (TIBDataSet, TIBQuery, TIBTable) и ты все сам поймешь.
А еще посмотри исходные тексты класса TIBDataSet и проследи, какой метод что вызывает.


lejik   (2002-09-28 13:39:00) [2]

> kaif ©
Спасибо за помощь! Единственный вопросик. При вызове метода IBDataSet.Insert будет ли выполняться SQL оператор прописанный в свойстве InsertSQL.


kaif   (2002-09-28 13:34:00) [3]

Дело в том, что у Вас после вставки TIBDataSet должен как-то получить значение поля ID для того, чтобы вызвать RefreshSQL для вставленной строки (что он делает по умолчанию).
Поэтому присвоение значения генератора полю ID в триггере - не лучшее решение. По крайней мере, если у Вас нет альтернативного ключа, с помощью которого можно было бы вписать корректный SELECT в RefreshSQL...
Я вижу здесь 2 выхода:

1. Иметь альтернативный ключ и делать присвоение ID в триггере, а в RefresSQL вписать SELECT записи где в WHERE стоят условия выборки по альтернативному ключу (не ID).

2. Вообще не присваивать полю ID значение в триггере, а присваивать в InsertSQL, как это обычно делается компонентами палитры IBX. Для этого нужно присвоить значение свойству Generator в IBDataSet. Я обычно так и делаю. В этом случае IBDataSet сначала сам запрашивает новое значение генератора, затем присваивает полученное значение полю ID вставляемой строки в наборе, а затем уже делает Post. Тогда RefreshSQL может опираться на уже известное значение ID.


lejik   (2002-09-28 13:11:00) [4]

Значение поля ID остается равным 0


evgeg   (2002-09-28 12:36:00) [5]

> lejik © (28.09.02 12:09)

Как вы определяете, что триггер не сработал?


lejik   (2002-09-28 12:09:00) [6]

> Johnmen ©
А что с триггером ?

Ни фига не получается :-((((. Значение в поле заносится, но триггер один фиг не срабатывает, т.е. как я понимаю не срабатывает SQL запрос который прописан в InsertSQL.


Johnmen   (2002-09-27 14:35:00) [7]

>lejik © (27.09.02 14:19)
>> Johnmen ©
>А как же триггер????

А что с триггером ? Переопределит он значение 0 на значение генератора и все дела...


lejik   (2002-09-27 14:19:00) [8]

> Johnmen ©
А как же триггер????
Ведь насколько я понимаю работу компонента IBDataSet после вызова метода IBDataSet.Insert должен выполняться SQL запрос который прописан в InsertSQL, а тот в свою очередь активизирует триггер. Связка TQuery и UpdateSQL работает в этом случае нормально но хотелось бы использовать IBDataSet


Wolf226   (2002-09-27 13:54:00) [9]

SergeyDove тоже прав, кроме того, что это не BDE дело.


Johnmen   (2002-09-27 13:31:00) [10]

>SergeyDove © (27.09.02 13:05)

Причем здесь BDE ????????/

>lejik ©

Присвой полю ID значение 0 перед вставкой.


SergeyDove   (2002-09-27 13:05:00) [11]

Привет.
Установи параметр Required этого поля в false, это в Fields Editor. После этого BDE будет считать, что это поле не обязательно для ввода.
Пока.


Наверх

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