Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "Бази";
Поточний архів: 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
ПОЧАТИ
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
ПОЧАТИ
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;
ще
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.61 MB
Час: 0.03 c
3-74599
габбер
2002-12-04 20:21
2002.12.23
Шановні майстри!


3-74602
xenon
2002-12-04 15:46
2002.12.23
Обробка повідомлень сервера


1-74752
Господь
2002-12-10 22:23
2002.12.23
як c: temp proba.txt поделть на ім'я і шлях


1-74670
Тундра
2002-12-12 13:02
2002.12.23
Як зробити прозорий прямокутник?


14-74947
race1
2002-12-01 16:29
2002.12.23
ndd and ntfs





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська