作者:empty 出版社:empty |
一、Start to End
1、Create new xx.wft file.
用向导新建一个Item Type
P: Workflow Builder/File/Quick Start Wizard
修改New Item Type中Internal Name为CW_DEMO和Display Name为CW_DEMO_R12_TRAINING;
New Process中Internal Name为CW_TOP和Display Name为R12_DEMO_TOP_Process;
另存文件为:CW_WF_DEMO.wft
2、完善此Process
双击CW_TOP Process,可以看到已经有一个Start 和End节点;
然后,右键Start节点,不要放开鼠标,拖到End节点,这样就把这两个点连起来了。
3、Save to DB
I:直接通过Workflow Builder保存到数据库
P: Workflow Builder/File/Save As
点击OK即可(客制开发经常用的方式)
II:Submit request:Workflow Definitions Loader
首先用FTP工具把CW_WF_DEMO.wft上传到应用服务器。
然后到系统管理员职责提交请求。
Mode选Upload,File要写绝对路径!
(上线安装的时候使用)
4、Run Workflow
I:Workflow管理界面
P:System Administrator/Workflow/Administrator Workflow/Home
检查Workflow的管理员:
SELECT wfr.text FROM wf_resources wfr WHERE NAME = 'WF_ADMIN_ROLE' AND wfr.LANGUAGE = 'US';
点击 Run 功能键:
按照上图输入资料:Item Key是本工作流运行的标志;可以理解为保存在数据库中的Item Type的一个标志。User Key是用户看到的实例标志。
点击Submit
II:PL/SQL(Package)启动Workflow
DECLARE
l_item_key VARCHAR2(30) := 'CW_WF_DEMO_002';
l_user_item_key VARCHAR2(30) := 'CW_WF_DEMO_002_UK';
l_item_type VARCHAR2(30) := 'CW_DEMO';
l_process VARCHAR2(30) := 'CW_TOP';
BEGIN
--01 创建
wf_engine.createprocess(itemtype => l_item_type,
itemkey => l_item_key,
process => l_process,
user_key => l_user_item_key);
--02 初始化
--本例不需要
--03 启动
wf_engine.startprocess(itemtype => l_item_type, itemkey => l_item_key);
COMMIT;
dbms_output.put_line(l_item_key);
END;
同样的方式查看Workflow的运行状态:
FORM 等其他地方以同样的方式启动~
5、运行情况查看
P:System Administrator/Workflow/Administrator Workflow/Home
切换到Status Monitor界面,输入关键字查询
选择需要查看的Workflow,进入Status Diagram画面;
绿线表示运行完毕
6、That is all
二、Start—>NotificationEnd
1、把上一节的Item Type拷贝一份作为练习前提
Copy and Paste;新的Internal Name为CW_WF001,Display Name为:CW_WF001_NOTIFICATION
2、新建6个Attribute
P:N: 选中Attribute/右键/New Attribute
Internal NameDisplay NameTypeLength
APPROVER_IDApprover IDNumber
APPROVER_NAMEApprover NameRole
APPROVER_DSP_NAMEApprover Display NameText360
SUBMITER_IDSubmiter IDNumber
SUBMITER_NAMESubmiter NameRole
SUBMITER_DSP_NAMESubmiter Display NameText360
按如上表数据建立Attribute,用来保存提交者和审批者的信息。
Attribute的用法:
Attribute相当于全局变量,供整个Item Type的元素调用;
Attribute作为Notification的执行者;
Attribute作为Function的调用参数;几乎任何PL/SQL函数都需要通过取得Attribute变量--判断Attribute变量--设置Attribute变量,决定程序如何走,返回什么值
3、新建1个Message
P:选中Message/右键/New Message
Internal NameDisplay NameText Body
APPROVAL_REQApproval RequisitionJust for CW Demo
Message from &SUBMITER_DSP_NAME
保存的时候,系统显示找不到我们引用的Attribute:SUBMITER_DSP_NAME
Message 中引用的变量必须在自己的Attribute中。可以手工建立:Message/右键/New Attribute;也可以直接把SUBMITER_DSP_NAME复制到这个Message下面。
4、新建1个Notification
P:选中Notification/右键/New Notification
Internal NameDisplay NameMessage
REQ_APPROVALRequisition ApprovalApproval Requisition
5、修改Process:CW_TOP
把上面建的Notification拖到CW_TOP(R12_DEMO_TOP_Process)中
此时,右键这里的Requisition Approval这个Notification查看属性;按照如下画面设置Performer,也就是通知接收人。
接下来,把原来指向End的箭头左键拖到指向Requisition Approval;再从Requisition Approval右键拖一条线到End,重新布局
6、保存到数据库,启动工作流
先找一个测试的账户:
SELECT r.NAME, r.display_name, r.orig_system, r.orig_system_id
FROM wf_roles r
WHERE r.NAME = 'AIC_CHUCK';
WF_ROLES说明:(Workflow的核心功能之一消息(Notification)发送人只承认此table资料)
Type of RoleOrig_SystemUser_Flag
ERP用户,未和HR中的员工建立关联FND_USRY
ERP用户,和HR中的员工建立关联PERY
不是ERP用户,而是HR中的员工PER_ROLEN
客户/员工HZ_PARTYY
直接插入WF_LOCAL_USERS的记录WF_LOCAL_USERSY
直接插入WF_LOCAL_ROLES的记录WF_LOCAL_ROLESN
职责FND_RESP ID>N
职位PositionPOSN
启动脚本:
DECLARE
l_item_key VARCHAR2(30) := 'CW_WF_DEMO_003';
l_user_item_key VARCHAR2(30) := 'CW_WF_DEMO_003_UK';
l_item_type VARCHAR2(30) := 'CW_WF001';
l_process VARCHAR2(30) := 'CW_TOP';
l_submiter_id NUMBER := 1013536;
l_approver_id NUMBER := 1013556;
l_orig_system VARCHAR2(30) := 'FND_USR';
l_user_name wf_roles.NAME%TYPE;
l_display_name wf_roles.display_name%TYPE;
BEGIN
--01 创建
wf_engine.createprocess(itemtype => l_item_type,
itemkey => l_item_key,
process => l_process,
user_key => l_user_item_key);
--02 初始化
wf_directory.getusername(p_orig_system => l_orig_system,
p_orig_system_id => l_submiter_id,
p_name => l_user_name,
p_display_name => l_display_name);
wf_engine.setitemattrnumber(itemtype => l_item_type,
itemkey => l_item_key,
aname => 'SUBMITER_ID',
avalue => l_submiter_id);
wf_engine.setitemattrtext(itemtype => l_item_type,
itemkey => l_item_key,
aname => 'SUBMITER_NAME',
avalue => l_user_name);
wf_engine.setitemattrtext(itemtype => l_item_type,
itemkey => l_item_key,
aname => 'SUBMITER_DSP_NAME',
avalue => l_display_name);
wf_directory.getusername(p_orig_system => l_orig_system,
p_orig_system_id => l_approver_id,
p_name => l_user_name,
p_display_name => l_display_name);
wf_engine.setitemattrnumber(itemtype => l_item_type,
itemkey => l_item_key,
aname => 'APPROVER_ID',
avalue => l_approver_id);
wf_engine.setitemattrtext(itemtype => l_item_type,
itemkey => l_item_key,
aname => 'APPROVER_NAME',
avalue => l_user_name);
wf_engine.setitemattrtext(itemtype => l_item_type,
itemkey => l_item_key,
aname => 'APPROVER_DSP_NAME',
avalue => l_display_name);
--03 启动
wf_engine.startprocess(itemtype => l_item_type, itemkey => l_item_key);
COMMIT;
dbms_output.put_line(l_item_key);
END;
7、查看执行结果
用HENKEY账户进入系统:
用CHUCK账户进入系统接收通知:
8、That is all
三、含分支处理(Function)的Notification(Form Button提交)
1、用Wizard创建新的Item Type,
Internal Name为CW_WF003,Display Name为CW_WF003_EMP
Process Internal Name为CW_EMP, Display Name为CW_EMP_FORM
2、Create a new look up
P:选中Lookup Type/右键/New
可以直接使用Standard的Lookup Type;如果Standard的不符合要求,可以自己建;
然后增加两个Lookup Codes。
TypeInternal NameDisplay Name
Lookup TypesAPP_TYPEApprove Type
Lookup CodesNONO
YESYES
3、新建3个Attribute
Internal NameDisplay NameTypeLength
EMPNOEmployee noNumber
EMPNAMEEmployee nameText
APPROVERAPPROVERText
4、新建一个Message
Internal NameDisplay NameText BodySubject
MESS_APPApprove Message工号:&EMPNO
姓名:&EMPNAMENew Employee need to approve
Result Display Name:APP_MESSAGE
选择建立的LookUp
把建立的Employee Name 和No加到Message上来~
5、新建一个Notification
在Notification:Requisition Approval属性的Activity标签页,Internal Name为APP_NOTI,Display Name为Approve Notification,Result Type为建立的LookUp
6、新建2个Function
具体值如下:
Internal NameDisplay NameFunction Name
APP_EMPApprove EmployeeXX_WF_EMP_PKG.approve_emp
REJ_EMPReject EmployeeXX_WF_EMP_PKG.reject_emp
7、修改Process的流程
从Standard中拖1个End Function过来,修改他们的Start/End属性为End;
并把建立的Function拉过来,重新布局~
并且要此时要修改Notification的Node属性,增加Performer(此属性只有当Notification布局到Process上的时候才显现)
8、测试
保存到数据库,运行脚本;查看运行状态:
Start.sql
查看Notification结果:
Notification明细:
点击yes按钮,查看工作流
9、That is all~
四、Others
1、Message中的Html Body格式
Your Note: &NOTE
Please Approve The Following Document.
br>
From &SUBMITER_DSP_NAME
br>
Document Number: &DOCUMENT_NUMBER
br>
Document Amount: &DOCUMENT_AMOUNT
&NOTE
2、常用隐藏按钮功能
(1)#HIDE_REASSIGN,可以隐藏标准的Reassign按钮
(2)#HIDE_MOREINFO,可以隐藏标准的Request Information按钮
(3)#HISTORY,可以隐藏标准的Action History
3、审批流程
(1)制作下面的审核流程
(2)流程说明
用PLSQL启动工作流
Create Table,启动工作流时,Insert初始资料
提交者、审核者的初始化放在Initialization节点执行
接收者,接到消息后,对于不同的回复,通过Function Update原来Insert的单据资料
单据ID是来源于Sequence,Item Key 、User Item Key都要通过Sequence自动获取
4、处理超时的Notifications
从Standard Funtion中把Loop Counter 拉到Process中,处理超时为处理的Notification
5、Form提交Workflow
开发Form画面,然后用按钮功能等启动工作流;
6、Workflow 提交Form画面
--格式'FUNCATION_NAME:PARAMETER=VALUE'
--Function_Name如果在系统中不存在,界面上就不会有那个链接
wf_engine.setitemattrtext(itemtype => itemtype,
itemkey => itemkey,
aname => 'OPEN_FORM_COMMAND',
avalue => 'FND_FNDSCAUS');
7、
五、