3. Create a function activity
• 使用WFB打开wfdemo.wft文件, 在导航窗口的函数节点下面添加一个新
的节点, 该节点重要的属性有Function Name和Result Type:
Function Name
指定为某个plsql存储过程, 格式为<Package>.<Procedure>
Result Type
指定为某个Lookup Type名称, 这里选择
WFSTD工作流中的Boolean, 它有两个值
T和F分别表示true和false. Result Type
决定了函数节点之后的会有哪些分支
(T/F), 工作流过程在执行时会返回
Result Type中的某个值, 如果返回T则
流程沿着T分支往下走, F则走F分支.
4. Workflow Procedure
- API Standard
• 创建函数节点时指定的过程由工作流引擎调用
(Wf_Engine_Util.Function_Call), 它必须遵循如下的格
式:
procedure <procedure name> (
itemtype in varchar2,
itemkey in varchar2,
actid in number,
funcmode in varchar2,
resultout out varchar2) is...
工作流引擎在执行过程时, 会传入当前的item type,
item key, 活动id, 模式以及结果参数, 过程中需要对
funcmode进行判断从而决定具体执行哪些操作.
• 参考附件中的wf_function_template.sql, 该脚本包含
了工作流过程的编写模板.
6. Workflow Procedure
- wfdemo.find_approver
• wfdemo.find_approver用于根据申请人(LEAVEREQUSTER)工作流属性, 找到该
申请人的上级主管, 并设置为审批人(LEAVEREQAPPROVER)工作流属性. 需要
建一个plsql包wfdemo还它下面的子过程find_approver, 代码如下(可以在附
件中找到):
create or replace package body wfdemo as
procedure find_approver(itemtype in varchar2,
itemkey in varchar2,
actid in number,
funcmode in varchar2,
resultout out varchar2) as
v_manager VARCHAR2(30);
v_employee VARCHAR2(30);
begin
IF funcmode in ('RUN', 'RETRY') THEN
v_employee := wf_engine.getItemAttrText(itemtype, itemkey,
'LEAVEREQUSTER') ;
7. Workflow Procedure
- wfdemo.find_approver
select c.user_name into v_manager
from fnd_user a, per_all_assignments_f b, fnd_user c
where a.user_name = v_employee
and a.employee_id = b.person_id
and b.effective_end_date > sysdate
and b.supervisor_id = c.employee_id;
END IF;
IF v_manager is null THEN
resultout := 'COMPLETE:F';
ELSE
wf_engine.SetItemAttrText(itemtype, itemkey, 'LEAVEREQAPPROVER', v_manager);
resultout := 'COMPLETE:T';
END IF;
EXCEPTION WHEN OTHERS THEN
resultout := 'ERROR:' || sqlcode;
WF_CORE.CONTEXT('wfdemo', 'find_approver', itemtype, itemkey, to_char(sqlcode));
raise;
end wfdemo;
8. Run
- Normal
• 添加函数节点之后流程看起来如下, 如果找
到了审批人则向他发送通知, 如果没有则结
束流程:
• 在WAP页面中启动该流程并将申请人设置为
OPERATIONS:
9. Run
- Normal
• 在状态监控页面查看该流程的运行情况, 如
下:
可以看到函数节点运行完成, 并且已经发出
FYA通知, 使用如下sql可查找通知的收件人:
select * from wf_item_activity_statuses
where item_type = 'LEAVEREQ' and item_key = '6‘
接下来的流程就于之前的一样了.
10. Run
- Error
• 如果在启动流程时没有指定申请人工作流参
数(LEAVEREQUSTER), 那么函数节点在执行过
程中会因为select...into语句抛出no data found
异常, 进而导致节点出错, 如下: