Professional Documents
Culture Documents
E-BUSINESS SUITE
XX100 –应用技术
给你一个敲门砖之Workflow
Author: 黄建华Jianhua.Huang
MSN: huajhua@hotmail.com
Creation Date: November 22, 2005
Last Updated: November 24, 2005
Document Ref: <Document Reference Number>
Version: DRAFT 1A
Approvals:
<Approver 1>
<Approver 2>
Document Control
Change Record
3
Reviewers
Name Position
Distribution
Note To Holders:
If you receive an electronic copy of this document and print it out, please write your
name on the equivalent of the cover page, for document control purposes.
If you receive a hard copy of this document, please write your name on the front
cover, for document control purposes.
Contents
3. 常用功能和代码块 ................................................................................................... 13
用户: SYSADMIN
1.1. 总体说明
Workflow是Oracle的法宝之一。
Oracle大部分流程的通知和审批控制、账户按规则自动生成都是通过Workflow实现
的。
可以说,和弹性域一样,Workflow是EBS的基础架构技术。
1.2. 必要设置
Workflow Builder安装
选择一个独立的Home。
配置Workflow Builder的tnsnames
按照往常步骤配置tnsnames和hosts。
如果是功能顾问,再看一下补充内容:通常从别人那里把tnsnames拷贝过来就可以,
不过有时候不行;道理很简单,tnsnames.ora和sqlnet.ora两个加起来才构成SQL*Net
协议的基本配置文件,而不同公司的sqlnet.ora可能会不一样;所以把这两个文件全部
拷贝过来就99.99%不会有问题了。
配置Workflow Builder的nls_lang
语言和区域设置成和数据库服务器一样;字符集一般也是一样;如果服务器端为
UTF8,那么就要设置成ZHS16GBK等,看情况而定。
配置服务器端
通常安装完EBS,服务器端就自动配置好了,除了Mail功能。
新版EBS都用基于Java的Notification Mailer。可以参考本文的“Workflow
Notification Mailer Configuration”章节,这里先略过。
新建一个WFT文件
N: Workflow Builder/File/New
深入浅出Oracle EBS 11i Doc Ref: <Document Reference Number>
November 24, 2005
在开发阶段Workflow源代码一般保存在本地,扩展名是wft。我们新建一个工作流文
件,然后保存,假定文件名为:CUX_WF_DEMO.wft。
新建一个Item Type
引用标准Workflow
N: Workflow Builder/File/Open
我们选择从数据库打开,输入APPS用户名和密码及TNSNAME。找到Standard,点击
<<移入Visible区,OK打开。
打开后把Standard这个Item Type拖到我们创建的文件下面。
然后赶紧关闭刚才打开的Standard工作流,以免误操作。N: Workflow
Builder/File/Close Store,在弹出的保存确认界面选择No。
*顺便看下,本地Workflow文件的图标和从数据打开的不一样。
以后在我们的工作流中就可以很方便的使用一些标准的工作流对象了。现在结果如
下:
创建一个Top Process
N: 右键Process/New Process
输入内部名称和显示名称。
实际开发中可以先建立子流程,在建立顶层流程。注意这里的Runnable是选中的,所
以该Process可以运行。一个Item Type下,可以有很多个Runnable的Process。
Process是个流程图,由Notification、Function、子Process组成,开始于一个Start
Function,结束于一个或多个End Function,中间是Notification和Function组成的业
务流程,在这个级别上可以把Notification、Function、子Process看成是一样的即
activity,他们都有返回值,不同的结果走不同的流程,由此组成一个符合业务需要的
图表。
一个Process至少要包含一个Start和一个End节点,所以现在点击保存,会报
Validation Warning,不过还是可以保存到磁盘。
完成一个简单的Top Process
N:
这个时候,要在这里修改一下属性。选中Start节点,右键,选择Property,把
Start/End从Normal改为Start:
同样,把End节点的Start/End从Normal改为End。
然后,右键Start节点,不要放开鼠标,拖到End节点,这样就把这两个点连起来了。
这样,一个最简单的工作流就做好了。结果如下:
方式一:直接通过Workflow Builder保存到数据库
N: Workflow Builder/File/Save As
点OK就行。
方式二:Workflow工具WFLOAD
N: Telnet
首先用FTP工具把Oracle_EBS_11i_WF_DEMO.wft上传到应用服务器,比如
$FND_TOP/install。这里的例子是上传到客户化应用目录:$CUX_TOP/install。
然后运行wfload(注意UNIX区分大小写):
cd $CUX_TOP/install
N: System Administrator/View/Request/Submit
首先用FTP工具把Oracle_EBS_11i_WF_DEMO.wft上传到应用服务器,同上。
然后到系统管理员职责提交请求:
嘿嘿,Mode选Upload,File要写绝对路径,上面的画面用环境变量是有问题的哦!
Item Type放空。
1.5. 先睹为快:一个简单例子.运行
方式一:Workflow管理界面
注意,只有Workflow的管理员用户进来后面才有Run列!
也可以从上面的画面的“Administrator”Tab页查看和设置。
接下来,点击 ,出来:
按照上图内容输入。Item Key是本工作流运行实例的标志;相对的保存在数据库中
Item Type可理解为一个定义或者一个Template。User Key是用户看到的实例标志。
点击Run Workflow。
运行情况查看
选择“Status Monitor”Tab页。输入查询条件查询,出来刚才运行的CUX_DEMO实
例:
点击Status Diagram,可以看到,由于例子太简单已经运行到终点,且都是“绿
线”,说明没有错误:
方式二:PL/SQL启动
N:
DECLARE
l_item_key VARCHAR2(30) := 'CUX_DEMO_002';
l_user_item_key VARCHAR2(30) := 'CUX_DEMO_UK_002';
l_item_type VARCHAR2(30) := 'CUX_DEMO';
l_process VARCHAR2(30) := 'CUX_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;
END;
给你一个敲门砖之Workflow Oracle Workflow基础 10 of 24
File Ref: Oracle EBS 11i应用技术之Workflow.doc (v. DRAFT 1A )
Company Confidential - For internal use only
深入浅出Oracle EBS 11i Doc Ref: <Document Reference Number>
November 24, 2005
既然是PL/SQL,所以在Form等地方也是这样启动的。
接下来和上面的方式一一样去“Status Monitor”Tab页查看了。
2. 其他特性和功能浏览
给你一个敲门砖之Workflow 其他特性和功能浏览 12 of 24
File Ref: Oracle EBS 11i应用技术之Workflow.doc (v. DRAFT 1A )
Company Confidential - For internal use only
深入浅出Oracle EBS 11i Doc Ref: <Document Reference Number>
November 24, 2005
3. 常用功能和代码块
给你一个敲门砖之Workflow 常用功能和代码块 13 of 24
File Ref: Oracle EBS 11i应用技术之Workflow.doc (v. DRAFT 1A )
Company Confidential - For internal use only
深入浅出Oracle EBS 11i Doc Ref: <Document Reference Number>
November 24, 2005
$FND_TOP/admin/sql下有Workflow管理和诊断脚本。
4.1. Basic
设置步骤
目录服务
Worflow的核心功能之一就是消息(Notification),要发消息,当然要有接收人,这
个接收人可能是一个user、一个employee、一个Responsibility、一个客户、一个职位
等等。
在EBS中这些接收人分散在各个模块的各个表中,而Worflow Engine仅承认WF_表中
的接收人。
接收人分用户和角色,角色包含一个或多个用户,对应的视图为
wf_users/wf_roles/wf_user_roles。如果消息的接收人为职责,那么这个职责下的所
有用户都会收到消息。这个好理解,不多说。
下面以EBS的登录user为例。
1. 原来存储的表为:fnd_user,假定这里面有个用户User_Name为huajhua,User_ID
为1001
2. 对应一个按照目录服务格式要求的视图:wf_fnd_usr_roles
3. WF Bulk Synchronize Local Tables请求会把wf_fnd_usr_roles的数据同步到
wf_local_roles中,orig_system字段标志为fnd_usr
4. 如果以后我们要发通知给huajhua,那么通过API可以获得该用户:
WF_DIRECTORY.GETROLENAME(‘FND_USR’, 1001,x_name,x_displayname)
值得一提的是如果User和Employee关联了,那么orig_system将是PER。举几个例
子:
Type of Role Orig_System User_Flag
ERP用户,未和HR中的员工建立关联 FND_USR Y
ERP用户,和HR中的员工建立关联 PER Y
不是ERP用户,而是HR中的员工 PER_ROLE N
客户/员工 HZ_PARTY Y
直接插入WF_LOCAL_USERS的记录 WF_LOCAL_USERS Y
直接插入WF_LOCAL_ROLES的记录 WF_LOCAL_ROLES N
职责 FND_RESP<ID> N
职位Position POS N
所以,总的来说,Workflow的目录服务就是收集用户和角色信息,以统一的格式提供
给Workflow消息系统使用。包括:
1. 一套本地表:WF_LOCALXXX
2. 一套实际使用的视图:WF_USERS/WF_ROLES/WF_USER_ROELS
3. 一套各来源视图:WF_<Orig_System>_ROLES
4. 一个批量同步请求集:Synchronize Workflow LOCAL tables(增量同步需要安装
Patch,请看Notes171703.1)
5. 一套API:WF_DIRECTORY
Table Partition
随着业务的增长和历史数据的增多,有几个工作流的表会越来越大,如果不进行分
区,其性能(DML和Export/Import)是比较糟糕的。默认情况下,只有目录服务的
几个表是按来源分区过的;其他的表,需要运行
%FND_TOP%/admin/sql/wfupartb.sql来分区。值得一提的是,wfupartb.sql本身是
需要分区的表和索引为:目录服务表、WF_ITEM_ACTIVITY_STATUSES及索引、
WF_ITEM_ACTIVITY_STATUSES_H及索引、WF_ITEM_ATTRIBUTE_VALUES及
索引、WWF_ITEMS及索引。以WF_ITEM_ATTRIBUTE_VALUES为例,它保留的是
工作流实例的各个属性值,华为在Purge之后这个表仍然有7000万条记录,Export这个
表要37个小时。
以下SQL用来查看分区情况:
SELECT t.owner, t.table_name, t.partitioned
FROM all_tables t
WHERE t.table_name LIKE 'WF%'
ORDER BY t.partitioned
Directory Service
如果我们加了个fnd user,但没跑这个同步程序(可能是还没到计划时间),那么
Workflow并不知道有这个用户存在,这就导致为什么有“我跑过了Fill Employee
Hierarchy,为什么通知还是没发到XXX”的问题。实际上,对于通知没发到XXX的问
题,有如下原因:
1. 程序错误,没有设置正确的Notification Performer
2. 如果是PO,可能没跑Fill Employee Hierarchy
3. 一个Employee分配给了多个User,那么其实只有第一个User收到了消息
4. 数据还没有同步到Workflow,即没跑Synchronize Workflow LOCAL tables
Background Engines
如果我们Schedule了该请求,但有时候等不及,也可手工提交;下面的例子是最常见
的处理销售订单行Defer的请求:
Global Preferences
定义Workflow全局参数。仅需关注两个参数。
N: SYS/Workflow/Global Preferences
WF_RESOURCE环境变量用于存储指向Workflow资源文件,EBS的资源文件为
%FND_TOP%/%APPLRSC%/wf<language>.res,不需要设置该变量。
目前,Oracle Workflow支持SMTP协议(默认端口是25)处理出站消息、IMAP4协议
(默认端口是143)处理进站消息,这也是Oracle Workflow对Mail服务器的要求。可
以使用Microsoft Exchange作为Mail服务器,简单点,我们使用Imail。
Imail设置
1. 按照默认选项安装Imail
2. 启动Imail的服务:SMTP/IMAP/Queue Manager/POP3
3. 创建Notification Mailer需要的用户,假定是wfmail;另外再建一个测试账号
huajhua
4. 用邮件客户端(文档说必须,所以我用Imail自带的Client)给wfmail创建三个目
录:INBOX、PROCESS、DISCARD
进入Workflow的配置管理界面
1. 进入OAM,需要有System Administrator职责:
3. 进入Service Components管理界面
启动两个Container服务
* 这两个玩意儿其实是Concurrent Manager的两个Adminster。启动这两个服务后,到
系统中去看,这两个Administer也起来了。
参考设置:
Parameter Value 说明
0 表 示 没 有 Inbound 消 息 , 这 样 就 不 要 求
Inbound Thread Count 0
Mail服务器支持IMAP4
Inbound EMail Account
Server Name huajhua 邮件服务器
User Name wfmail 用户名
Password wfmail 密码
Outbound EMail Account
Server Name huajhua 邮件服务器
User Name wfmail 用户名
Test Address test@huajhua
Send
Reply-to Address wfmail@huajhua
第7步是测试,一定要从LOV里面选一个角色,Oracle会按照这个角色的
“Notification Style”给前面设置的Test Address发一个通知,请记住ID号。
测试角色有两个要求:emali地址(随意)、mail类型的Notification Style。否则mail
无法正确发到Test Address。
测试
用客户端收test@huajhua的信,看ID号就可以知道是第7步测试步骤发来的;最直接就
是在Imail的管理器里面看相应用户的邮箱是否有东西。
Open Issues
Closed Issues