如何获取Captaris Workflow 6.0工作流平台中的业务数据。

你知道我要说什么的,当这个世界被XML符号标识后,我一直尽力向它靠拢。面向对象数据库都出现了,我还能不好好学习学习XML吗?
   
今天要说的如何将储存在Captaris Workflow 6.0工作流平台数据库中的业务数据保存到另一个业务系统中。

如大家所知,一个系统与另一个系统最难的就是交互,就算是使用XML这种通用、跨平台的方式也意味着添加或修改现有的接口。不幸的是,做为一个工作流系统,必须要具有这样的能力。为了满足这样的需求,大部分(包括Captaris)工作流平台都或多或少地使用了XML技术,以能对外宣称:“我的平台能跨越N个操作系统,支持N种交互方式”。

闲话少说,言归正传。Captaris Workflow 6.0的模型、流程实例的数据都以XML方式储存在SQL Server 2005的数据库中,常见的格式如下:


ContractedBlock.gif ExpandedBlockStart.gif
 1None.gif<Common>
 2None.gif    <ModelData>
 3None.gif        <ApprovedTasks />
 4None.gif        <RejectTask />
 5None.gif        <IsApproved />
 6None.gif        <!--选择的技术/产品会签者-->
 7None.gif        <ProductResponseID />
 8None.gif        <!--连接外部数据库字符串-->
 9None.gif        <ConnectionString>Data Source=(local);Initial Catalog=WorkflowExtension;Integrated Security=True</ConnectionString>
10None.gif    </ModelData>
11None.gif    <PCOrderData>
12None.gif        <ProcessID />
13None.gif        <PCNO />
14None.gif        <ECRNO />
15None.gif        <FileNO />
16None.gif        <TotalNO />
17None.gif        <PCName />
18None.gif        <TotalName />
19None.gif        <ChangedCategoris />
20None.gif        <ChangedType />
21None.gif        <ChangedReason />
22None.gif        <RequestDate />
23None.gif        <InproduceIdea />
24None.gif        <producedIdea />
25None.gif        <SendPIdea />
26None.gif        <!--需要验证-->
27None.gif        <IsValidated>0</IsValidated>
28None.gif        <ChangedCategorisTxt />
29None.gif        <!--总图号-->
30None.gif        <DrawNO />
31None.gif        <!--总图名称-->
32None.gif        <DrawName />
33None.gif        <!--清单文件存放目录-->
34None.gif        <FileUrl />
35None.gif        <!--提交人需要更改的文件和完成日期-->
36None.gif        <SubmitRelatedFile />
37None.gif    </PCOrderData>
38None.gif    <SubmitData>
39None.gif        <!--存放执行人的ID-->
40None.gif        <ResponsibleID />
41None.gif        <!--提交者姓名-->
42None.gif        <SubmitName />
43None.gif        <!--需要验证-->
44None.gif        <IsValidated>0</IsValidated>
45None.gif        <FileName />
46None.gif        <!--技术文件-->
47None.gif        <ComDate />
48None.gif        <!--预计完成日期-->
49None.gif        <PlanComTime />
50None.gif        <!--实际完成日期-->
51None.gif        <FactComTime />
52None.gif    </SubmitData>
53None.gif    <TogetherPC>
54None.gif        <!--共同实施的PC-->
55None.gif    </TogetherPC>
56None.gif</Common>

Captaris提供了很多种常见的与外部系统交互的功能(Action):

  1. WebService请求或响应;

  2. 文件系统监视;

  3. BizTalk事件;

  4. SharePoint事件;

遗憾的是没有提供对数据记录的事件响应,流程分析人员在把流程模型交给流程开发人员(IT)后,流程开发人员就要面临如何将工作流与各种业务系统连接起来,如人员招聘流程结束后如何反应到HR系统中,或费用报销流程结束后如何反应到财务系统中甚至反应到商业行为控制系统中(如果费用中包含礼品、应酬等费用时)。通常可用的连接方式如下:

  1. 通过WebService把记录插入到业务系统,或更新业务系统中的数据;(业务逻辑级别交互)

  2. 将记录直接插入到业务系统的数据库;(数据库级别交互,这种方式是我用得最多的了)

  3. 通过Windows服务将记录插入到业务系统;可使用WebService、数据库直接交互、MSMQ…

前两种方式都是即席(同步)的操作,Windows服务前两种方式的基础上添加了异步操作的特性,使得系统性能和执行效率得以提升。

不管是使用WebService还是数据库直接交互(特别是数据库直接交互),流程开发人员都要面临从Teamplate数据库中取得并分解业务数据,以符合WebService或业务系统数据库的接口要求。

SQL Server 2005原生支持XML。因此,可以通过Xquery来直接操作XML,就象SQL Server 2000中的OPENXML一样。只是在性能和效率上(特别是吃内存)提升得非非非常大。

示例如下:



 1 None.gif set  ANSI_NULLS ON
 2 None.gif set  QUOTED_IDENTIFIER ON
 3 None.gifgo
 4 None.gif
 5 None.gif
 6 None.gif --   =============================================
 7 None.gif --  Author:         < 蒋勇星 >
 8 None.gif --  Create date:  < 2006 - 12 - 25 >
 9 None.gif --  Description:     < 从Teamplate数据库中检索 " 产品更改单数据 " >
10 None.gif --   =============================================
11 None.gifALTER PROCEDURE [dbo].[FetchProductChangeByPID] 
12 None.gif     --  Add the parameters  for  the stored procedure here
13 None.gif    @PID INT  -- 流程编号
14 None.gifAS
15 None.gifBEGIN
16 None.gif     --  SET NOCOUNT ON added to prevent extra result sets from
17 None.gif     --  interfering with SELECT statements.
18 None.gif    SET NOCOUNT ON;
19 None.gif
20 None.gifDECLARE @xmlOfFormData XML  -- 承载 " Common " 字段的XML变量,包含PC单的基本信息
21 None.gifDECLARE @xmlOfSignature XML  -- 承载 " SignData " 字段的XML变量,包含PC单的签署信息
22 None.gifDECLARE @FORMXMLNAME NVARCHAR( 20 )
23 None.gifDECLARE @SIGNATUREXMLNAME AS NVARCHAR( 20 )
24 None.gifDECLARE @PCNO NVARCHAR( 16 )
25 None.gifDECLARE @FILENO NVARCHAR( 100 )
26 None.gifDECLARE @PCNAME NVARCHAR( 200 )
27 None.gifDECLARE @CHANGECATEGORIES INT
28 None.gifDECLARE @CHANGETYPE INT
29 None.gifDECLARE @CHANGEDREASON NVARCHAR( 300 )
30 None.gifDECLARE @REQUESTDATE DATETIME
31 None.gifDECLARE @INPRODUCECOMMENT NVARCHAR( 200 )
32 None.gifDECLARE @PRODUCINGCOMMENT NVARCHAR( 200 )
33 None.gifDECLARE @SENDPCOMMENT  NVARCHAR( 200 )
34 None.gifDECLARE @NEEDVALIDATE INT
35 None.gifDECLARE @CHNGCATEGORYEXT NVARCHAR( 20 )
36 None.gifDECLARE @AFFECTEDPC NVARCHAR( 100 )
37 None.gifDECLARE @PLANCOMTIME DATETIME
38 None.gifDECLARE @FACTCOMTIME DATETIME
39 None.gif
40 None.gifSELECT  @FORMXMLNAME  =   ' Common '
41 None.gifSELECT  @SIGNATUREXMLNAME  =   ' SignData '
42 None.gif -- 查询PROCESSDATA表中的 ' Common ' 字段,给@xmlOfFormData赋值
43 None.gifSELECT @xmlOfFormData  =  [DATA] 
44 None.gif  FROM [Teamplate].[dbo].[PROCESSDATA]
45 None.gif WHERE([PID]  =  @PID AND
46 None.gif       [NAME]  =  @FORMXMLNAME)
47 None.gif -- 查询PROCESSDATA表中的 ' SignData ' 字段,给@xmlOfSignature赋值
48 None.gifSELECT @xmlOfSignature  =   [DATA] 
49 None.gif  FROM [Teamplate].[dbo].[PROCESSDATA]
50 None.gif WHERE([PID]  =  @PID AND
51 None.gif       [NAME]  =  @SIGNATUREXMLNAME)
52 None.gif -- 分解XML并赋值到变量中
53 None.gifSELECT
54 None.gif        @PID  =  Table1.Column1.value( ' (/Common/PCOrderData/ProcessID)[1] ' , ' int ' ),
55 None.gif        @PCNO  =  Table1.Column1.value( ' (/Common/PCOrderData/PCNO)[1] ' , ' nvarchar(16) ' ),
56 None.gif        @FILENO  =  Table1.Column1.value( ' (/Common/PCOrderData/FileNO)[1] ' , ' nvarchar(100) ' ),
57 None.gif        @CHANGECATEGORIES  =  Table1.Column1.value( ' (/Common/PCOrderData/ChangedCategoris)[1] ' , ' int ' ),
58 None.gif        @CHANGETYPE  =  Table1.Column1.value( ' (/Common/PCOrderData/ChangedType)[1] ' , ' int ' ),
59 None.gif        @CHANGEDREASON  =  Table1.Column1.value( ' (/Common/PCOrderData/ChangedReason)[1] ' , ' nvarchar(200) ' ),
60 None.gif        @REQUESTDATE  =  Table1.Column1.value( ' (/Common/PCOrderData/RequestDate)[1] ' , ' datetime ' ),
61 None.gif        @INPRODUCECOMMENT  =  Table1.Column1.value( ' (/Common/PCOrderData/InproduceIdea)[1] ' , ' nvarchar(200) ' ),
62 None.gif        @PRODUCINGCOMMENT  =  Table1.Column1.value( ' (/Common/PCOrderData/producedIdea)[1] ' , ' nvarchar(200) ' ),
63 None.gif        @SENDPCOMMENT  =  Table1.Column1.value( ' (/Common/PCOrderData/SendPIdea)[1] ' , ' nvarchar(200) ' ),
64 None.gif        @NEEDVALIDATE  =  Table1.Column1.value( ' (/Common/PCOrderData/IsValidated)[1] ' , ' int ' ),
65 None.gif        @CHNGCATEGORYEXT  =  Table1.Column1.value( ' (/Common/PCOrderData/ChangedCategorisTxt)[1] ' , ' nvarchar(20) ' ),
66 None.gif        @AFFECTEDPC  =  Table1.Column1.value( ' (/Common/TogetherPC)[1] ' , ' nvarchar(200) ' ),
67 None.gif        @PLANCOMTIME  =  Table1.Column1.value( ' (/Common/SubmitData/PlanComTime)[1] ' , ' datetime ' ),
68 None.gif        @FACTCOMTIME  =  Table1.Column1.value( ' (/Common/SubmitData/FactComTime)[1] ' , ' datetime ' )
69 None.gifFROM
70 None.gif        @xmlOfFormData.nodes( ' /Common ' ) AS Table1(Column1)
71 None.gif
72 None.gif
73 None.gifSELECT @PID AS [PID],
74 None.gif       @PCNO AS [PCNO],
75 None.gif       @FILENO AS [FILENO],
76 None.gif       @CHANGECATEGORIES AS [CHANGECATEGORIES],
77 None.gif       @CHANGETYPE AS [CHANGETYPE ],
78 None.gif       @CHANGEDREASON AS [CHANGEDREASON],
79 None.gif       @REQUESTDATE AS [REQUESTDATE],
80 None.gif       @INPRODUCECOMMENT AS [INPRODUCECOMMENT],
81 None.gif       @PRODUCINGCOMMENT AS [PRODUCINGCOMMENT],
82 None.gif       @SENDPCOMMENT AS [SENDPCOMMENT],
83 None.gif       @NEEDVALIDATE AS [NEEDVALIDATE],
84 None.gif       @CHNGCATEGORYEXT AS [CHNGCATEGORYEXT],
85 None.gif       @AFFECTEDPC AS [AFFECTEDPC],
86 None.gif       @PLANCOMTIME AS [PLANCOMTIME],
87 None.gif       @FACTCOMTIME AS [FACTCOMTIME]
88 None.gifEND

套用最近流行的一句话:球进了他不是一个人

转载于:https://www.cnblogs.com/Johnson/archive/2006/12/26/603787.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值