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