![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IBDataSet [D5, Firebird]
jack128 © (2003-09-22 23:59:00)
есть таблица адресов
id integer,
name varchar(255),
parent_id integer,
children_count integer //это поле вычисляется в тригере
и есть ibdataset с такими параметрами
selectSQL select * from ADDRESSES
insertSQL insert into ADDRESSES
(id, name, parent_id) values (:ID, :NAME, :PARENT_ID)
у датасета определено событие before insert
procedure TForm1.IBDataSet1BeforeInsert(DataSet: TDataSet);
begin
// функция
Dataset.FieldByName("id").AsInteger := GetId;
end;
для вывожу эту таблицу в grid и пытаюсь добавить запись, если я не заполняю поле id, то возникает ошибка
field "id" must have value. Видимо дело в том что ibdataset сначало тестирует присвоно ли полю значение и только потом вызывает onbeforeinsert..
Как это побороть??
Johnmen (2003-09-23 09:46:00) [21]
Я предпочитаю OnNewRecord.
kaif (2003-09-23 01:51:00) [22]
TIBDataSet сначала вызывает проверку на NOT NULL, а затем уже BeforePost. Чтобы побороть это нужно Required := False в свойствах поля ID поставить.
BeforeInsert юзать бессмысленно, так как это событие возникает еще даже до перехода в режим Insert. Вместо этого нужно юзать AfterInsert.
Попробуй переписать текст обработчика в событие AfterInsert.
Странно, что в BeforeInsert он у тебя не вызывает ошибки "DataSet is not in edit mode"...
Вообще не нужно путать BeforeInsert датасета с логикой триггеров IB BEFORE INSERT. Триггеры срабатывают перед вставкой в таблицу, а событие датасета - перед добавлением строки в набор. Добавление строки в таблицу произойдет после вызова метода Post. Тогда и сработает InsertSQL.
Датесет имеет режимы State: dsBrowse, dsInsert, dsEdit. В режиме просмотра (dsBrowse) поля не редактируются. В двух других режимах - редактируются. В режимах dsInsert, dsEdit можно вызывать метод Post. Вот он и делает реально всю работу по посылке соответствующего SQL-запроса.