Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.21;
Скачать: CL | DM;

Вниз

Как работает 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
3-68638
Ученик
2002-09-27 11:57
2002.10.21
Копирование данных в Interbase


6-68908
Blast
2002-08-07 00:22
2002.10.21
Проблема при коннекте клиента с сервером


6-68906
Builder
2002-06-21 13:34
2002.10.21
Прогресс бар при дайнлоаде


14-69007
VictorT
2002-09-27 19:31
2002.10.21
Програмер и системы счисления.


1-68703
dim-
2002-10-11 00:28
2002.10.21
Как удалить форму из памяти?