Oracle WorkFlow(工作流)(一)

转载自:http://hi.baidu.com/quce227/item/3dee702c66466a0343634a58

1概述
1.1工作流的概念

Workflow是EBS的基础架构技术之一,系统中大部分流程性的通知和审批控制、账户按规则自动生成都是通过Workflow实现的
1.2工作流的目的

  • 1. 在业务流程中发送、提供附加信息,这些附加信息以自助的Web页面或Form的形式存在,例如:在Application中审批采购订单时,采购订单的form会作为附加信息提供给审批人。
  • 2. 定义业务规则。使用WorkflowBuilder(图形化工具)修改业务规则的流程;使用PL/SQL写流程中活动的源代码。
  • 3. 发送电子邮件。工作流可以以电子邮件的方式向任何Application的用户发送通知。

1.3工作流体系结构

  • 1. 开发者客户端:只要在PC上安装了WorkflowBuilder并且可以连接到数据库,就可以用来创建和修改工作流的定义。
  • 2. 数据库服务器:工作流是和Oracle的数据库集成在一起的。
  • 3.应用服务器:包括Oracle Web Server、WebDB以及发送电子邮件的后台程序。
  • 4. 最终用户端:安装了浏览器可以使用Application、接收工作流发出的邮件和使用用来监控工作流的Web页面。

1.4工作流开发工具安装
在http://www.oracle.com/technology ... workflow/index.html下载页面上找到workflow client并下载下来,即为所要安装的Workflow Builder。
WorkflowBuilder介绍:
用来定义和修改工作流的图形化工具,运行在Windows操作系统上。可以将一个或几个工作流的定义保存到数据库中或保存成一个文件。
WorkflowBuilder由‘对象浏览器'和‘流程图表' 两种窗口构成。‘对象浏览器'以树状结构显示了工作流的对象构成,最上面一层是一个数据库连接或一个wft文件,下面一层显示的是在数据库或文件中包含的工作流定义,更下面一层的是构成一个完整的工作流定义的对象(例如:属性、流程、功能、通知、消息和快速编码)。‘流程图表'窗口使用‘对象浏览器'窗口中的对象来创建和修改工作流中的流程。
工作流的流程是由活动(活动可以是功能、通知或另一个工作流流程)和各活动之间的连线构成的。在应用中可以通过工作流引擎的API来调用一个工作流的流程。一个工作流的流程开始于一个‘开始'的活动。工作流引擎会自动地一个接一个地运行流程中的活动,直到遇到一个通知或一个暂停工作流流程的活动。当工作流引擎遇到一个通知时,它会调用通知程序来发送信息给某个角色,当用户或角色对通知作了回应,工作流引擎会接着运行后面的活动,直到遇到一个‘结束'活动。
在工作流的流程中可以使用循环、分支和平行结构以及使用子流程来实现复杂的业务规则。

2工作流的组成及创建
在Workflow Builder的对象浏览器窗口中以树状的方式显示了工作流的对象的组成,在树状结构的第三层(也就是项目类型的下面一层),包含以下这些分支:属性(Attribute)、流程(或子流程Process)、功能(Function)、通知(Notification)、信息(Message)和快速编码(Lookup Types);一个完整的工作流的定义就是由这些对象构成的。

2.1单据类型(Item Type)
组成工作流的对象的集合,在工作流流程中的每一个对象都必须从属于一个项目类型。企业的业务有很多类别,同一种业务对应有不同的业务流程,同时在业务流转的过程中处理不同的业务信息。单据类型其实就相当于一个业务类型。
单据类型属性主要是定义业务信息,另外还包含一些在其它对象需要引用的信息,例如通知里的接收人就可以作为单据类型的属性。单据类型的另外一项功能就是对工作流程进行分类 ,所有工作流里的其它对象都属于一个单据类型。
Item Type是个抽象的概念,为方便理解,可以看作就是一个工作流。
创建一个Item Type:

  • § 如果你没有打开一个data store,从File里选择New菜单创建一个新的Data Store,然后从鼠标右键菜单里选择New Item Type在浏览树里定义一个新的Item Type,此时单据类型的属性页会出现;

  • § 每一个单据类型有一个大写的内部名称,最多8个字符,所有的工作流API、PL/SQL过程,SQL脚本在识别单据类型的时候都引用单据类型的内部名称。在内部名称里不能包括":"和"/"。 Internal Name相当于Code,在程序中经常用它来标志一个工作流;
  • § 输入一个翻译性的名字,该名字是一个长一些的描述性名称,Display Name相当于User Name,你也可以在Description中为单据类型输入一段摘要信息;
  • § 指定单据类型的持续类型,Persistence:当你定义一个单据类型时,你必须指定它的Persistence Type,它主要是控制单据类型实例的状态审核追踪的保存时间,如果你把持续类型设置为Permanent,则运行时的状态信息会一直保存,除非你调用WF_Purge.Totalperm()过程清除;如果你把持续类型设置为Temporary,你必须指定持续的天数,临时持续类型的单据类型实例在完成之后至少保存你指定的持续天数,在'n'天过后,你可以调用任何一个WF_Purge的API清除单据类型的运行时信息。;
  • § Selector:如果你的单据类型有或者将有多个可运行的流程活动,定义一个PL/SQL函数决定在一个特殊的条件下运行哪一个流程活动。你也可以扩展这个选择函数为一个回调函数,这样在流程执行的过程中,如果会话信息中断的话,可以恢复单据类型实例的上下文信息。当你从通知详细页面上去查看一个页面属性时特别有用;
  • § 选择"Roles"页规定能访问单据类型的角色(没有用过);
  • § 选择"Access"页规定单据类型的访问和定制级别;
  • § 选择"应用"保存你的修改;
  • § 在浏览树里会出现一个二级分支来表示你刚创建的单据类型,你可以在浏览树里双击单据类型浏览或修改单据类型的属性;

2.2属性(Attribute)

就好像PL/SQL中的全局变量,它可以全局地被工作流流程中的活动引用(例如:在审批采购订单的工作流流程中,采购订单的编号就是一个项目类型属性,在审批流程的活动中可以随时获得这个属性的值,也就是采购订单的编号)。

单据类型属性是和单据类型联系在一起的,它通常充当一个全局变量,可以被流程里的活动引用或者修改。单据类型属性包含流程完成所必需的单据信息。对于活动需要引用的信息或者通知消息里包含的信息,你通常需要定义一个单据类型属性。
创建一个Attribute:

  • § 选中Item Type 子树中的Attribute/右键/New Attribute,出现属性页面;

  • § 输入一个大写的内部名称;
  • § 输入一个显示名称,该名称会出现在浏览树里;
  • § 你可以输入一段描述摘要信息;
  • § 选择属性的数据类型,在定义活动属性的时候,没有Form,URL,Document属性类型。一般情况下可选以下几项:

属性具有10种类型,下面给出每种类型的说明:

  • Oslash; Text:属性的值是一个字符串文本;
  • Oslash; Number:属性的值是一个数字,你可以为数字类型的属性定义一个格式掩码;
  • Oslash; Date:属性的值是一个日期类型,你也可以为日期类型的属性定义一个格式掩码;
  • Oslash; Lookup:属性的值是一个查找类型的代码;
  • Oslash; Form:属性的值是一个Oracle应用的内部窗体函数名称以及函数的参数;如果你在通知消息里包括了一个窗体类型的属性,在查看通知的时候,会显示一个窗体附件的图标,可以让用户浏览到相应的页面。
  • Oslash; URL:属性的值是一个网络的URL地址,如果你在通知活动里包含了一个URL引用属性,在查看通知的时候,会有一个指向URL的标识,用户可以完成活动也可以访问URL地址或的额外的信息。
  • Oslash; Document:属性的值是一个附件文档,你可以在默认值里指定文档的类型:PL/SQL文档,通过存储过程把数据库里的信息以文档的方式表达;DM文档,一个被外部文档管理系统管理的文档。
  • Oslash; Role:属性的值是一个角色的内部名称,如果在一个通知里包含了一个角色类型的属性,则该属性会自动解释为角色的显示名称,省去了在内部名称和外部名称之间维护的工作。为了给角色类型的属性赋一个默认值,你必须首先从数据库里装载角色。
  • Oslash; Attribute:属性类型的值是对单据类型的引用。
  • Oslash; Event:暂时不知?(没有查到相关资料)
  • § 根据你选择的属性类型,为属性指定默认值信息;
  • § 对单据类型属性来说,可选的默认值是一个你输入或从列表中选择的常量,不过,这个常量可以是一个在运行时替换的字符串;对活动属性来说,默认值可以是一个常量或者一个单据类型属性;
  • § 选择"应用"保存你的修改,选择"确定"保存你的修改并推出属性页面,"取消"取消你的修改并推出属性页面;
  • § 如果你在定义一个单据类型属性,选择"Access"页设置允许修改属性的访问级别。

你创建的任何Attributes类型会出现在浏览树的"Attributes"分支下,所有的函数属性出现在对应的函数下面,你可以从浏览树里双击一个属性浏览或修改属性的定义。
2.2.1定义一个URL属性

  • § 在属性默认值里指定一个URL地址,这个URL可以是一个常量或者一个从其它单据属性返回的值;
  • § 你也可以在URL里包含字符串参数,这个参数可以是一个字符串文本或一个其它单据类型的格式替换。在参数字符串里采用其它单据类型进行格式替换,需要采用如下的格式:item_attr;
  • § 如果URL里包含一个参数字符串,你必须遵守如下的限制:你不能用一个文档类型的单据类型属性对参数进行格式替换;你可以用表单或URL属性对参数进行格式替换,但不能进行嵌套替换;
  • § 如果你需要在URL里传递一个日期时间参数,你需要使用TO_CHAR函数把日期时间转换为如下格式:"YYYY-MM-DD+HH24:MM:SS",同样对日起类型需要使用TO_DATE;
  • § 结束工作之后选择"确定"按钮保存。

2.2.2定义一个Form属性

  • § 在窗体属性页的默认值里指定一个窗体函数的名称以及可选的字符串参数(窗体函数的参数);
  • § 默认值必须使用下面的格式输入:function_name:arg1=value1 arg2=value2...argn=valuen,argn的值可以是一个包含在双引号内的字符串,也可以是一个被其他单据类型属性进行格式替换的值,可以使用下面的方式定义格式替换:argn="item_attr"或者argn="value &item_attr";
  • § 如果你的窗体属性内包括参数,你必须牢记以下的限制:你不能使用一个文档类型的属性进行标记替换;你可以使用一个窗体类型或URL类型的属性进行标记替换,但是你不能进行嵌套替换;
  • § 保存你的工作。

2.2.3定义一个Document属性

  • § 在属性页的默认值里输入一个标识文档的字符串;
  • § 你可以标识以下两种类型的文档:PL/SQL文档或者存放在文档管理系统里的文档;
  • § 一个PL/SQL文档表示数据库里的数据,该文档由一个存储过程产生,需要使用下面的方式来指定一个PL/SQL文档的默认值:plsql:<procedure>/<document_identifier>。在使用时用一个包和过程名称来替换procedure,用直接传送给过程的字符串参数替换document_identifier,这个参数字符串应该能标识这个文档。PL/SQL存储过程必须按照标准的API格式来写;默认值的实例如下所示:plsql:po_wf.show_req/po_req:2034;
  • § 如果你想动态的生成一个PL/SQL文档,你可以把文档标识定义成一个标记替换,然后使用其它单据类型属性的值替换,例如:plsql:po_wf.show_req/item_attr1:&item_attr2;
  • § 如果想指定一个由外部文档管理系统管理的文档,可以在默认值里输入如下格式的信息:DM:<node_ID>:<document_ID>:[version];
  • § 选择"确定"保存你的修改。

2.3流程(Process)

流程就是业务流程的流转规则。流程包括两部分:流程里包含的活动和各个活动在不同条件下的流转关系。在定义流程的时候,因为流程里的活动可能有不同的返回结果,我们需要把不同结果的处理活动和结果联系起来,另外在OracleERP里还定义了一些标准的返回结果(例如超时),你在定义流程的时候,也可以对这些内嵌的返回结果进行处理。在流程实例流转的时候,流程里的活动有自己相应的状态,工作流引擎得到活动的状态改变信息或活动返回结果之后,按照你定义的流程流转规则控制流程的流转。流程必须属于一个单据类型。
流程定义里有一个标志属性"是否可运行标志",如果一个流程是可运行的,则可以在窗体上可以直接调用,否则该流程只能作为一个子流程包含在其它的流程里面,工作流引擎在碰到流程活动的时候,会自动激活子流程,让子流程流转。
2.3.1在你画流程图之前,你必须先定义一个流程活动来表达流程图:

  • § 从浏览树里选择一个单据类型,右键Process并从菜单里选择"New Process",在活动属性页上定义流程活动信息;
  • § 流程活动必须有一个全部大写的内部名称和一个显示名称,你也可以输入一段摘要信息来描述这个活动;
  • § 指定流程活动的结果类型,流程活动可以不返回结果;
  • § 为流程活动选择一个图标来标识它;
  • § 选中Runnable,这样你就可以把流程当作一个独立的流程来运行,如果不选的话,定义的流程只能作为一个子流程在别的流程下运行;
  • § 保存你的工作;
  • § 选择"Details"页定义流程活动的详细信息;
  • § 选择"Access"页指定允许修改流程的访问级别;
  • § 保存你所作的修改;
  • § 在浏览树的"Processes"分支下回出现你新定义的流程,在浏览树里用鼠标双击流程就可以查看和修改流程活动的信息。

2.3.2画流程图
在Oracle Workflow Builder里,流程图采用一种图形化的方式来显示流程里的活动以及活动之间的转移。在流程图里用一个图标来表示活动,用一个箭头来表示活动之间的转移。你可以从浏览树里把一个活动拖拽到流程图里,也可以直接在流程图里创建一个活动,在流程图里双击一个活动节点可以查看或修改节点的信息。通过在两个活动之间画一个箭头来表示活动之间的转移。
转移在流程图里使用一个箭头表示的,它表示一个活动的结束以及另外一个活动的激活。如果一个活动的结果类型是None,则转移表现为一个指向另外一个活动的箭头,表示只要初始的活动一结束,就流向下一个活动。如果一个活动有返回结果类型,则你必须把转移和活动的一个结果联系起来,你也可以为定义了返回结果的活动定义下面的转移类型:Default,Any,Timeout。在没有任何转移匹配完成结果时,工作流引擎执行默认的转移;如果定义了一个人以的转移,则不论活动的返回结果是什么,工作流引擎就执行这个转移,这样可以保证你除了在工作流里执行和放返回结果对应的活动外,还可以执行一个通用的活动。如果一个活动在完成之前已经超时,则工作流引擎执行超时转移。一个活动的返回结果可以有多个转移来进行并行处理。
(1)增加一个节点

  • § 在开始画流程图之前,你必须先显示流程活动的流程窗口,你可以通过以下的方式显示流程窗口:在浏览树里双击一个定义好的流程活动;选择一个定义好的流程活动并按下Ctrl+E;选择一个流程活动,并从编辑菜单里选择流程详细信息;使用快速启动向导创建一个新的流程。
  • § 可以通过下面的方式创建一个节点:从浏览树里拖拽一个活动;选择New Function、New Notification、New Process工具栏按钮创建一个节点;在弹出菜单里选择Create Activity创建一个新的节点;
  • § 按住鼠标右健并把鼠标从一个活动拖到另一个活动就在两个活动之间创建了一个转移;
  • § 如果来源活动定义了放回结果类型,则需要把转移和一个结果联系起来;
  • § 你可以在流程图里进行Copy和Paste;

(2)定义一个节点

  • § 打开流程活动的流程窗口;
  • § 使用工具栏按钮创建一个新的活动;
  • § 在单据类型域里,选择一个单据类型;
  • § 采用下面的方式定义节点的剩余信息:选择一个已定义活动的内部名称或显示名称,Workflow Builder会自动显示出原来定义的信息;另外你也可以使用新建按钮来创建一个新的活动,并根据活动的类型分别定义它们的信息,注意,在流程图里说做的修改都会反映到浏览树里的活动信息里;

  • § 选择"Node"页来定义节点的特定信息,为节点指定一个标签,因为一个活动在一个流程里可能有多个实例,可以通过标签来区分同一个活动的不同实例;
  • § 指定节点是否为一个开始或结束节点;
  • § 如果流程有一个接过类型,你必须为结束节点指定一个最终的结果;
  • § 你可以提供一段注释信息供自己察看;
  • § 对一个通知或一个子流程活动,你可以规定该活动节点是否必须在规定的时间之内完成;
  • § 对一个通知节点来说,你可以覆盖同志消息的优先级,另外需要给通知活动指定一个执行者,这是一个角色;
  • § 保存你的修改;
  • § 如果节点是一个函数或通知活动,并且这个活动有参数,你可以选择节点属性页给这些活动属性赋值;

如果这个节点是一个子流程,则一个子流程的标识会出现在子流程节点图标上。

  • (3)定义活动属性值

活动属性值主要是别PL/SQL存储过程服务的,这个存储过程被函数或通知活动调用。

  • § 显示属性值页;
  • § 选择一个属性;
  • § 在值区域里,输入这个属性的值,这个值可以是一个常量也可以是一个对单据类型属性的引用。注意,这个值的类型必须和活动属性的类型以及存储过程参数的类型保持一致;
  • § 保存你的修改。

转载于:https://www.cnblogs.com/wanghang/p/6299261.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring mvc 接收页面数据

目录1. 基本类型的数据封装2. pojo&#xff08;bean)类型的封装3. 数组类型4. list集合类型1. 基本类型的数据封装 //http://localhost:8080/spring_mvc_01/user/save8?namebitqian&age19 RequestMapping(value "/save8") ResponseBody public void save8(Str…

单片机的 FIFO循环队列实现

转自&#xff1a;单片机的FIFO(先入先出)循环队列实现 // // 文件&#xff1a;config.h // #ifndef __CONFIG_H #define __CONFIG_H //这一段无需改动 //This segment should not be modified #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif type…

前端学习(1183):指令v-cloak

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-- v-cloak用法 -->&…

前端学习(1184):数据绑定指令

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-- v-cloak用法 -->&…

前端学习(1185):数据响应式

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-- v-cloak用法 -->&…

前端学习(1186):双向数据绑定

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-- v-cloak用法 -->&…

浏览器获取正确的scrollTop值

window.pageYOffset 被所有浏览器支持除了 IE 6, IE 7, IE 8, 不关doctype的事&#xff0c; 注IE9 开始支持此属性。 window.scrollY 被Firefox, Google Chrome , Safari支持 不关doctype的事, 注IE9 不支持此属性。 在&#xff08;quirk 模式&#xff09;的时候 document.body…

拦截器,利用拦截器进行登陆权限控制

拦截器&#xff0c;登录权限控制demo1. 拦截器demo2. 登录权限控制地址&#xff1a;https://github.com/sevenyoungairye/spring-mvc-interceptor1. 拦截器demo 什么是拦截器 拦截器基于是aop思想实现的。 针对controller里面的目标方法进行拦截。 对比过滤器是过滤所有请求&…

通过CMD命令行创建和使用Android 模拟器 AVD

进行Android APP测试时&#xff0c;若手持android手机设备稀少的情况下&#xff0c;我们可以通过创建Android模拟器AVD来代替模拟android手机设备&#xff0c;本文就具体介绍如何创建和使用AVD。 1、创建AVD 每个AVD模拟一套虚拟设备来运行Android应用程序。无论…

前端学习(1188):事件绑定

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-- v-cloak用法 -->&…

前端学习(1189):事件基本使用

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-- v-cloak用法 -->&…

前端学习(1190):事件修饰符

传统方式 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-- v-cloak用…

mybatis --入门 单表增删改查-curd

目录1. mybatis 环境搭建2. 实体类映射文件配置&#xff08;写sql&#xff09;3. mybatis核心配置文件 &#xff08;环境配置&#xff09;4. 测试mybatis document https://mybatis.org/mybatis-3/zh/ mybatis in github https://github.com/mybatis/mybatis-3 1. mybatis 环…

lvs-dr模式原理详解和可能存在的“假负载均衡”

原文地址&#xff1a; http://blog.csdn.net/lengzijian/article/details/8089661 lvs-dr模式原理 转载注明出处&#xff1a;http://blog.csdn.net/lengzijian/article/details/8089661 先附上一张原理图&#xff1a; 为了更清晰的表述lvs-dr原理&#xff0c;我们用tcpdump工具…

把一张合成图分拆出各个小图

反编译一个程序&#xff0c;看到一张合成图&#xff0c;想分拆出里面的每个小图&#xff0c;知道了各个图的坐标大小后&#xff0c;写了一个小方法&#xff0c;希望对大家有用哈 package com.bitimage;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStr…

mybatis TypeHandler 类型处理器

目录1. 自定义日期类型处理器2. 配置自定义日期处理器3. 新增&#xff0c;查询1. 自定义日期类型处理器 继承mybatis提供的BaseTypeHandler覆写方法&#xff0c; 来转换Java和数据库中的字段package cn.bitqian.config;import org.apache.ibatis.type.BaseTypeHandler; import…

稀疏表示

稀疏表示是近期几年信号处理领域的热点之中的一个&#xff0c;简单来说&#xff0c;它事实上是一种对原始信号的分解过程&#xff0c;该分解过程借助一个事先得到的字典&#xff08;也有人称之为过完备基&#xff0c;overcomplete basis&#xff0c;后面会介绍到&#xff09;&a…