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;
一次FlowOut动作,只能指定一组执行者,所有在这次flowOut动作中处理的任务,他们的处理人、任务标题等信息都是一样的,如果需要根据每一条具体的业务数据来决定下一个环节的处理人,那么就需要一次流转一条任务了。
例如:
for i:= FlowBroker1.FlowControl.TaskCount-1 downto 0 do
begin
lTasks.Clear;
lTasks.Add(FlowBroker1.FlowControl.TaskByIndex);
FlowBroker1.FlowControl.FlowOut(lTasks);
end
5楼代码用Timer来启动所有任务的流转,其实也可以不用Timer
增加一个变量来区分是从主界面点流转按钮进入的流转事件还是从代码流转进入的流转事件
var
//true 表示正在流转任务
//False 表示从主界面上点流转按钮进入的
taskrunning: Boolean;
procedure TMainForm.FlowBroker1BeforeFlowOut(Sender: TObject; Command: TFlowOutCommand);
begin
if not taskrunning then
begin
//从主界面上点流转按钮进入的
//保证下面流转时候是被接收的流转
taskrunning := True;