powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Trigger все ОК, но надо по другому
2 сообщений из 2, страница 1 из 1
Trigger все ОК, но надо по другому
    #32874920
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообщем есть 3 таб.
1. U_XO - Учет хоз опер.
id_xo, date_xo, ...
2. U_XO_DET - Учет хоз оперций детализация т.е. сами проводки (связь с U_XO по id_xo)
id, id_xo, prim, ...
3. SP_PRD - справочник перодов
n_prd(нач.периода), k_prd(конец), status, ...

Так вот есть триггер на U_XO_DET который смотрит на таблицу U_XO а точнее на его дату и сравнивает с периодом, если пероид не закрыт(status = 0) то все ок, иначе сообщение
Вроде тоже все ок работает

Но теперь если удаляем запись из U_XO, срабатывает триггер у таб U_XO_DET и ничего не дает удалить

Это сам триггер
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
ALTER TRIGGER "TR_U_XO_DET_period" BEFORE INSERT, DELETE, UPDATE
ORDER  1  ON "ADS"."U_XO_DET"
REFERENCING 

OLD AS old_tab
NEW AS new_tab

FOR EACH ROW /* WHEN( search_condition ) */
BEGIN

DECLARE @date_n date;
DECLARE @date_o date;

IF INSERTING THEN
    SET @date_n = (SELECT date_xo FROM U_XO a WHERE a.id_xo = new_tab.id_xo);
    SET @date_o = (SELECT date_xo FROM U_XO a WHERE a.id_xo = new_tab.id_xo);
ELSEIF UPDATING THEN
    SET @date_n = (SELECT date_xo FROM U_XO a WHERE a.id_xo = new_tab.id_xo);
    SET @date_o = (SELECT date_xo FROM U_XO a WHERE a.id_xo = old_tab.id_xo);
ELSEIF DELETING THEN
    SET @date_n = (SELECT date_xo FROM U_XO a WHERE a.id_xo = old_tab.id_xo);
    SET @date_o = (SELECT date_xo FROM U_XO a WHERE a.id_xo = old_tab.id_xo);
END IF;


IF EXISTS(
    SELECT *
    FROM SP_PRD
    WHERE ((@date_n BETWEEN N_PRD AND K_PRD) or (@date_o BETWEEN N_PRD AND K_PRD)) AND Status =  1  /*AND CURRENT USER <> 'ADS'*/ )
OR (SELECT Count(id_prd) FROM SP_PRD WHERE @date_n BETWEEN N_PRD AND K_PRD) <  1 
OR (SELECT Count(id_prd) FROM SP_PRD WHERE @date_o BETWEEN N_PRD AND K_PRD) <  1 
//OR (SELECT Count(id_prd) FROM SP_PRD WHERE ((@date_n BETWEEN N_PRD AND K_PRD) or (@date_o BETWEEN N_PRD AND K_PRD)) ) < 1
THEN
    RAISERROR  20000  'На изменение, добавление, удаление записи в закрытом периоде у Вас нет прав, обратитесь к Администратору...->'||@date_o||'<-3333';
    RETURN;
END IF;

END

Уточняю вопрос: удаляю запись из таб U_XO от 01/01/2005 (период открыт)
и тут срабатывает тригер у таб. U_XO_DET и ничего не дает удалить

т.е. я примерно знаю в чем проблема но как ее решить пока не знаю
мои домыслы: он удалят (ну или как то помечает) запись из U_XO, а тригер у U_XO_DET смотрит а эту запись из U_XO и не находит там этой записи т.е. срабатывают строки
OR (SELECT Count(id_prd) FROM SP_PRD WHERE @date_n BETWEEN N_PRD AND K_PRD) < 1
OR (SELECT Count(id_prd) FROM SP_PRD WHERE @date_o BETWEEN N_PRD AND K_PRD) < 1

Как выбратся из этой ситуации?
...
Рейтинг: 0 / 0
Trigger все ОК, но надо по другому
    #32874965
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь за глупый вопрос на который сам и ответил
Эти строчки
Код: plaintext
1.
OR (SELECT Count(id_prd) FROM SP_PRD WHERE @date_n BETWEEN N_PRD AND K_PRD) <  1 
OR (SELECT Count(id_prd) FROM SP_PRD WHERE @date_o BETWEEN N_PRD AND K_PRD) <  1 

Здесь просто напросто не нужны!
===============================
PB 9.0.2 (7534) ASA 9.0.2 (2451)
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Trigger все ОК, но надо по другому
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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