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

Вниз

Как перехватить занесение в базу записи, содержащей 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
14-74913
vopros
2002-11-29 11:16
2002.12.23
Вроде все хорошо.Но такая ж.па.


4-75037
Semion
2002-11-04 08:38
2002.12.23
Путь к проге


14-74939
Axis_of_Evil
2002-12-02 12:48
2002.12.23
Macintosh vs Остальное


3-74552
Relict
2002-12-04 11:54
2002.12.23
Jpeg MSSQL


1-74668
sammy
2002-12-13 07:08
2002.12.23
SetWindowsHookEx