起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1925|回复: 5

[分享]流程的批处理**

[复制链接]
发表于 2007-10-25 15:03:00 | 显示全部楼层 |阅读模式
对于申请审批类的流程,有时候需要在审批环节列出所有在待审批单据,领导在一个功能界面上做一次操作处理所有的这些单据。这种情况下,就可以使用流程的批处理了。
只要在审批环节上,定义一个流程批处理规则,设置是否允许任务批处理为True,就可以了。
回复

使用道具 举报

 楼主| 发表于 2007-10-25 15:06:54 | 显示全部楼层
在审批环节上,可以根据业务数据的值决定哪些数据继续流转,哪些需要回退

方法一:在流转之前确定哪些任务可以流转,形成一个List,直接流转这些任务

代码示例如下:
procedure TMainForm.Button1Click(Sender: TObject);
var
  i: Integer;
  lTask: TTask;
  lTasks1, lTasks2: TList;
  lDataSet: TDataSet;
begin
  //流转的任务列表
  lTasks1 := TList.Create;
  //回退的任务列表
  lTasks2 := TList.Create;
  try
    lDataSet := DataSetBroker1.DataSet;
    for i:=0 to FlowBroker1.FlowControl.TaskCount-1 do
    begin
      lTask := FlowBroker1.FlowControl.TaskByIndex;
      //任务与业务数据之间通过 lTasks.BizDatas来建立关系
      //这里假定了一个任务对应一条任务数据 BizDatas[0]
      //并且假定了任务对应的业务数据关键字段是一个字段 BizDataKeys[0]
      if lDataSet.Locate('ProductID', lTask.BizDatas[0].BizDataKeys[0].Value, []) then
      begin
        if Length(lDataSet.FieldByName('PRODUCTTYPE').AsString)>0 then  //规格型号不为空
          lTasks1.Add(lTask)
        else
          lTasks2.Add(lTask);
      end;
    end;

    FlowBroker1.FlowControl.FlowOut(lTasks1);
    FlowBroker1.FlowControl.FlowBack(lTasks2);
  finally
    lTasks1.Free;
    lTasks2.Free;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-25 15:24:17 | 显示全部楼层
方法二:直接流转,在选择流转任务OnGetFlowOutTasks中,确定哪些任务可以流转

procedure TMainForm.Button2Click(Sender: TObject);
begin
  FlowBroker1.FlowControl.FlowOut(nil);
end;

procedure TMainForm.FlowBroker1GetFlowOutTasks(Sender: TObject; Command: TGetTasksCommand);
var
  i: Integer;
  lTask: TTask;
  lDataSet: TDataSet;
begin
  Command.UserModify := False;   //True 弹出选择任务对话框 False不弹出选择任务对话框
  lDataSet := DataSetBroker1.DataSet;
  for i:=Command.Selected.Count-1 downto 0 do
  begin
    lTask := Command.Selected as TTask;
    if DataSetBroker1.DataSet.Locate('ProductID', lTask.BizDatas.Items[0].BizDataKeys.Items[0].Value, [TLocateOption.loCaseInsensitive]) then
    begin
      if Length(lDataSet.FieldByName('PRODUCTTYPE').AsString)=0 then //规格型号为空,不流转
      begin
        Command.Selected.Delete;
      end;
    end;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-26 12:16:04 | 显示全部楼层
一次FlowOut动作,只能指定一组执行者,所有在这次flowOut动作中处理的任务,他们的处理人、任务标题等信息都是一样的,如果需要根据每一条具体的业务数据来决定下一个环节的处理人,那么就需要一次流转一条任务了。
例如:
   for i:= FlowBroker1.FlowControl.TaskCount-1 downto 0 do
      begin
        lTasks.Clear;
        lTasks.Add(FlowBroker1.FlowControl.TaskByIndex);
        FlowBroker1.FlowControl.FlowOut(lTasks);
      end
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-18 16:41:37 | 显示全部楼层
4楼的代码,只能在功能界面上放一个按钮来流转这一组任务,如果用主界面上的流转按钮就只能流转一次,而不是流转所有的任务
可以在流转时候,触发另外一个函数,在这个函数中用循环流转每一个任务
procedure TMainForm.Button1Click(Sender: TObject);
var
  i: Integer;
  lTask: TTask;
  lTasks: TList;
begin
  //流转的任务列表
  lTasks := TList.Create;
  try
    for i:= FlowBroker1.FlowControl.TaskCount-1 downto 0 do
    begin
      lTask := FlowBroker1.FlowControl.TaskByIndex;
      lTasks.Clear;
      lTasks.Add(lTask);
      FlowBroker1.FlowControl.FlowOut(lTasks);
    end;
  finally
    lTasks.Free;
  end;
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
begin
  Timer1.OnTimer := nil;
  try
    Timer1.Enabled := False;
    Button1.Click;
  finally
    Timer1.OnTimer := Timer1Timer;
  end;
end;

procedure TMainForm.FlowBroker1BeforeFlowOut(Sender: TObject; Command: TFlowOutCommand);
begin
  //当前这次启动流程流转是不是从主界面上启动的
  if Timer1.OnTimer<>nil then
  begin
    //不允许此次的流转,因为真正的流转动作是在定时器中执行的
    Command.Accept := Timer1.OnTimer=nil;
    //启动定时器,这样在定时器中循环流转所有的任务
    Timer1.Enabled := True;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-18 17:05:10 | 显示全部楼层
5楼代码用Timer来启动所有任务的流转,其实也可以不用Timer
增加一个变量来区分是从主界面点流转按钮进入的流转事件还是从代码流转进入的流转事件
var
  //true  表示正在流转任务
  //False 表示从主界面上点流转按钮进入的
  taskrunning: Boolean;

procedure TMainForm.FlowBroker1BeforeFlowOut(Sender: TObject; Command: TFlowOutCommand);
begin
  if not taskrunning then
  begin
    //从主界面上点流转按钮进入的
    //保证下面流转时候是被接收的流转
    taskrunning := True;

    Button1.Click;
    //放弃从主界面上点流转按钮的动作
    taskrunning := False;
    Command.Accept := False;
  end;
end;
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-23 00:36 , Processed in 0.038008 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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