Головна сторінка
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]

PS Поглянь на це:
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.6 MB
Час: 0.036 c
3-74562
дослідник
2002-12-04 13:29
2002.12.23
перекрити DBGrid


4-75033
apay
2002-11-09 02:07
2002.12.23
Як отримати MenuSpeed ​​(delay-before-show time)


14-74984
Koster
2002-12-03 06:00
2002.12.23
Дивне питання


1-74807
TTCustomDelphiMaster
2002-12-11 15:16
2002.12.23
TAction то працює, то ні.


14-74895
Дмитро К.К.
2002-12-04 14:03
2002.12.23
Текстовий редактор





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