Форум: "Базы";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];
ВнизКак работает IBDataSet Найти похожие ветки
← →
lejik (2002-09-27 12:57) [0]Доброе время суток!
У меня возникла следующая проблемка. Использую компонент IBDataSet у которого в свойстве InsertSQL прописано что-то типа INSERT INTO TABLE (NAME) VALUES(NILL). В таблице есть еще поле ID значение которого привязано к генератору, существут триггер BEFORE INSERT в котором значению поля ID присвоивается значение. Так вот при вызове метода IBDataSet.Insert а затем IBDataSet.ApplyUpdates вылетае ошибка что поле ID должно иметь значение (оно в таблице NOT NULL), почему не срабатывает триггер, в чем ошибка? Заранее спасибо!
← →
SergeyDove (2002-09-27 13:05) [1]Привет.
Установи параметр Required этого поля в false, это в Fields Editor. После этого BDE будет считать, что это поле не обязательно для ввода.
Пока.
← →
Johnmen (2002-09-27 13:31) [2]>SergeyDove © (27.09.02 13:05)
Причем здесь BDE ????????/
>lejik ©
Присвой полю ID значение 0 перед вставкой.
← →
Wolf226 (2002-09-27 13:54) [3]SergeyDove тоже прав, кроме того, что это не BDE дело.
← →
lejik (2002-09-27 14:19) [4]> Johnmen ©
А как же триггер????
Ведь насколько я понимаю работу компонента IBDataSet после вызова метода IBDataSet.Insert должен выполняться SQL запрос который прописан в InsertSQL, а тот в свою очередь активизирует триггер. Связка TQuery и UpdateSQL работает в этом случае нормально но хотелось бы использовать IBDataSet
← →
Johnmen (2002-09-27 14:35) [5]>lejik © (27.09.02 14:19)
>> Johnmen ©
>А как же триггер????
А что с триггером ? Переопределит он значение 0 на значение генератора и все дела...
← →
lejik (2002-09-28 12:09) [6]> Johnmen ©
А что с триггером ?
Ни фига не получается :-((((. Значение в поле заносится, но триггер один фиг не срабатывает, т.е. как я понимаю не срабатывает SQL запрос который прописан в InsertSQL.
← →
evgeg (2002-09-28 12:36) [7]> lejik © (28.09.02 12:09)
Как вы определяете, что триггер не сработал?
← →
lejik (2002-09-28 13:11) [8]Значение поля ID остается равным 0
← →
kaif (2002-09-28 13:34) [9]Дело в том, что у Вас после вставки 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:39) [10]> kaif ©
Спасибо за помощь! Единственный вопросик. При вызове метода IBDataSet.Insert будет ли выполняться SQL оператор прописанный в свойстве InsertSQL.
← →
kaif (2002-09-29 14:53) [11]Нет, при вызове метода Insert SQL оператор прописанный в свойстве InsertSQL вызываться не будет. Метод Insert просто переводит TDataSet в режим State = dsInsert. Ведь пользователь может отказаться от сохранения новой записи вызовом метода TDataSet.Cancel.
SQL-оператор, прописанный в InsertSQL, сработает в тот момент, когда происходит DataSet.Post, если DataSet к этому времени находится в состоянии State = dsInsert.
Посмотри в Help состояния свойства State, которые принимает любой DataSet или любой его потомок (TIBDataSet, TIBQuery, TIBTable) и ты все сам поймешь.
А еще посмотри исходные тексты класса TIBDataSet и проследи, какой метод что вызывает.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c