powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помогите с триггером
8 сообщений из 8, страница 1 из 1
Помогите с триггером
    #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
Помогите с триггером
    #32828392
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, что эту проверку лучше вынести на клиента.
Опять-таки, мне так кажется...

...
Рейтинг: 0 / 0
Помогите с триггером
    #32828435
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что текст триггера не изобрести ? Для начала СУБД скажи, какая, а там посмотрим.
...
Рейтинг: 0 / 0
Помогите с триггером
    #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
Помогите с триггером
    #32828498
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНе стоит - иначе теряется целостность данных в случаях ошибок клиентской части или редактирования через тот же Central.

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

IF CURRENT REMOTE USER IS NULL THEN
END IF;

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

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

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


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