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

Вниз

Автоматическое заполнение поля-идентификатора в InterBase   Найти похожие ветки 

 
OlkaGTS ©   (2002-12-05 16:59) [0]

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


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

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


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

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


 
Prooksius ©   (2002-12-06 11:06) [3]

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


 
DarkGreen ©   (2002-12-06 11:55) [4]

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

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


 
Prooksius ©   (2002-12-06 12:01) [5]

2 DarkGreen © (06.12.02 11:55)

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

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


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

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

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

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

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



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

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


 
Alexandr ©   (2002-12-09 13:23) [8]

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


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

>> 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 = "<DEFAULT VALUE>";

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


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

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


 
Alexandr ©   (2002-12-10 06:30) [11]

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


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

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

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

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2003.01.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
1-49102
iap
2003-01-05 09:01
2003.01.16
Вопрос по TImage.


1-49063
Berg
2003-01-08 09:56
2003.01.16
Уменьшение exe-файла приложения


14-49247
Dimas
2002-12-26 17:23
2003.01.16
File not found: system.pas


1-48990
pumba
2003-01-02 08:15
2003.01.16
Олимпиадная задача 2


3-48863
TTCustomDelphiMaster
2002-12-23 21:05
2003.01.16
Запросец