Форум: "Базы";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
ВнизКак перехватить занесение в базу записи, содержащей Null-значения Найти похожие ветки
← →
b_baranov (2002-12-04 02:34) [0]Как перехватить занесение в базу записи, содержащей в некоторых полях, например "Фамилия", нежелательные Null-значения?
DELPHI и FIBPlus.
Alexandr подсказал: "Создай триггер, задай поле NOT NULL, задай CHECK в базе ...".
Создал исключение
CREATE EXCEPTION EX_NON_NULL "Не введены обязательные параметры"
Триггер BEFORE INSERT
BEGIN
INSERT INTO CART_PASPORT(ID) VALUES(CART_MAIN.PAT_ID); /* */
/* Попытка перехвата */
WHEN ANY DO
EXCEPTION EX_NON_NULL;
END
Запустил проц. В поле "Фамилия" ничего не ввел, чтобы инициировать исключение. Получил вполне переводимое:
F_1.pFIBDataSEt1.InsertQurry:
The insert failed because a column definition includes validation constraints.
validation errors for column LAST_N, value "*** null ***"
Что-то не то вытворяю. И толком прочитать негде. Извиняюсь за многословие, но опыта пока нет. Если можно, пожалуйста помогите.
← →
DarkGreen (2002-12-04 06:08) [1]Ну а что ты хотел получить? Если хочешь просто перехватить, то создавай триггер на инсер, а если не хочешь позволить вообще делать этого (добавлять пустые (NULL) значения), то создавай CHECK. А у тебя судя по всему CHECK и сработал
← →
Alexandr (2002-12-04 06:27) [2]вот вот.
1) Документацию для кого писали?
2) см. документацию и кучу всего на www.ibase.ru
3) Посмотри книжки, наконец.
иначе консультации будут платные, однозначно.
← →
b_baranov (2002-12-04 11:33) [3]>DarkGreen Надеялся получить не стандартное сообщение, а окно, где как-то отражалось бы сообщение из созданного исключения
← →
b_baranov (2002-12-04 11:36) [4]>Alexandr Книгу "Мир InterBase" не выпускаю из рук, но явно такого там не нахожу. А в документации без опыта непонятн куда смотреть.
← →
Alexandr (2002-12-04 11:40) [5]т.е. у тебя и check not null сделан и триггер?
← →
FreeLancer (2002-12-04 11:43) [6]Убери NOT NULL и CHECK для поля, оставь триггер, где проверяй на NULL. Иначе до триггера дело не дойдет. Предыдущие ограничения раньше такие попытки отсекут и выдадут свои Exception"ы. Создай свой Exception с "русским" содержимым или обрабатывай имеющийся:
try
...
except on E: Exception do
begin
if MessageBox(Application.Handle, PChar(E.Message+#10#13+"Это описание ошибки"), PChar(String(E.ClassName)+"Это название ошибки"),
MB_YESNO+MB_SYSTEMMODAL+MB_DEFBUTTON2) = mrYes then
begin
...
end else
begin
...
end;
if E.ClassType = EAccessViolation then ...
if E.ClassType = EDBEngineError then ...
end;
end;
← →
FreeLancer (2002-12-04 11:47) [7]P.S. Взгляни на это:
http://www.ibase.ru/devinfo/customex.htm
← →
b_baranov (2002-12-04 11:50) [8]>Alexandr Да и Check и триггер.
← →
asafr (2002-12-04 11:53) [9]А что, в СУБД IB нет возможности для поля таблицы выставить NOT NUL?
← →
Alexandr (2002-12-04 11:58) [10]а триггер который ты привел к какой таблице относится?
Да и вообще, привел бы тут описание таблицы с чеками и триггерами.
А то ты по-моему какой-то не тот триггер тут написал.
Вообщем, непонятно чего там у тебя в базе.
а вообще-то обычно так делают:
Вот хочешь ты проверить поле при вставке в таблицу на not null
так создай триггер на эту таблицу на before insert где
напищи
if new.field is null then exception EX_NON_NULL
и делов-то!
← →
Alexandr (2002-12-04 12:02) [11]все там есть
← →
b_baranov (2002-12-05 02:48) [12]>Alexandr "Да и вообще, привел бы тут описание таблицы с чеками и триггерами."
К вопросу о перехвате записи, содержащей недопустимые NULL-поля.
Рассматривается картотека (модель). Б.д. - две таблицы.
Табл. CART_MAIN - поля "PAT_ID", "ФАМИЛИЯ", "ИМЯ", "ОТЧЕСТВО".
Табл. CART_PASPORT - поля "PAT_ID", "СЕРИЯ ПАСП", "НОМЕР ПАСП", "КОГДА ВЫД", "КЕМ ВЫД".
DELPHI-форма для полей табл. CART_MAIN.
Значение поля "PAT_ID" - из генератора.
Значения полей "ФАМИЛИЯ", "ИМЯ", "ОТЧЕСТВО" - элементы ввода (DBEdit) - они-то и должны быть NOT NULL.
Триггер before insert для табл CART_MAIN - занося строку в эту табл. одновременно формируем строку для
этого пациента в табл. CART_PASPORT заполняя поле "PAT_ID".
Пациент регистрируется, т.е. строка заносится в табл. CART_MAIN, если значения полей
"ФАМИЛИЯ", "ИМЯ", "ОТЧЕСТВО" NOT NULL (обязательные поля регистрации).
CREATE TABLE CART_MAIN (
PAT_ID INTEGER NOT NULL,
LAST_N VARCHAR (20) character set WIN1251 collate WIN1251,
FIRST_N VARCHAR (20) character set WIN1251 collate WIN1251,
SECOND_N VARCHAR (20) character set WIN1251 collate WIN1251)
CREATE TABLE CART_PASPORT (
PAT_ID INTEGER NOT NULL,
PASP_SER VARCHAR (20) character set WIN1251 collate WIN1251,
PASP_NUM VARCHAR (20) character set WIN1251 collate WIN1251,
PASP_VID VARCHAR (80) character set WIN1251 collate WIN1251,
PASP_DATE DATE);
CREATE EXCEPTION EX_NON_NULL "ОБЯЗАТЕЛЬНЫЕ ПАРАМЕТРЫ РЕГИСТРАЦИИ НЕ ВВЕДЕНЫ"
Trigger input_pat_id
AS
BEGIN
if ((cart_main.last_n is null) or (cart_main.first_n is null) or (cart_main.second_n is null)) then
exception ex_non_null;
else
insert into cart_pasport (id) values(cart_main.pat_id); /* Паспорт */
END
Вот, собственно, пока и все.
FreeLancer, Alexandr, большое спасибо за помощь.
Сознаю, что вас очевидно раздражает когда кто-то, как я, например, не понимает, что вначале срабатывает NOT NULL
(который у меня был заведен для полей "ФАМИЛИЯ", "ИМЯ", "ОТЧЕСТВО") со своим EXCEPTION и до триггера дело и не доходит, но вот поверьте в книгах "Мир IB" и "Delphi5. Руководство разработчика баз данных" Фаронов В.В., Шумаков П.В. явно об этом не написано. А по документации без опыта пока трудно. Это не в оправдание, а просто к слову.
← →
Alexandr (2002-12-05 06:04) [13]1) откуда ты выдрал такое левое написание триггера?
2) В триггерах надо использовать new.field или old.field
3) Невнимательно читаешь сообщения в этой ветке
4) где в таблице card_passport поле ID
( с какого перепугу у тебя этот запрос пройдет вообще?) insert into cart_pasport (id) values(cart_main.pat_id);
5) Вообщем, достало меня дальше смотреть на этот бред. Иди снова книжки читай до ПОЛОНОГО прояснения.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c