Oracle+Workflow实例详解

信息技术最佳实践

ORACLE核心应用技术

工作流管理

Workflow实例详解

Author: 黄建华

Creation Date: April 17, 2007

Last Updated: July 29, 2013

Document Ref:

Version: DRAFT 1A

Approvals:

Copy Number _____

Document Control

Change Record

Reviewers

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

Document Control .................................................................................................................. i i 1.Oracle Workflow基础.. (2)

1.1.工作流概述 (2)

1.2.必要设置 (7)

1.3.先睹为快:一个简单例子.Start to End (8)

1.4.先睹为快:一个简单例子.Save to Database (13)

1.5.先睹为快:一个简单例子.运行 (14)

2.其他特性和功能实例 (18)

2.1.第2个例子:Notification (18)

2.2.第3个例子:Lookup Types和分支处理Function (23)

2.3.第4个例子:Loop、Timeout、Defer和Workflow Background Process .. 35

2.4.第5个例子:Wait、Wait/Continue Process (41)

2.5.第6个例子:Document、Forms、Function Result、隐藏标准按钮 (48)

2.6.第7个例子:常用的#变量 (53)

3.常用代码块 (54)

3.1.邮件发送过程 (54)

3.2.Startup (54)

3.3.Notification (55)

3.4.Notification的Item Type、Item Key、Activity ID (56)

3.5.Active节点和当前属性值 (56)

3.6.Retry和Skip (57)

https://www.360docs.net/doc/657591060.html,plete (57)

3.8.处理Defer (58)

3.9.建立父子关系 (58)

3.10.Document和Forms (58)

3.11.Test工作流 (60)

3.12.Cancel/Abort工作流 (60)

3.13.Purge工作流实例/定义 (60)

3.14.最新n条Notification (61)

3.15.等待发送Mail的Notification (61)

3.16.清理Notification (61)

3.17.Queue相关 (62)

3.18.查找某用户是否具有某职责 (62)

3.19.WF服务组件 (62)

3.20.未完待续 (63)

4.审批路径 (64)

4.1.客户化表 (64)

4.2.员工上下级 (64)

4.3.职位层次 (64)

4.4.OAM/AME (64)

5.Workflow Notification Mailer Configuration (68)

5.1.Basic (68)

5.2.Database Layer (70)

5.3.Application Layer (70)

5.4.System Layer (71)

5.5.Notification Mailer (72)

6.常见问题 (76)

6.1.问题记录 (76)

7.Open and Closed Issues for this Deliverable (78)

Open Issues (78)

Closed Issues (78)

1.Oracle Workflow基础

职责:System Administrator

用户: SYSADMIN

1.1.工作流概述

工作流在EBS中的地位

Workflow是EBS的基础架构技术之一,系统中大部分流程性的通知和审批控制、账户

按规则自动生成都是通过Workflow实现的;R11i之后,模块间的协调,有一小部分也

是通过Workflow的Business Event完成的。

每种技术都有自己的特点和应用方向,仔细阅读下表,我们可以体会何种场景该使用

Workflow。

Workflow满足的四个重要商业需求

1、发送通知

Workflow可以发送两种类型的通知:消息性通知,如“你的申请被审批了”,不需要

接收者做出任何响应;回应式通知,如“GL日记账需要你的审批”,接收者需要做出

相应的Response,工作流才能继续前进。

通知除了在系统中可以查看、处理外,也可以通过Mail查看、处理;可以本人处理,

也可以转交他人处理。

2、流程定义

Workflow正如它的字面含义,其专注于“工作流”的定义,用Workflow将如下“活

动”组织成一个个业务蓝图,将是非常直观和容易的:基于PL/SQL的任何处理、基于

AQ的通知、关联流程的等待与启动、瓶颈节点的超时处理。

如果能够将企业业务科学的分解至合理的粒度——子流程,那么不同业务在IT上的实现,就是将这些子流程有机的组合在一起。比如,销售订单工作流中的每一个子流程,是Oracle对销售业务分析后分解出的最佳粒度,不同企业可选择既有的流程组合,亦可重新组装。

3、系统自动化

信息系统的自动化,是离不开信息流的,所以Workflow是天然的自动化工具,上面的流程定义,实际上亦可看作流程自动化,Worflow的极致就是Automation。

4、系统间集成

如果把企业运作看作“当发生某个A事件时,需要我们作出一个或者一连串响应”,那么就可以理解,Oracle为什么将Workflow的“业务事件系统”置于系统间集成的地位——包括与业务伙伴的集成。

比如,S系统产生了一笔出库,需要在D系统完成订单的发运和开票,我们有很多种方案来实现,如果用“业务事件系统”,那么S系统只要向D系统发送一个消息说“我做了一笔出库”,D系统将自动触发“订单的发运和开票”操作。

因为消息的发送,实际上是基于Oracle AQ这个现成、可靠的系统,S和D系统不需要时时连线;因为消息的处理是由“业务事件系统”根据“订阅关系”自动调度的,D系统也不需要不断的问S系统,你有没有数据。

下面继续列举的,是利用Workflow的特性,进行的信息系统开发应用。

5、并行处理

如果有10000张订单需要同时处理,那么最好考虑并发,否则性能将糟糕透顶。在EBS 环境下有3种选择,一是不推荐使用的Job,二是推荐使用的并发请求,三是Workflow,尤其适用于处理过程中可能需要稍作停顿,等待某种干预的时候。

6、异步执行

同步执行,意味着,如果一个耗时的处理不完成,程序将停止响应,尤其是UI界面,如果长时间“不许动”,绝对导致使用者的反感。

如果这个耗时的动作,和用户目前的操作关系不大,可以放到后台慢慢去运行,那么就可以获得非常好的“系统响应时间”,在EBS中可以通过提交一个并发请求或者启动一个工作流来实现这种异步执行。

Workflow在EBS中的应用

下表按模块列举了EBS中的部分工作流:

下面的SQL可以查当前系统中所有的工作流:SELECT https://www.360docs.net/doc/657591060.html,, t.display_name, t.description FROM wf_item_types b, wf_item_types_tl t WHERE https://www.360docs.net/doc/657591060.html, = https://www.360docs.net/doc/657591060.html,

AND https://www.360docs.net/doc/657591060.html,NGUAGE = 'ZHS'

ORDER BY1

具体实例

1、GL日记帐审批流程

2、COGS销售成本帐户生成

工作流的演进

R10.7 Flex Field builder 流程组织型

R11 Workflow 2.03 流程组织型

R11i Workflow 2.6 流程组织型 + 事件驱动型

Workflow的体系结构

简单的体系结构图:

1.2.必要设置

下载

https://www.360docs.net/doc/657591060.html,/technology/software/products/workflow/index.html。

这里有Workflow Builder和独立版本的Workflow Server。

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等,看情况而定。

配置服务器端(Embedded)

通常安装完EBS,服务器端就自动配置好了,除了Mail功能。

新版EBS都用基于Java的Notification Mailer。可以参考本文的“Workflow

Notification Mailer Configuration”章节,这里先略过。

配置服务器端(独立版本)

先装好数据库如9i,然后根据说明安装Workflow Server。

我最初学习Workflow的时候就是用8i数据库加独立版的Workflow Server。下面是我当

初的一些笔记:

根据Server安装指南一般可以完成Workflow Server的配置。按我的经验,有几个地方需要注意

1、可以直接使用8i的http,不用安装IAS,根据Server安装指南配置httpd.conf的别名即可;http服

务起不来的可能情况2、

httpd.conf语法错误,这个没什么好说的

之前的服务没有正常结束,一般重新启动计算机即可;或者杀掉java进程,如果有的话

新安装了Oracle其它产品,导致路径引用错误;我的解决办法是把新安装软件在环境变量

Path中添加的路径移到最后

如果要看httpd为何无法启动,查看Log是没用的;应该先运行CMD,然后cd到需要的目

录,输入apache.exe,这个时候就会有错误出现

2、Notification默认的配置是html email,这个时候易遇到Notification就报错,因为我们自己一般

没有配置Mail服务器,所以需要在Global Workflow Preferences里面把Send me electronic mail

notifications设置为Do not send me mail

3、开始我没有配好Business Event System,在执行Approve等动作的时候老是No Data Found;后

来我根据Error Stack找到wf_xml包,把里面的RemoveNotification的Raise语句注释掉就可以了。嘿

嘿,反正我是自己研究工作流,无所谓了

4、我的系统是XP Home SP1,没有JVM,无法View Diagram;装了JDK,不太好用,卸掉装

msjavx86.exe一切正常。

1.3.先睹为快:一个简单例子.Start to End

新建一个WFT文件

N: Workflow Builder/File/New

在开发阶段Workflow源代码一般保存在本地,扩展名是wft。我们新建一个工作流文

件,然后保存,假定文件名为:CUX_WF_DEMO.wft。

新建一个Item Type

N: Workflow Builder/Edit/New/Item Type

Item Type是个抽象的概念,为方便理解,可以看作就是一个工作流。

Internal Name相当于Code,在程序中经常用它来标志一个工作流;Display Name相当于User Name。

引用标准Workflow

N: Workflow Builder/File/Open

我们选择从数据库打开,输入APPS用户名和密码及TNSNAME。找到Standard,点击<<移入Visible区,OK打开。

打开后把Standard这个Item Type拖到我们创建的文件下面。

然后赶紧关闭刚才打开的Standard工作流,以免误操作。N: Workflow

Builder/File/Close Store,在弹出的保存确认界面选择No。

*顺便看下,本地Workflow文件的图标和从数据打开的不一样。

*实际开发中,我们有必要再建立一个自己的Standard。

以后在我们的工作流中就可以很方便的使用一些标准的工作流对象了。现在结果如下:

创建一个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:

双击Demo Top Process,可以看到,里面什么都没有。需要加入一些元素。

从下面的Standard下的Function中,把Start和End拖到打开的Demo Top Process中,结果如下:

这个时候,要在这里修改一下属性。选中Start节点,右键,选择Property,把Start/End从Normal改为Start:

同样,把End节点的Start/End从Normal改为End。

然后,右键Start节点,不要放开鼠标,拖到End节点,这样就把这两个点连起来了。

这样,一个最简单的工作流就做好了。结果如下:

1.4.先睹为快:一个简单例子.Save to Database

方式一:直接通过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

WFLOAD apps/apps 0 Y UPLOAD $CUX_TOP/install/CUX_WF_DEMO.wft

如果有问题,可以查看.log文件。

方式三:请求Workflow Definitions Loader

N: System Administrator/View/Request/Submit

首先用FTP工具把CUX_WF_DEMO.wft上传到应用服务器,同上。

然后到系统管理员职责提交请求:

嘿嘿,Mode选Upload,File要写绝对路径,上面的画面用环境变量是有问题的哦!

Item Type放空。

上线安装的时候用这种模式。

1.5.先睹为快:一个简单例子.运行

方式一:Workflow管理界面

N: System Administrator/Workflow/Administrator Workflow/Home

实际上可以从很多地方进,而且不同版本不一样。这里是11.5.9以上的版本,之前的版本直接就有Find Process菜单。

切换到“Developer Studio”Tab页,输入查询条件,这里输入Internal Name:

CUX_DEMO,查询结果如下:

注意,只有Workflow的管理员用户进来后面才有Run列!

SELECT wfr.text FROM wf_resources wfr WHERE NAME = 'WF_ADMIN_ROLE' AND https://www.360docs.net/doc/657591060.html,NGUAGE = 'US'可以查看当前的Workflow管理员,用其登陆EBS即可。*代表所有人。

也可以从上面的画面的“Administrator”Tab页查看和设置。

接下来,点击,出来:

按照上图内容输入。Item Key是本工作流运行实例的标志;相对的保存在数据库中Item Type可理解为一个定义或者一个Template。User Key是用户看到的实例标志。点击Run Workflow。

运行情况查看

N: System Administrator/Workflow/Administrator Workflow/Home

选择“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;

dbms_output.put_line(l_item_key);

END;

既然是PL/SQL,所以在Form等地方也是这样启动的。实际使用中几乎都是这样启动工作流的。所以下面的例子开始不用方式一了。

接下来和上面的方式一一样去“Status Monitor”Tab页查看了。

相关文档
最新文档