CftClub.ru
Клуб специалистов ЦФТ-Банк

особенности написания триггеров

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
ssa774
Профи


Вступление в Клуб: 30.11.2007
СообщениеЧт Ноя 08, 2012 08:52   особенности написания триггеров Ответить с цитатой
Полезность: Нет оценки
Коллеги, задача вроде простая, но не получается пока.
При занесении операции в справочник, отправить сообщение конкретному пользователю в Навигаторе.
Пробую через вкладку Триггеры, создаю триггер на создание записи.

Код:

Begin
Z$USER_SEND_MESSAGE.SEND_MESSAGE_EXECUTE(274265127,'USER','Есть документы');
RTL.SEND_EVENT(131991738,(-1),REPLACE('Есть документы',RTL.CR$));
End;

Пытаюсь двумя способами, отправить пользователю и на сессию. Не отрабатывает. Что не так делаю?
В Настройках стоит Получать внешние сообщения. Себе отправляю стандартными операциям, сообщения вижу
molokov
Участник со стажем


Вступление в Клуб: 28.09.2007
СообщениеЧт Ноя 08, 2012 10:06   Re: особенности написания триггеров Ответить с цитатой
Полезность: 1
Привет !

Должно работать, если подставляешь id сессии правильно. Посмотри код в операции "послать сообщение" в системных журналах.

ssa774 пишет:
Коллеги, задача вроде простая, но не получается пока.
При занесении операции в справочник, отправить сообщение конкретному пользователю в Навигаторе.
Пробую через вкладку Триггеры, создаю триггер на создание записи.

Код:

Begin
Z$USER_SEND_MESSAGE.SEND_MESSAGE_EXECUTE(274265127,'USER','Есть документы');
RTL.SEND_EVENT(131991738,(-1),REPLACE('Есть документы',RTL.CR$));
End;

Пытаюсь двумя способами, отправить пользователю и на сессию. Не отрабатывает. Что не так делаю?
В Настройках стоит Получать внешние сообщения. Себе отправляю стандартными операциям, сообщения вижу
ssa774
Профи


Вступление в Клуб: 30.11.2007
СообщениеВт Ноя 20, 2012 08:40    Ответить с цитатой
Полезность: Нет оценки
Отправка сообщений заработала-таки, спасибо.
А как работать с созданным экземпляром дальше?
Есть триггер на создание записи, отрабатывает после вставки.
Текст триггера:
Код:

Z$J_REG_SVB_SRV_2649.ADD_REC(:new.ID);

Z$J_REG_SVB_SRV_2649.ADD_REC - процедура, на входе ссылка на справочник, на котором висит триггер.
Как только в процедуре я пытаюсь обратиться к реквизиту созданной записи, выдается ошибка: таблица ... изменяется, триггер/функция может не заметить это.
Нажимаю Подробно, показывает на первую строчку, где идет обращение к реквизиту созданной записи (любому).
Закомментировала весь текст процедуры, оставила вывод в pipe - работает.
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПт Ноя 23, 2012 11:49    Ответить с цитатой
Полезность: Нет оценки
ssa774 пишет:
Отправка сообщений заработала-таки, спасибо.
А как работать с созданным экземпляром дальше?
Есть триггер на создание записи, отрабатывает после вставки.
Текст триггера:
Код:

Z$J_REG_SVB_SRV_2649.ADD_REC(:new.ID);

Z$J_REG_SVB_SRV_2649.ADD_REC - процедура, на входе ссылка на справочник, на котором висит триггер.
Как только в процедуре я пытаюсь обратиться к реквизиту созданной записи, выдается ошибка: таблица ... изменяется, триггер/функция может не заметить это.
Нажимаю Подробно, показывает на первую строчку, где идет обращение к реквизиту созданной записи (любому).
Закомментировала весь текст процедуры, оставила вывод в pipe - работает.


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

Что вы хотите сделать в процедуре с таким говорящим названием ADD_REC ?

И зачем это делать именно в триггере? Не проще изменить саму операцию NEW_AUTO?

И что вы хотите достигнуть в результате?
ssa774
Профи


Вступление в Клуб: 30.11.2007
СообщениеПт Ноя 23, 2012 11:59    Ответить с цитатой
Полезность: Нет оценки
Random пишет:

Что вы хотите сделать в процедуре с таким говорящим названием ADD_REC ?

Это не суть важно, я поняла, в чем ошибка, обошла по другому, не обращаясь к реквизитам записи, чтобы не дергались интерфейсные пакеты.
Нормальное название... Rolling Eyes Добавить запись
Random пишет:

И зачем это делать именно в триггере? Не проще изменить саму операцию NEW_AUTO?

Нет, нужен именно триггер. Если вставка в таблицу будет выполнена не операцией New_AUTO, а простым insert-ом (если сейчас это нигде не сделано, нет гарантии, что не будет), то мои доработки в NEW_AUTO не сработают.
Тема закрыта.
belosheeva_nv
Участник


Вступление в Клуб: 01.07.2013
СообщениеВт Ноя 05, 2013 08:21    Ответить с цитатой
Полезность: Нет оценки
Подскажите, пожалуйста, как написать триггер на изменение структурного реквизита, например, реквизит C_CLIENT_REQ#1#2 в типе PR_CRED. Написала вот так:
Код:

declare
v_old_acc number := 0;
v_new_acc number := 0;
v_id number;
v_client_class   varchar(50) := '';
Begin   
   if :new.class_id='OVERDRAFTS' or :new.class_id='KRED_PERS' then      
      begin
         select cl.CLASS_ID into v_client_class from Z#CLIENT cl where :new.C_CLIENT=cl.ID;
      exception when NO_DATA_FOUND then
         null;
      end;
      
      if v_client_class='CL_PRIV' then         
         if :old.C_CLIENT_REQ#1#2 is not null then
            select ID into v_old_acc from z#ac_fin where id = :old.C_CLIENT_REQ#1#2;
         end if;
      
         if :new.C_CLIENT_REQ#1#2 is not null then
            select ID into v_new_acc from z#ac_fin where id = :new.C_CLIENT_REQ#1#2;             
         end if;
         
         if v_new_acc<>v_old_acc then
            Z$CIT_INTERFACE_BCS_LIB_CRED.genOutCredInfo(:old.ID);
         end if;   
      end if;
   end if;   
/*exception when others then
   null;*/
End;


При отработке триггера выдается ошибка:

таблица IBS.Z#PR_CRED изменяется, триггер/функция может не заметить это

Подскажите, плиз, в чем дело?
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеВт Ноя 05, 2013 09:08    Ответить с цитатой
Полезность: Нет оценки
belosheeva_nv пишет:
Подскажите, пожалуйста, как написать триггер на изменение структурного реквизита, например, реквизит C_CLIENT_REQ#1#2 в типе PR_CRED. Написала вот так:
Код:

...Z$CIT_INTERFACE_BCS_LIB_CRED.genOutCredInfo(:old.ID);


При отработке триггера выдается ошибка:

таблица IBS.Z#PR_CRED изменяется, триггер/функция может не заметить это

Подскажите, плиз, в чем дело?

Собственно, скорее всего при вызове функции из пакета Z$CIT_INTERFACE_BCS_LIB_CRED.genOutCredInfo и происходит ошибка.

Скорее всего, в этой функции есть запрос типа
Код:
select что угодно from z#pr_cred какие угодно условия


Ну или что-то такое же.
Можно посмотреть на код функции?
Это раз.

Второе - триггер у вас ... непонятный.

Не понимаю, зачем лезть в счета за идентификатором.
Не понимаю, почему у вас не обрабатывается ситуация, когда счёт был, но его не стало (:old.C_CLIENT_REQ#1#2 is not null and :new.C_CLIENT_REQ#1#2 is null) ну или наоборот.

И третье. Не знаю, применяете ли вы это, но на всякий случай напомню: триггер можно "повесить" на обновление конкретной колонки, тогда при обновлении других колонок он срабатывать не будет.


Последний раз редактировалось: Random (Вт Ноя 05, 2013 09:18), всего редактировалось 1 раз
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВт Ноя 05, 2013 09:11    Ответить с цитатой
Полезность: Нет оценки
belosheeva_nv пишет:

При отработке триггера выдается ошибка:

таблица IBS.Z#PR_CRED изменяется, триггер/функция может не заметить это

Подскажите, плиз, в чем дело?


Почитайте дядю Тома: http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936
belosheeva_nv
Участник


Вступление в Клуб: 01.07.2013
СообщениеВт Ноя 05, 2013 12:34    Ответить с цитатой
Полезность: Нет оценки
Цитата:

Можно посмотреть на код функции?

функция работает нормально, в параметрах у нее ссылка на кредитные договоры.
Цитата:

Второе - триггер у вас ... непонятный.

Не понимаю, зачем лезть в счета за идентификатором.

Потому что необходимо при смене даннойго реквизита передавать ссылку на договор с вышеуказанную функцию.
belosheeva_nv
Участник


Вступление в Клуб: 01.07.2013
СообщениеВт Ноя 05, 2013 12:52    Ответить с цитатой
Полезность: Нет оценки
Код:
Почитайте дядю Тома: http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936


я догадываюсь, что ошибка как раз из-за зависимоти таблиц, но как это оформить в триггере?

Может еще что-нибудь подскажете?
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеВт Ноя 05, 2013 14:24    Ответить с цитатой
Полезность: Нет оценки
belosheeva_nv пишет:
Цитата:

Можно посмотреть на код функции?

функция работает нормально, в параметрах у нее ссылка на кредитные договоры.

Здравствуйте, Капитан!

Я об этом догадался.
Код-то посмотреть можно? Что вы там делаете с этой ссылкой?

Могу предположить, что из таблички z#pr_cred наверное, данные читаете? И/или интерфейсный пакет, который тоже данные из таблички z#pr_cred читает, наверное, вызываете?

belosheeva_nv пишет:
Цитата:

Второе - триггер у вас ... непонятный.

Не понимаю, зачем лезть в счета за идентификатором.

Потому что необходимо при смене даннойго реквизита передавать ссылку на договор с вышеуказанную функцию.

И чем же вас не устроил
Код:
v_old_acc := :old.C_CLIENT_REQ#1#2;
вместо запроса
Код:
select ID into v_old_acc from z#ac_fin where id = :old.C_CLIENT_REQ#1#2;
?
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru