Форум: "Базы";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];
ВнизIBDataSet Найти похожие ветки
← →
jack128 (2003-09-22 23:59) [0]есть таблица адресов
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..
Как это побороть??
← →
kaif (2003-09-23 01:51) [1]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-запроса.
← →
Johnmen (2003-09-23 09:46) [2]Я предпочитаю OnNewRecord.
← →
kaif (2003-09-23 12:27) [3]2 Johnmen © (23.09.03 09:46) [2]
а я никогда не использовал OnNewRecord...
видимо проглядел это событие.:((
надо бы почитать, когда оно происходит и что делает...
← →
MsGuns (2003-09-23 12:36) [4]А я предпочитаю все делать "по кнопкам"
← →
Deniz (2003-09-23 13:44) [5]Можно еще BeforePost
if Dataset.FieldByName("id").IsNull then
Dataset.FieldByName("id").AsInteger := GetId;
и генератор в холостую не запускается.
← →
kaif (2003-09-23 15:25) [6]Если свойство "генератор" датасета правильно прописать, то в холостую он запускаться не будет и никаких обработчиков тоже не потребуется.
← →
kaif (2003-09-23 15:26) [7]а вообще проверка Required = True происходит до события BeforePost, поэтому совет неправильный.
← →
jack128 (2003-09-23 16:18) [8]
> Если свойство "генератор" датасета правильно прописать,
> то в холостую он запускаться не будет и никаких обработчиков
> тоже не потребуется
У TintegerField нет свойства генератор (Generater)
> а вообще проверка Required = True происходит до события
> BeforePost, поэтому совет неправильный.
Очень даже правильный. Все работает если обработчик повесить на OnBeforePost и у поля ID выставить Required = False;
Спасибо всем...
← →
Johnmen (2003-09-23 16:39) [9]>jack128 © (23.09.03 16:18)
Очень даже неправильный, т.к. не учитывает Required.
← →
jack128 (2003-09-23 16:47) [10]А есть другие варианты? Так по крайней мере все работает...
← →
Johnmen (2003-09-23 16:52) [11]Так нормальный вариант. Если Required = False.
И kaif © вовсе не говорил, что он плохой...
← →
kaif (2003-09-23 17:51) [12]2 jack128 © (23.09.03 16:18) [8]
У TintegerField нет свойства генератор (Generater)
Я написал Если свойство "генератор" датасета правильно прописать.
У датасета (TIBDataSet и TIBQuery) есть свойство
GeneratorField (я его имел в виду) и PropertyEditor к нему. Так что можно в Object Inspector-е кнопочку нажать на GeneratorField и в окошке диалога указать:
1.Имя используемого генератора из выпадающего списка
2.Поле (ID), в которое нужно засунуть значение
2.Инкремент
3.Способ срабатывания (On New Record или On Post, например)
Я часто использую свойство GeneratorField и нахожу его очень удобным во всех отношениях. К тому же если это свойство заполнено, то проблема с Required не возникает.
Хотя если необходимо получать ID как-то иначе, то решение с BeforePost и отменой Required идеальное и я сам его часто использую, особенно для всяких lookup-полей, которые у меня как правило not null.
← →
jack128 (2003-09-23 18:12) [13]
> У датасета (TIBDataSet и TIBQuery) есть свойство
мда...Надо мне обновление ibx скачать..У меня такого свойства нету...
← →
kaif (2003-09-23 18:44) [14]2 jack128 © (23.09.03 18:12) [13]
Блин, точно...
Извини, я об этом не подумал.
Скачай обновление. В родной IBX D5 к тому же много глюков. Практика показала, что обновления IBX работают хорошо и есть смысл их ставить.
← →
jack128 (2003-09-23 22:24) [15]Скачал. Установил. При загрузке Delphi возникает ошибка не найдена точка входа в процедуру ля-ля-ля (название к сожелению не записал, но в нем символов 30-40)в пакете DCLIB50.bpl..
← →
Zacho (2003-09-23 22:32) [16]
> jack128 © (23.09.03 22:24) [15]
У тебя получилось несколько dcu, dcp или bpl разных версий. Сотри все и перекомпилируй пакет. И больше не допускай бардака на винте :)
← →
jack128 (2003-09-23 23:38) [17]
> Zacho © (23.09.03 22:32) [16]
У меня на винт бардак строго упорядочен ;-) И вообще update к IBX поставляется в виде setup.exe, я собсвенно его только запустил и все..
← →
Zacho (2003-09-23 23:45) [18]
> jack128 © (23.09.03 23:38) [17]
> У меня на винт бардак строго упорядочен ;-) И вообще update
> к IBX поставляется в виде setup.exe, я собсвенно его только
> запустил и все..
Перед запуском сетапа надо было полностью снести старый IBX. Насколько помню, это даже в ридми написано :)
Ну как, проблему-то решил ?
← →
jack128 (2003-09-23 23:58) [19]Нету там ред ми..А при инсталяции на всякий случай бекап делается...Только нечем это не помогает...
> Ну как, проблему-то решил ?
см
> jack128 © (23.09.03 16:18) [8]
← →
Zacho (2003-09-24 00:15) [20]Я имею в виду: апдейт IBX установил ?
> При загрузке Delphi возникает ошибка не найдена точка входа
> в процедуру ля-ля-ля (название к сожелению не записал, но
> в нем символов 30-40)в пакете DCLIB50.bpl..
На всякий случай еще раз: это происходит потому, что у тебя в разных каталогах есть одноименные dcu, dcp, и/или bpl от разных версий IBX. Сотри лишние, а еще лучше - все сотри и перекомпилируй IBX.
← →
jack128 (2003-09-24 12:41) [21]А на пальцах не можешь объяснить как перекомпилировать IBX если нет .dpk файла??
Если все еще интресно - вот полное описание ошибки
Заголовок окна об ошибке "type IBCustomDataSet.TCachedUpdateStatus - IBCustomDataSet.pas"
Текст
"Точка входа в процедуру @Parentagesupport@Tsprig@FindItemByPath$qqrx17System@AnsiStringo не найдена в библиотеке DLL dsbide50.bpl"
← →
jack128 (2003-09-24 13:13) [22]Хотя все- вопрос закрыт...Помогла установка sp1 к d5 ;-)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.011 c