Данная статья описывает процесс создания workflow процесса для отправки уведомления.
Версия Oracle Workflow Builder 2.6.3.5
1 Создание нового Workflow
Открываем Oracle Workflow Builder
Открываем файл WF\DATA\US\WFSTD (находится в директории установленного workflow)
2 Создаем новый Item Type
- Заполняем поля:
- Internal Name: XX_DEMO
- Display Name: XX Demo
- Description: Тестовый пример
3 Создаем новый Process
- Заполняем поля:
- Internal Name: XX_DEMO_PROCESS
- Display Name: XX Demo process
- Description: Тестовый пример
4 Создаём Attrubute
- Заполняем поля:
- Internal Name: P_NUMBER
- Display Name: Number
- Description: Число
- Type: Number
- Заполняем поля:
- Internal Name: P_TEXT
- Display Name: Text
- Description: Текст
- Type: Text
- Lenght: 400
5 Заполняем логику процесса
Выполняем double click по иконке процесса, откроется окно содержания процесса
Теперь необходимо создать функции Start и Stop. Их можно создать вручную или же перетащить из workflow Standart
Открываем свойства функции Start и переходим на вкладку Node
Для свойства Start/End выставляем значение Start.
Открываем свойства функции End,переходим на вкладку Node, для свойства Start/End выставляем значение End.
6 Создаем Message
- Заполняем поля:
- Internal Name: XX_FIRST_MESSAGE
- Display Name: XX First Message
- Description: Тестовое сообщение
Переходим на вкладку Body и заполняем текст сообщения
Непосредственно в сообщение надо перетащить атрибуты.
7 Создаем Notification
- Заполняем поля:
- Internal Name: XX_FIRST_NOTIFICATION
- Display Name: XX First Notification
- Description: Тестовое уведомление
- Message: XX First Message
Помещаем уведомление в процесс
C помощью стрелочек задаем последовательность действий. Стрелки создаются с помощью правой кнопки мыши.
Открываем свойства уведомления и задаем получателя.
Получателем можно устанавливать недосредственно USER_NAME или же роль.
8 Сохраняем Workflow
Можно сохранить на локальный компьютер (затем загрузить в базу через wfload), а можно сразу в базу.
9 Запуск Workflow
Запуск workflow из pl/sql
DECLARE p_itemtype varchar2(100) := 'XX_DEMO'; p_itemkey NUMBER := 1; -- уникальный id, должен меняться BEGIN wf_engine.threshold := 2; wf_engine.createprocess(p_itemtype, p_itemkey, 'XX_DEMO_PROCESS'); --set the attribute values in workflow so that you can use them in notifications wf_engine.setitemattrtext(p_itemtype, p_itemkey, 'P_NUMBER', 1); wf_engine.setitemattrtext(p_itemtype, p_itemkey, 'P_TEXT','А роза упала на лапу Азора'); -- start the workflow process wf_engine.startprocess(p_itemtype, p_itemkey); -- для немедленной обработки workflow wf_engine.background(p_itemtype); END;
10 Просмотр уведомления
Полномочия Системный администратор. Поток операций : Поток операций администратора: Уведомления
Для того, чтобы уведомление приходило на почту — назначить пользователю сотрудника; заполнить email сотруднику; в параметрах пользователя установить Стиль электронной почты — Сообщения HTML с вложениями.
не подскажете как привязать уведомление к потоку операций
надо чтоб в конце потока (статус строк станет «закрыто») отправлялись уведомления менеджерам
@Надежда
Находите стандартный workflow для вашего процесса, далее:
1) Копируем его, создавая кастомный workflow. Теперь мы можем менять наш вновь созданный workflow как хотим.
2) Добавляем в нужном месте уведомление, как описано в статье.
3) В настройках модуля меняем вызов стандартного workflow на наш.
4) Уведомление настраиваем либо на конкретного пользователя или на роль.
ИЛИ более простой способ, но менее рекомендованный (Oracle позволяет). Если отсутствует явная форма настроки вызова нужного workflow, то
1) Сохраняем исходную версию workflow, для backup’a.
2) Меняем процесс, добавляя нужные уведомления.
3) Сохраняем workflow в базе.
Можно вопрос, есть какой — либо способ убрать (сделать не активной) конопочку на форме уведомления. А конкретно кнопку «Переназначение»?
@strAnger
Вот что говорит нам Developer’s Guide 2.6.4:
You can use a special message attribute with the internal name #HIDE_REASSIGN to
hide the Reassign button in the Notification Details Web page
Создал тестовое уведомление. На уровне message добавил атрибут #HIDE_REASSIGN со значением «Y».
В результате кнопка «Переназначение» перестала отображаться.
Следует так же помнить, что если на пользователе висят права админа workflow (назначены конкретно на него или стоят для всех «*»), то кнопка «Переназначение» будет доступна всегда.
@rudev
Реально помогло, большое спасибо, буду теперь часто вопросы задавать ))
Можно еще один вопрос, а где редактируются права Админа workflow? Просто попробывал на тестовой базе кнопка исчезла, на реальной — нет. Заранее спасибо!
@strAnger
System Administrator — Workflow : Administrator Workflow — Administration
ДА и лучше наврено ставить value = ‘B’, что бы делегирование прав продолжало работать, а то с ‘Y’ перестает…
Подскажите пожалуйста, а если «Открываем файл WF\DATA\US\WFSTD (находится в директории установленного workflow)» — данного пути нет. но я 100% знаю что у нас workflow используется для утверждения документов, Где мне можно найти Oracle Workflow Builder???
@Мария
Oracle Workflow Builder надо устанавливать отдельно на клиент.
Скачать его можно через металинк:
How To Download and Install the Latest Oracle Workflow Builder (Client Tool) and XML Gateway Message Designer for E-Business [ID 261028.1]
спасибисимус!!! хочется героев-помощников знать по имени ) нигде не нашла как зовут автора данного блога. На мой взгляд один из лучших русскоязычных сайтов по OEBS. Спасибо Вам .
Подскажите, пжлста, есть ли возможность отключить стандартную рассылку уведомлений на e-mail для определенного потока операций?
Суть проблемы — для кастомного потока настроена кастомная рассылка уведомлений на e-mail (более информативная, нежели стандартная), при этом приходит еще и стандартное уведомление (которое хотелось бы отключить для данного потока).
@Гена
Если нет возможности настройками отключить вызов стандартного workflow, то можно зайти непосредственно в wf процесс в билдере и перекинуть стрелки минуя рассылку уведомления.
Доброго времени суток!
Дело в том, что у нас настроен кастомный процесс, пользователю приходит уведомление с двумя кнопками (Утвердить/Отклонить), но при делегировании этих кнопок у конечного пользователя (зама) нет. Не подскажете как их добавить?
Заранее спасибо!
@Arhangel
А добавлен атрибут #HIDE_REASSIGN (#WF_REASSIGN_LOV)?
@rudev
Нет, атрибутов #HIDE_REASSIGN нет вообще
Добрый день! Ну как, вариантов нет?
@Arhangel
А если зайти под админом workflow (назначены конкретно на пользователя или стоят для всех “*”), кнопка видна? Если нет, то возможно персонализацией скрывается.
@rudev
Это назначено на SYSADMIN.
Я извиняюсь, но суть проблемы я описал не верно. Дело в том, что кнопки отсутствуют когда заму предоставляется доступ к рабочему списку начальника и зам переключает пользователя.
И еще вопрос, на скрине:
Опять))
@Arhangel
Можно почитать здесь
«Oracle Workflow Developer’s Guide: Allowing Access to an Object
Подскажите, пожалуйста:
Как в Сведении об уведомлении в Строках Заявки вместо одного поля вывести другое.
Attribute =’REQ_LINES_DETAILS’. В пакете PO_WF_REQ_NOTIFICATION пробовала менять, но ничего не получается
Доброго времени суток! Подскажите, пожалуйста, как можно сделать так, чтобы в одном конкретном процессе уведомления типа FYI не закрывались в рабочем списке после отсылки на e-mail, если в notification mailer при этом стоит галка автозакрытия таких уведомлений?
День добрый!
Может подскажите такой вопрос?
Создаю рассылку адресатам из селекта
чтобы зациклить этот процесс добавил в Вашем примере функцию у которой Result Type назначил Логический. От этой функции отправил стрелки с Истина на Notifiction и соответсвенно обратно.
Для функции создал процедуру, которая по счетчику (CURRENT_TARGET) выбирает адресата из селекта
procedure built_list_forsend(itemtype in varchar2, itemkey in varchar2, actid in number, funcmode in varchar2, resultout out nocopy varchar2) is
l_cnt number; l_user_name varchar2(30); l_sends varchar2(150); cnt_trg number;
begin
l_cnt:= wf_engine.GetItemAttrNumber(
itemtype => itemtype,
itemkey => itemkey,
aname => ‘CURRENT_TARGET’);
l_user_name:= wf_engine.GetItemAttrText(
itemtype => itemtype,
itemkey => itemkey,
aname => ‘TMP1’);
for i in(
select rownum rn, user_name, full_name
from xxt.xx_tableA a1
where level between 2 and 3
connect by prior kurator_id = person_id
and kurator_id != person_id
start with user_name = l_user_name
)
loop
if l_cnt = i.rn then
wf_engine.SetItemAttrText(itemtype, itemkey, ‘EMAIL_ASG’, i.user_name);
end if;
end loop;
if l_cnt > cnt_trg or l_cnt > 8 then resultout := ‘COMPLETE:F’; else resultout := ‘COMPLETE:T’; end if;
exception when others then resultout := ‘COMPLETE:F’;
end built_list_forsend;
Для Notification создал свою процедуру которая счетчик увеличивает на 1.
procedure plus_level(itemtype in varchar2, itemkey in varchar2, actid in number, funcmode in varchar2, resultout out nocopy varchar2) is
l_cnt number;
begin
l_cnt:= wf_engine.GetItemAttrNumber(
itemtype => itemtype,
itemkey => itemkey,
aname => ‘CURRENT_TARGET’);
wf_engine.SetItemAttrNumber (itemtype, itemkey, ‘CURRENT_TARGET’, l_cnt + 1);
end plus_level;
Вроде кажется все должно крутиться, но результат обескуражил
Notification создает уведомление, но WF_SYSTEM тут же этот NOTIFICATION_ID отменяет… и в результате никто сообщения не получает..
Не подскажите, с чем может быть связано?
@Сергей
Я так понял требуется разослать параллельные уведомления? в этом случае можно сделать отдельный процесс, и вызывать его в цикле, передавая адресата.
Добрый день!
В общем приблизительно так я и поступил.. жаль нельзя приложить картинки…
Проблема вот в чем — все созданные сообщения сразу откатываются процессом WF_SYSTEM в статус CANCEL.
или лучше так запрос после отработки WORKFLOW
select STATUS, MAIL_STATUS
from apps.wf_notifications
where NOTIFICATION_ID = 999999
вместо
OPEN MAIL
возвращает
CANCELED NULL
А запрос
select c.sequence h_sequence, c.to_role h_to_role, c.to_user h_to_user,
wf_core.translate (c.action) h_action, c.user_comment h_comment, c.comment_date h_action_date, c.action, ias.process_activity
from apps.wf_item_activity_statuses_h ias, apps.wf_comments c
where ias.item_type = ‘XX01’
and ias.item_key = 1905
and ias.notification_id = c.notification_id
выдает странный результат
58 USER-1 Станислав Отправить 26.01.2016 17:01:02 SEND_FIRST 218559
59 WF_SYSTEM Поток операций: система Отмена 26.01.2016 17:01:02 CANCEL 218559
Из чего и возникло предположение о блокировке процесса. Но как это событие обойти бьюсь третий день…
@Сергей
Есть следующий метод рассылки параллельных уведомлений:
1. Создаем еще один процесс, скажем XX_SUBPROCESS, в котором и будет осуществляться рассылка уведомлений. Переносим туда из основного процесса все, что касается отправки и обработки ответов.
В общем случае первой операцией нового процесса(после Start-a) и будет отправка уведомления.
2. В основном процессе вызываем функцию, которая в цикле стартует этот процесс для каждого получателя
3. В итоге для каждого получателя имеем свой экземпляр процесса, который отправляет уведомление и обрабатывает ответ.
Всем день добрый!
cranium спсб за предложенный вариант, я его попробовал он рабочий, и действительно письма отправляются в этом случае. Но есть два момента, возможно я, что-то не правильно сделал, но подпроцессы запускаются если выполнен запуск основного процесса, уже следующего. Т.е. письма от предыдущего процесса-подпроцесса, запускаются если выполнен другой — новый процесс с новым itemkey, иначе в потоке операций не видно, что все процессы от старого завершены. Причем, поля в потоке операций Начато и завершено отображаются со временем основного процесса уже после запуска нового процесса. Но их не видно, пока не запущен новый процесс. И письма приходят с задержкой.
И второй, важный момент, мне сказано, что не удобно контролировать выполнение рассылок в потоке когда несколько процессов. Тут еще играет роль не просто отправить, но и еще отслеживать через поток операций.
Если есть возможность подсказать, чтобы было без создания подпроцессов, очень бы выручило..
Я постараюсь сейчас приложить картинку..
К сожалению приложить рисунок не получилось
могу приложить только ссылку, вдруг она поможет раскрыть, что пытаюсь сделать..
https://cloud.mail.ru/public/G1bo/tAiFTrQ9P
@Сергей
Что касается неудобства дочерних процессов: указывая им родителя(при запуске), мы добиваемся того, что в списке потоков операций появляется соответствующая иконка в колонке «Дочерние потоки операций», и можно увидеть всех дочек.
По первой части вопроса не очень понял. Основной процесс должен только лишь запустить подпроцессы и на этом завершиться.
Всем добрый день!
cranium Спсб, предложенный метод, действительно работает, очень благодарен.
И все же, если вернутся к картинке
https://cloud.mail.ru/public/G1bo/tAiFTrQ9P
может такой подход иметь рабочее решение?
При запуске WF процесса определялся атрибут с адресом для отправки первого сообщения и атрибут по которому определялось число выполнения цикла.
Далее в DEFINE_RECJPT по запросу генерился новый адрес.
Напомню, проблема в нем заключалась в том, что сообщения отправлялись, но не доходили до адресатов.
По завершении процесса, когда смотрел ID отправленного сообщения
select STATUS, MAIL_STATUS
from apps.wf_notifications
where NOTIFICATION_ID = 999999
вместо
OPEN MAIL
получал
CANCELED NULL
Нет, насколько я знаю, такой подход не будет работать. Попадая второй раз в XXTNTF01 предыдущая операция по отправке уведомления закрывается — это вроде стандартное поведение.
cranium
Спсб, до ответа верил, что должно было работать… просто где-то что-то не включил..
вроде схема самая простая и вроде все на поверхности…
еще раз огромное спсб…
Добрый день! господа просьба в инструкцию добавить информацию о заполнении след. полей:
а) Владелец потока операций
б) От кого отправлено сообщение — на первом уведомлении его нет, по этой инструкции…:
1) ) Для того чтобы исправить владельца потока операций, как оказалось надо при запуске его указать =))
wf_engine.createprocess(p_itemtype, p_itemkey, ‘название потока’, null, fnd_global.user_name);
2) От кого отправлено сообщение:
а) через workflow builder создать свой атрибут (attributes). — создал автор запроса (REQUESTOR)
б) Создать в Messages свой атрибут с обязательным названием #FROM_ROLE.
значения выбирать из item attributes
у меня это автор запроса, type- Роль
в) в процедуре вызова заполнить этот атрибут с ФИО. , т.е. так :
wf_engine.setItemAttrText(p_itemtype, p_itemkey, ‘REQUESTOR’, wf_directory.GetRoleDisplayName(fnd_global.user_name)