Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];

Вниз

Creating TRIGGER (FireBird, QuickDesk)   Найти похожие ветки 

 
Dimedrol   (2002-07-17 18:55) [0]

Коллеги, помогите с сабжем пожалуйста...
Работаю с EMS QuickDesk 2.7.0.1

Есть моя таблица

CREATE TABLE ARTICLES (
ID INTEGER NOT NULL,
PID INTEGER DEFAULT 0,
NUM NUMERIC (5, 2) DEFAULT 0 CHECK (NUM BETWEEN -256 AND 256),
CRC COMPUTED BY (PID + ID * NUM),
STATUS CHAR(2) CHECK (STATUS IN ("on", "off")),
AUTHOR CHAR (64) NOT NULL UNIQUE,
HEADER VARCHAR (128) NOT NULL UNIQUE,
LEAD VARCHAR (512) DEFAULT "No lead",
INSERTED TIMESTAMP DEFAULT "NOW",
PRIMARY KEY (ID)
);


К ней генератор для авто-инкремента...

CREATE GENERATOR GEN1;
COMMIT;
SET GENERATOR GEN1 TO 0; (или 1)
COMMIT;

Пока все ОК. Создается, и т.п...

Потом, собссно, делаю триггер -

CREATE TRIGGER ART_INC FOR ARTICLES ACTIVE
BEFORE INSERT POSITION 0
AS
BEGIN
IF (articles.id is NULL) THEN articles.id = GEN_ID(GEN1, 1);
END;


Так мне этот QuickDesk и говорит, типа
" Unknown variable - id"
на втором, выделенном " articles.id"
Главное, на первом не ругается, а на втором - ругается.


Я уж и кейс менял везде, и в 1 строчку все написать пробовал, и перегружал прогу,-
нифига не помогает.
А попробовал этоже самое проделать через ISQL
под Линухом моим, где сервак-то и стоит - все прошло с пол-пинка ! 8-\
Там тоже наваял все это в 1 строчку, просто ентер-ы убил...

QuickDesk может показывать SQL стейтменты всех операций, - типа
SQL-вид. Это круто, но !
беру копирую оттуда код создания этого триггера,
исполняю в нем же, и... нифига ! не пашет! 888-\


Что бы это могло быть...


PS
Я ваще люблю конечно консоль на линухе,
но что же с ГУИ твориться-то , а ?!


 
Val   (2002-07-17 19:08) [1]

А так?
CREATE TRIGGER ART_INC FOR ARTICLES ACTIVE
BEFORE INSERT POSITION 0
AS
BEGIN
IF (:old.id is NULL) THEN :new.id = GEN_ID(GEN1, 1);
END;


 
Val   (2002-07-17 19:22) [2]

сорри, в IB перед old и new двоеточие не ставится


 
Awex   (2002-07-17 19:31) [3]

>Val
В тригере BEFORE INSERT сотояние записей OLD не определено,
а это значит что коретно будет лишь следующее:

CREATE TRIGGER ART_INC FOR ARTICLES ACTIVE
BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID ID NULL) THEN NEW.ID = GEN_ID(GEN1, 1);
END;



 
Awex   (2002-07-17 19:35) [4]

2Dimedrol
>Работаю с EMS QuickDesk 2.7.0.1
Мой вам совет попробуйте IB Expert ( http://www.ibexpert.com),
штука нечно похожая, но присуствует с моей точки зрения ряд достаточно интересных и приятных возможностей, да функционал получше.


 
Dimedrol   (2002-07-17 23:24) [5]

2 Awex
А где можно взять фул-версию энтого самого IB Expert-а ?
А то "лекарство" нашел только для 1-й версии,
а у них на сайте уже вторая лежит... :-\


 
Dimedrol   (2002-07-17 23:50) [6]

2 Awex
О,сорри !
Так он же бесплатный для ex-USSR !
Круто!
Спасибо за инфу.
Поюзаем, поюзаем....


 
Johnmen   (2002-07-18 09:17) [7]

Принципиальная ошибка :
IF (NEW.ID ID NULL) THEN NEW.ID = GEN_ID(GEN1, 1);
надо безусловно наращивать генератор :
NEW.ID = GEN_ID(GEN1, 1);


 
Val   (2002-07-18 10:55) [8]

>Awex © (17.07.02 19:31)
угу, прогнал я. только и проверка там не нужна при инсерте, откуда же там заполненное поле? Johnmen © (18.07.02 09:17) прав. Утро вечера мудренее :)


 
Awex   (2002-07-18 13:48) [9]

2Val
А проверка как раз и нужна.
Некоторые клиентские библиотеки, например FIB (pFIBDataSet) генерят(присваивают) ID на клиенте(делается это по ряду причин), и соответственно для генерации последовательных дентификационных номеров нужна такая проверка.


 
Val   (2002-07-18 14:06) [10]

>Awex © (18.07.02 13:48)
зачем тогда вам присвоение в триггере?


 
Johnmen   (2002-07-18 15:02) [11]

>Awex © (18.07.02 13:48)
>...Некоторые клиентские библиотеки, например FIB (pFIBDataSet)
>генерят(присваивают) ID на клиенте...

Да что ты ? Серьезно ?
Хотелось бы подробностей о механизме....


 
Awex   (2002-07-18 15:09) [12]

2Val
>зачем тогда вам присвоение в триггере?
Например если запись будет добавляться не со стороны клиента, а со стороны сервера, то есть допустим хранимой процедурой (или из процеды процедурой).

2Johnmen © (18.07.02 09:17)
>Принципиальная ошибка :
>IF (NEW.ID ID NULL) THEN NEW.ID = GEN_ID(GEN1, 1);
>надо безусловно наращивать генератор :
>NEW.ID = GEN_ID(GEN1, 1);

А если значение ID сформировано на клиенте ?

--------------
В любом случае запись вида
IF (NEW.ID ID NULL) THEN NEW.ID = GEN_ID(GEN1, 1);
считается не то что правилом хорошего тона,
а наиболее корректно для случаев формирования ID как на строне клиента так и на строне сервера.

Вот например в статье
http://www.ibase.ru/devinfo/generator.htm
описывается обенности работы с генераторами, советую взглянуть,
обосновывающие такое решение.







 
Johnmen   (2002-07-18 15:25) [13]

>Awex © (18.07.02 15:09)

Надо однозначно определиться, где формируется значение, из приложения или в триггере, и не смешивать эти два способа !
Это есть правильный подход ! (смею утверждать)


 
Val   (2002-07-18 15:38) [14]

>Awex © (18.07.02 15:09)
и что мешает при вставке в процедуре использовать новое значение генератора? Мне кажется, удобнее либо формировать его в триггере перед вставкой и нигде больше, либо не формировать в триггере, а формировать при вставке откуда угодно.
p.s. спасибо за ссылку.


 
Awex   (2002-07-18 15:43) [15]

>Это есть правильный подход ! (смею утверждать)
А с моей точки зрения, это не так.
Почему ?
Иногда бывают случаи когда формировать нужно значение как из приложения так и в триггере.
Вот например:
1. Нужно добавить запись со стороны клиенского приложения (например добавление нового документа)
При использовании генератора в триггере возникает проблема на клиентской стороне, где однозначно уже нужно значение ID а не Null. (Например для тех кто использует QuantumGrid нужно уникальное KeyField для идентификации записи (для нормального Функционирования(обновления, изменения) в режиме LoadAllRecord). И срабатываение тригера при комите вызовет изменения ID, таким образом запись "теряется". Отсюда следует что запись вида
IF (NEW.ID ID NULL) THEN NEW.ID = GEN_ID(GEN1, 1)
является закономерной.

2. Добавление записей со стороны сервера (К примеру когда в хранимой процедуре по образцу нескольких документов создается другой), тут просто случай NEW.ID = GEN_ID(GEN1, 1);

Отсюда вывод:
IF (NEW.ID ID NULL) THEN NEW.ID = GEN_ID(GEN1, 1)
НАИБОЛЕЕ КОРРЕКТНО И УНИВЕРСАЛЬНЕЙ !


 
Val   (2002-07-18 16:06) [16]

>Awex © (18.07.02 15:43)
1.чтобы не было проблемы с NULL передайте какое угодно значение, триггер его перепишет. Насчет "потери" записи не совсем понятно- просто поменяется ID в таком случае, вы ведь связать с этой записью все равно еще ничего не успели до вставки?
2. insert into mytable (ID) values (GEN_ID(GEN1, 1)) - так разве не пройдет?


 
Johnmen   (2002-07-18 16:18) [17]

>Awex © (18.07.02 15:43)
>1.

Ну причем здесь какие-то гриды ?!
Если указать 0, то все будет Ок, и вызов генератора в триггере обеспечит уникальность. И ничего не "потеряется" !

>Отсюда следует

Из неверных посылок следуют неверные выводы...


 
Awex   (2002-07-18 16:48) [18]

2Val
>передайте какое угодно значение, триггер его перепишет.
А зачем передавать какое угодно значение, когда можно сразу передать сгенеренный ID?

Johnmen
>Ну причем здесь какие-то гриды ?!

А если для отображение в каком то компоненте требуется поле (набор полей) для правильного идентифицирования (опят же допустим для отображения, как в QuantumGrid"e) ?
И запись при отображении компонентом (dsInsert) которая индефицировалась по ID, не обновиться (после CommitRetaining и переход в dsEdit) в частности в компоненте, ведь часть полей может расчитываться на сервере, ведь до этого хранилось другое значение ID (которое поменялось тригером), она своего рода "потеряется".
Да еще если записей достаточно много, придется полность обновлять набор.

Хотя оговорюсь что гриды сдесь совершенно ни причем, это всего лишь случай, при котором требуется некоторая универсальность.

>Отсюда следует
>>Из неверных посылок следуют неверные выводы...
Человек считает правильным и верным то, что на данный момент ему уктуально и правильно с его точки зрения...




 
Val   (2002-07-18 17:07) [19]

>Awex © (18.07.02 16:48)
:(...таким способом можно обойти проблему с null о которой вы говорили(не лучшее решение, согласен), я же написал.


 
Desdechado   (2002-07-18 17:25) [20]

>Так мне этот QuickDesk и говорит, типа
>"Unknown variable - id"
если диалект 3-й, то имена полей регистрозависимые


 
Dimedrol   (2002-07-18 23:17) [21]

2 Desdechado
Конечно 3-й.
Но я и так и так пробовал... ;-(


 
Dimedrol   (2002-07-18 23:22) [22]

Уважаемые коллеги!

Я очень хочу поблагодарить всех принявших участие
в этой жаркой дискуссии! Спасибо всем !!! 8-)
Та информация, к-рую я получил никак не будет лишней.

И все же отдельное спасибо зочу сказать " 2 Awex" !
Его код оказался самым подходящим - он сработал ! ;-)


CREATE TRIGGER ART_INC FOR ARTICLES ACTIVE
BEFORE INSERT POSITION 0
AS
BEGIN
IF ( NEW.ID IS NULL) THEN NEW.ID = GEN_ID(GEN1, 1);
END;


Как я понял, моя ошибка была в том, что вместо
NEW у меня было имя таблицы ARTICLES.

Хотя... все брал из доки...
Вот что значит - личный опыт ! 8-)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.007 c
7-24247
Bosss20000
2002-05-24 19:35
2002.08.08
Запуск приложений....


1-24116
Smok_er
2002-07-23 18:44
2002.08.08
Проблема с TembeddedWB


1-23985
cherepovets
2002-07-27 13:59
2002.08.08
Панель задач


1-23990
Sam Stone
2002-07-27 16:24
2002.08.08
Проблема с комбобоксами


6-24143
Alibaba
2002-05-27 10:43
2002.08.08
МАС адрес





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