Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Автоматическое заполнение поля-идентификатора в InterBase [D6, IB6.x]


OlkaGTS ©   (2002-12-05 16:59:00) 

В таблице базы данных на InterBase создано поле-идентификатор, которое должно заполняться как обычное автоинкрементное поле.
Написан триггер Before_insert в котором для этого поля генерируется новое значение. Но триггер срабатывает только при выполнении SQL-запроса Insert. При заполнении данными из программы триггер не срабатывает.
Подскажите, пожалуйста, каким образом обходится это ограничение.


Johnmen   (2002-12-21 00:30:00) [1]

>Сергєєв Володимир (09.12.02 17:21)

Согласен с Alexandr © (10.12.02 06:30)
Действительно, самоуверенный БРЕД !


alexsl   (2002-12-20 22:40:00) [2]

>"...А как она в проекте узнает значение уникального ключа? ..."
используй TIBDataSet.
property: GeneratedField или в этом духе, если мне не изменяет память для этого и сделана, что бы выдергивать автоматически значения из генератора.

>"...ругается и на поля для который заданы значения по умолчанию, если в этих полях ничего не введено... "
попробуй в дизайнере поля поковырять пропери AutoIncriment у него три значения 1.None 2.AutoInc 3.Default

ну в общем почитай хелп... Удачи :)


Alexandr   (2002-12-10 06:30:00) [3]

2Сергєєв Володимир твои подводные камни это бред сивой кобылы, увы :(


Domkrat   (2002-12-09 22:54:00) [4]

Такие сложности. Убераешь Default 0 и
"field ID must have value" как рукой снимает.
А в остальном FIB выход конечно.


Сергєєв Володимир   (2002-12-09 17:21:00) [5]

>> Alexandr © (09.12.02 13:23)
>> или повторять, или юзать FIBPlus
>> там таких извратов делать ненадо.
-------------------------------------
Если кодишь по ИБ, то боже тебя упаси использовать FIB+. Из личного горького опыта. И наоборот, если кодишь под ФБ, то не дай бог у тебя подниметься рука щелкнуть по закладке InterBase на палитре. Это ДВА РАЗНЫХ сервака. и хоть в основе ФБ лежит часть открытого исходника ИБ, но эти серваки кодились разными людьми, и думают эти люди соответственно, тоже по разному.

А вообще, есть одна библиотека IBO (InterBase Objects). Она переплевывает оби технологии (IBX & FIB+), потому что в принцепе своем построена на другой философии. Все идет через Коннекшн, а не через Датабазе. Скажу сразу - платная, и потом проблемы будут с исходником (когда его где на халяву пробъете), т.к. писалась она на Делфях4 и надо потом почти каждый юнит ручками... Но развести под Делфи6 получилось.

А вообще, - это наверное вопрос религии.
--------------------------------------------------------------
Насчет дефалтовых полей - то это глюк IBX. и глюк из-за того, что попытались они сделать компоненты как в BDE. А нельзя скрещивать ужа и ежа - получиться колючая проволока в лучшем случае. Инпрайз сдесь действительно допустили ошибку. Дело в том, что (согласно имеющихся у меня исходников IBX для Делфи5) все значения при вызове метода Пост компонента ИБТабле беруться из связанных контроллов отображения, а если столбцы ни с кем не связаны, то NULL. В элементарном FOREIGN KEY это вызовет ошибку
и ИБ просто пошелет тебя.

Выход - смотри первый мой комментарий. Все точно также.
Или дествительно воспользуйся более на мой взгляд продуманной в этом отношении FIB+. Но о подводных камнях я тебя предупредил.

Третий вариант. Только что пришел в голову. В том триггере, что срабатыват перед Инсертом в позиции 0 напиши

IF NEW.SOME_FIELD = NULL THEN NEW.SOME_FIELD = "";

Не пробовал. Но вроде должно получиться.


Alexandr   (2002-12-09 13:23:00) [6]

или повторять, или юзать FIBPlus
там таких извратов делать ненадо.


OlkaGTS   (2002-12-09 13:20:00) [7]

Спасибо.
Теперь возник еще один вопрос. С подобной же формулировкой программа ругается и на поля для который заданы значения по умолчанию, если в этих полях ничего не введено. Т.е. вся логика, которая была описана на сервере не срабатывает и ее необходимо повторять на клиенте. В общем, как-то нелогично получается.
Вопрос: повторять все ограничения, заданные на сервере вручную на клиенте или есть какие-то другие способы?


Сергєєв Володимир   (2002-12-08 18:35:00) [8]

Если ты просматриваешь таблицу пра помоши TIBTable, то создай событие BeforeInsert и в нем

begin
IBTable1.Fields[0].AsInteger := -1; // В принципе- чему угодно
end;

Значение может равняться чему угодно. Главное, чтобы это значение никогда не равнялось сушествуюшему в таблице, а то тогда поймаешь PRIMARY KEY MUST BE UNIQUE. для автоинкрементных полей достаточно чтобы это значение было например отрицательным.
Колонку ID в ДБГриде вообще отображать необязательно (если она конечно не нужна для отображения).

А вся фигня заключаестся в следующем : у тебя поле автозаполняется буторным значением в клиентской проге, в принципе - наважно каким, а после метода Пост сработает триггер и ето значение выправиться на нормальное - автоинкрементное.


Prooksius   (2002-12-06 12:01:00) [9]

2 DarkGreen © (06.12.02 11:55)

> Проще, ИМХО, выполнять перед вставкой записи с помощью TIBQuery
> или TIBSQL простенький запрос
>
> select gen_ig(Generator_Name, 1) from rdb$database
> и в коде программы устанавливать значение уникального ключа.

Согласен на 100%.


DarkGreen   (2002-12-06 11:55:00) [10]

Толку ноль, от этого. А как она в проекте узнает значение уникального ключа? Это довольно часто требуется. Проще, ИМХО, выполнять перед вставкой записи с помощью TIBQuery или TIBSQL простенький запрос

select gen_ig(Generator_Name, 1) from rdb$database
и в коде программы устанавливать значение уникального ключа.


Prooksius   (2002-12-06 11:06:00) [11]

2 OlkaGTS © (06.12.02 10:59)
По моему, у тебя поле ID в Делфи имеет свойство Required в тру (или что-то там в этом роде). Убери свойство - будет работать.


OlkaGTS   (2002-12-06 10:59:00) [12]

Я это поле не торогаю. Но если я пишу в базу запрос INSERT....
то триггер срабатывает и значение подставляется. Если же в программе создать набор данных и писать данные туда, поле индентификатора при этом не заполняя по-прежнему, то возникает ошибка "field ID must have value". (Значит триггер не срабатывает?). Точно также получается, если попробовать записать данные из IBConsole и ничегов поле ID не внести.


Fran   (2002-12-05 18:42:00) [13]

Что значит "При заполнении данными из программы триггер не срабатывает" ? Не надо это поле изменять в программе, оно же уникальный индефикатор записи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо