Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с триггером / 8 сообщений из 8, страница 1 из 1
15.12.2004, 13:25
    #32828369
DIGITALPRO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с триггером
На самом деле просто не хватает в голове ....
Вообщем есть 2 таб.
Справочник периодов: id, name, nd(нач.дата), kd(кон.дата),status
Документ: id, num_doc(номер документа), date_doc(дата документа)

Допустим есть перид 100, Январь 2004, 01/01/2004, 31/01/2004, Закрыт
Пользователь добавляет или исправляет документ с датой (любой с 01 по 31 01/2004) пусть 10/01/2004 нажимает ОК ,а т.к. перид имеет статус ЗАКРЫТ, то тут выходит RAISERROE 20000 'Ай-я-я-й'

И не могу сообразить как это воплотить, может кто поможет.

P.S. про головову шутить не надо! ;))
...
Рейтинг: 0 / 0
15.12.2004, 13:34
    #32828392
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с триггером
Я думаю, что эту проверку лучше вынести на клиента.
Опять-таки, мне так кажется...

...
Рейтинг: 0 / 0
15.12.2004, 13:51
    #32828435
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с триггером
Что текст триггера не изобрести ? Для начала СУБД скажи, какая, а там посмотрим.
...
Рейтинг: 0 / 0
15.12.2004, 13:55
    #32828456
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с триггером
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TRIGGER trg_Documents_Valid_Period BEFORE INSERT, UPDATE, DELETE
ORDER  1  ON documents
REFERENCING OLD AS OldValue NEW AS NewValue
BEGIN
  DECLARE @date_period date;

  IF INSERTING
  THEN
    SET @date_period = NewValue.date_period;
  ELSE
    SET @date_period = OldValue.date_period;
  END IF;

  IF EXISTS(
    SELECT *
    FROM periods
    WHERE (@date_period BETWEEN nd AND kd) AND status = 'Закрыт' )
  THEN
    RAISERROR  20000  'Ай-я-я-й';
    RETURN;
  END IF;
END;

авторЯ думаю, что эту проверку лучше вынести на клиента.
Не стоит - иначе теряется целостность данных в случаях ошибок клиентской части или редактирования через тот же Central.
...
Рейтинг: 0 / 0
15.12.2004, 14:04
    #32828498
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с триггером
авторНе стоит - иначе теряется целостность данных в случаях ошибок клиентской части или редактирования через тот же Central.

У него репликация. А что если все-таки придется подправить документ?
Придется выключать тригер? или все обертывать в

IF CURRENT REMOTE USER IS NULL THEN
END IF;

+ включить пересылать содержимое тригеров?

Сомнительно...

...
Рейтинг: 0 / 0
15.12.2004, 14:12
    #32828526
DIGITALPRO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с триггером
Выдает ошибку
Код: plaintext
1.
2.
[Sybase][ODBC Driver][Adaptive Server Anywhere]Column 'date_period' not found
SQLCODE: - 143 
SQLSTATE: 42S22

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
ALTER TRIGGER "TR_DOC_PP_period" BEFORE INSERT, DELETE, UPDATE
ORDER  1  ON "ADS"."DOC_PP"
REFERENCING OLD AS old_tab NEW AS new_tab
FOR EACH ROW /* WHEN( search_condition ) */
BEGIN
  DECLARE @date_period date;

  IF INSERTING
  THEN
    SET @date_period = new_tab.date_period;
  ELSE
    SET @date_period = old_tab.date_period;
  END IF;

  IF EXISTS(
    SELECT *
    FROM SP_PRD --Справочник периодов
    WHERE (@date_period BETWEEN N_PRD AND K_PRD) AND status = 'Закрыт' )
  THEN
    RAISERROR  20000  'Ай-я-я-й';
    RETURN;
  END IF;

END
===============================
PB 9.0.2 (7236) ASA 9.0.2
...
Рейтинг: 0 / 0
15.12.2004, 14:17
    #32828542
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с триггером
DIGITALPROВыдает ошибку
Код: plaintext
1.
2.
[Sybase][ODBC Driver][Adaptive Server Anywhere]Column 'date_period' not found
SQLCODE: - 143 
SQLSTATE: 42S22

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
ALTER TRIGGER "TR_DOC_PP_period" BEFORE INSERT, DELETE, UPDATE
ORDER  1  ON "ADS"."DOC_PP"
REFERENCING OLD AS old_tab NEW AS new_tab
FOR EACH ROW /* WHEN( search_condition ) */
BEGIN
  DECLARE @date_period date;

  IF INSERTING
  THEN
    SET @date_period = new_tab.date_period;
  ELSE
    SET @date_period = old_tab.date_period;
  END IF;

  IF EXISTS(
    SELECT *
    FROM SP_PRD --Справочник периодов
    WHERE (@date_period BETWEEN N_PRD AND K_PRD) AND status = 'Закрыт' )
  THEN
    RAISERROR  20000  'Ай-я-я-й';
    RETURN;
  END IF;

END
===============================
PB 9.0.2 (7236) ASA 9.0.2
А реальное поле подставить из таблицы вместо моего примера не судьба ?
...
Рейтинг: 0 / 0
15.12.2004, 14:39
    #32828614
DIGITALPRO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с триггером
А реальное поле подставить из таблицы вместо моего примера не судьба ?
Ну а теперь можно пошутить и на счет головы ;))
Ты как всегда прав, после того как я исполнил свою судьбу, хочу сказать
Спасибо, все ОК!
===============================
PB 9.0.2 (7534) ASA 9.0.2 (2451)
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с триггером / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]