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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
1-51240
Zheks
2003-10-03 16:06
2003.10.16
MaskEdit


14-51436
Е-Моё имя
2003-09-30 11:07
2003.10.16
Жилье в Питере


1-51164
Shuhkoman
2003-10-05 14:17
2003.10.16
Help! Языковая понель :)


6-51365
andrewxx
2003-08-21 16:24
2003.10.16
Indy POP3


6-51374
AVoic
2003-08-19 12:11
2003.10.16
программно к who-is