|

楼主 |
发表于 2009-9-14 17:21:08
|
显示全部楼层
[问题]
谢谢。
代码启动流程,是一个单独的功能。代码在一个按钮的单击事件里写的。
源代码如下:
procedure Tmainform.Button1Click(Sender: TObject);
var
lTaskParam: TLoadTaskParam;
lFlowParam: TLoadFlowParam;
lTasks: TTasks;
lDataSet : TDataSet;
lFunc: TFunc;
lFlowControl: TFlowControl;
FlowBroker:TFlowBroker;
lOrgURL:TOrgURL;
ds:Tdataset;
queryFitTask:TQuery;
setXTaskStatusQry: TQuery;
lConn: TConnection;
begin
lDataSet := DataSetBroker1.DataSet;
lFlowParam := TLoadFlowParam.Create;
lTaskParam := TLoadTaskParam.Create;
lTasks := TTasks.Create;
if setXTaskStatusQry = nil then
setXTaskStatusQry:=TQuery.create(nil);
if lConn = nil then
lConn:=TConnection.Create(nil);
if queryTask=nil then
queryTask:=TQuery.Create(nil);
if queryFitTask= nil then
queryFitTask:=TQuery.Create(nil);
try
queryTask.Close;
queryTask.ConnectionString:='DATABASEURL=Biz:\CPSAPP\CPSDB.DATABASE';
queryFitTask.Close;
queryFitTask.ConnectionString:='DATABASEURL=Biz:\CPSAPP\CPSDB.DATABASE';
//查询未处理的任务
queryTask.CommandText:='select * from emailtask where guid in (select relaid from erp_task where status=''0'' ) ';
queryTask.Open;
while not queryTask.Eof do
begin
//根据流程字段,找到对应的流程Guid值
DoGetFlowGUIDs(queryTask.FieldByName('flowfield').AsString, lFlowParam.GUIDs);
lTaskParam.States := [TTaskState.tsStarted, TTaskState.tsProcessing, TTaskState.tsWaiting];
//以给定的条件查询任务(这里给定的条件由lFlowParam给出,根据流程Guid值查询,lTaskParam条件是按照任务状态,只查询出需要处理的任务)
lFlowParam.ProcURLs.Add(queryTask.FieldByName('propath').AsString);
//lTaskParam.Receivers.Add(lOrgURL);
Flow.FlowEngine.GetTasks(lFlowParam, lTaskParam, lTasks);
//判断在X3任务表取出的任务 是否是emailtask表的任务的后续任务
queryFitTask.Close;
queryFitTask.CommandText:='select fguid from ttask where FPREVGUID='''+queryTask.FieldByName('taskguid').asstring+'''';
queryFitTask.Open;
if lTasks[0].GUID =queryFitTask.FieldByName('fguid').AsString then
begin
//lFunc := SystemCore.TSystemCore.FuncManager.RunTask(SystemCore.TSystemCore.Operator.Positions[0], lTasks[0]);
lFunc := SystemCore.TSystemCore.FuncManager.RunTask(self.Context, lTasks[0]);
{//如果需要自动流转,则需要下面的代码vvvvvvvvvvvvvv
lFlowControl := lFunc.Context.GetParentContext(BizSys.IL_FLOW).Owner as TFlowControl;
lFlowBroker:=TFlowBroker.create(lFunc);
//lFlowBroker.OnCreateFlowOutFlowTasks:=FlowBroker1BeforeFlowOut;
lFlowControl.FlowOut(nil);
//如果需要自动流转,则需要下面的代码^^^^^^^^^^^^^^ }
//创建一个流程代理,对流程代理的事件赋值,可以在流程监控中自己控制流程流转时是否显示流转对话框,根据业务数据确定下一个环节执行者等
//得到处理人的信息
ds:=getAgentToUnitiInfo(queryTask.FieldByName('agenttoprounit').AsString);
//agentToUnit,agentToDept,agentToPositon,agentToPsn
agentToUnit:=ds.FieldByName('atounit').AsString;
agentToDept:=ds.FieldByName('prodept').AsString;
agentToPositon:=ds.FieldByName('proposition').AsString;
agentToPsn:=ds.FieldByName('proedby').AsString;
//---
lFlowControl := lFunc.Context.GetParentContext(BizSys.IL_FLOW).Owner as TFlowControl;
FlowBroker := TFlowBroker.Create(lFunc);
FlowBroker.OnCreateFlowOutFlowTasks:=FlowBroker1BeforeFlowOut;
// raise exception.Create('the exception is running...');
//更新表的事务和流程事务同步
lConn.ConnectionString:= 'DATABASEURL=Biz:\CPSAPP\CPSDB.DATABASE';
lConn.Transaction:=FlowBroker.FlowControl.FlowManager.Transaction;
setXTaskStatusQry.Connection:=lConn;
//在流程控制中,注册自己创建的流程代理
lFlowControl.RegisterFlowBroker(FlowBroker);
lFlowControl.FlowOut(nil);
lFlowControl.UnRegisterFlowBroker(FlowBroker);
//改erp_task表的状态为已处理 update 语句
setXTaskStatus(setXTaskStatusQry,queryTask.FieldByName('guid').AsString);
end;
queryTask.Next;
end;
finally
lFlowParam.Free;
lTaskParam.Free;
lTasks.Free;
end; |
|