Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-51314
афвуд
2003-10-04 17:37
2003.10.16
Не срабатывает обработчик


6-51369
krx
2003-08-18 21:16
2003.10.16
Метод Пост и все все все....


1-51317
Abrams
2003-10-06 10:08
2003.10.16
TDateTimePicker


14-51466
Johnny Smith
2003-09-29 14:53
2003.10.16
Правь, Британия, морями!


14-51425
Zhirnov Maxim
2003-09-23 22:50
2003.10.16
Русский модули к Wise Installer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский