Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-48904
AlexVit
2002-12-20 12:37
2003.01.16
С BDE проблемы!!!


1-49082
kolega
2003-01-04 22:49
2003.01.16
как исправить иероглифы?


3-48910
gunner
2002-12-20 16:04
2003.01.16
Утечка памяти в ADOStoredProc


7-49335
Qpwoe!
2002-10-21 07:56
2003.01.16
Как на Дelphi написать организовать передачу данных ...


1-49048
Stas_a
2003-01-08 06:34
2003.01.16
Компилирование





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский