особенности написания триггеров
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 ?
|
Это не суть важно, я поняла, в чем ошибка, обошла по другому, не обращаясь к реквизитам записи, чтобы не дергались интерфейсные пакеты.
Нормальное название... Добавить запись
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
|
|
 |
belosheeva_nv Участник
Вступление в Клуб: 01.07.2013
|
Вт Ноя 05, 2013 12:34   |
|
Полезность: Нет оценки
|
Цитата: |
Можно посмотреть на код функции?
|
функция работает нормально, в параметрах у нее ссылка на кредитные договоры.
Цитата: |
Второе - триггер у вас ... непонятный.
Не понимаю, зачем лезть в счета за идентификатором.
|
Потому что необходимо при смене даннойго реквизита передавать ссылку на договор с вышеуказанную функцию. |
|
 |
belosheeva_nv Участник
Вступление в Клуб: 01.07.2013
|
Вт Ноя 05, 2013 12:52   |
|
Полезность: Нет оценки
|
я догадываюсь, что ошибка как раз из-за зависимоти таблиц, но как это оформить в триггере?
Может еще что-нибудь подскажете? |
|
 |
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; | ? |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|