起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1499|回复: 16

[分享]流程揭密2-流程中的控制**

[复制链接]
发表于 2007-11-22 13:27:11 | 显示全部楼层 |阅读模式
流程的控制是通过流程以及各个环节上定义的规则、流程以及环节上定义的流程事件、流程代理上定义的流程事件来控制的。
流程中的各种规则在《用户手册》中有说明,这里主要是写流程的各种事件。

关于流程各种事件的说明,请参考 http://bbs.justep.com/forum.php?mod=viewthread&tid=730
回复

使用道具 举报

 楼主| 发表于 2007-11-22 13:36:44 | 显示全部楼层
在过程模型上(简单的说就是流程图上)可以定义流程事件
在环节的功能窗体上,可以放流程代理(TFlowBroker),定义流程事件
这两者的事件都会触发,区别在于:
过程模型上定义的事件总是会触发,而定义在环节上的事件只有在这个环节触发的事件才可以执行。

比如:一个简单的流程,有三个环节,ABC
开始 -> A -> B -> C -> 结束

如果在A功能的FlowBroker上定义OnFlowFinish事件,在C环节流转结束整个流程时候,不会触发A功能上定义的OnFlowFinish事件;但是如果在C环节定义了这个事件就会触发。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-22 13:50:57 | 显示全部楼层
一个标准的流转动作,会顺序触发以下事件:
  • 根据流转规则,判断是否可以流转
  • 触发BeforeFlowOut 事件
  • 启动非立即事务
  • 根据流程定义查找允许的下一个环节,如果有条件环节、条件分支环节,触发OnCalcProcCondition 事件
  • 根据流程下一个环节的执行规则,创建流程任务FlowTask
  • 触发OnCreateFlowOutFlowTasks事件
  • 如果没有屏蔽流转对话框,弹出流转对话框,用户选择任务和执行者等,点击确定;如果取消,则退出执行下面的过程
  • 触发BeforeNotify 事件
  • 触发OnCreateNotifyFlowTasks  事件
  • 触发AfterNotify 事件
  • 触发AfterFlowOut 事件
  • 提交事务
    [/list=1]
    在任何一个事件处理程序中,如果出错,
    比如
    或者 f := f/0;
    或者 SysUtils.Abort;
    或者 raise Exception.Create('');
    都会造成流转不成功

    造成流转不成功的还有在任何一个事件处理程序中,包括AterFlowOut中
      Command.Accept := False
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-22 13:58:56 | 显示全部楼层
一般在BeforeFlowOut事件中,判断是否可以流转
Command.Accept为真,可以流转,
Command.Accept为假,就不允许流转

在OnCreateFlowOutFlowTasks事件中,对任务主题、限制事件,执行者等做修改,这个修改会出现在流转对话框中。
如果 Command.UserConfirm为真 就弹出流转对话框,为假就不弹出流转对话框了
如果在业务数据已经指定了执行者,可以在这个事件中对   Command.FlowTasks.FindFlowTask('下个环节ID').Executors 赋值

在AfterFlowOut 事件中修改业务数据的状态,或者在业务数据表中记录执行者等
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-22 15:04:26 | 显示全部楼层
在BeforeFlowOut OnCreateFlowOutFlowTasks AfterFlowOut 事件中,参数Command 是TFlowOutCommand类的

TFlowOutCommand = class(TFlowTaskGraphCommand)
TFlowTaskGraphCommand = class(TFlowTaskCommand)
TFlowTaskCommand = class(TFlowActionCommand)
public
  constructor create(AID: Shortint; AFlowControl: TFlowControl);
  procedure Destroy; override;
  //待选择的流程任务,流转对话框中,所有可选的环节
  property AllowFlowTasks: TFlowTasks; readonly;
  //已经选中的流程任务,流转对话框中,默认选中的环节
  property FlowTasks: TFlowTasks; readonly;
  property ShowUnPassPath: Boolean;
  //UserConfirm和UserModify一样,都是是否弹出选择对话框来供用户选择
  property UserConfirm: Boolean;
  property UserModify: Boolean;
end;

AllowFlowTasks和FlowTasks只有在Or或者Xor时候才会不一致。
UserModify是兼容性保留的,建议用UserConfirm
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-22 17:21:52 | 显示全部楼层
TFlowTask 的属性和方法
  //允许的执行者表达式
  property AllowExecutorRange: string;
  //OrgURL方式的允许的执行者
  property AllowExecutors: Business.Model.Org.TOrgURLs;
  //选中的执行者表达式
  property ExecutorRange: string;
  //OrgURL方式的选中的执行者
  property Executors: Business.Model.Org.TOrgURLs;

1.png

15.97 KB, 下载次数: 898

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-22 17:22:33 | 显示全部楼层
允许的执行者

2.png

11.28 KB, 下载次数: 903

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-22 17:37:24 | 显示全部楼层
3

3.png

11.88 KB, 下载次数: 903

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-22 17:37:47 | 显示全部楼层
4

4.png

9.16 KB, 下载次数: 890

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-23 09:10:41 | 显示全部楼层

流程中的事务

在流程事件中,修改数据集只需要提交,不需要做事务控制,因为流程中所有的业务数据和流程控制数据都自动放在一个事务中了。参考 http://wiki.justep.cn/%E4%BA%8B% ... 73a56db2280784acbff
例如:在流转以后修改状态字段
procedure TMainForm.FlowBroker1AfterFlowOut(Sender: TObject; Command: TFlowOutCommand);
begin
  DataSetBroker1.DataSet.Edit;
  DataSetBroker1.DataSet.FieldByName('PRODUCTTYPE').AsString := '1';
  DataSetBroker1.DataSet.Post;
  DataSetBroker1.DataSet.ApplyUpdates;
end;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-1 11:22 , Processed in 0.046767 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表