Форум: "Базы";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];
ВнизАвтоматическое заполнение поля-идентификатора в 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c