起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 976|回复: 20

[结贴]代码启动流程 流程事务和Query事务

[复制链接]
发表于 2009-9-14 16:57:16 | 显示全部楼层 |阅读模式
请教:
请参考alang的分享:http://bbs.justep.com/forum.php?mod=viewthread&tid=18984
六楼的代码。
在这段代码中,我想实现的是,在自动启动流程的时候,还要使用Query去更新库里的其他表。
我按照bbs的相关代码:                lFlowControl := lFunc.Context.GetParentContext(BizSys.IL_FLOW).Owner as TFlowControl;
                FlowBroker := TFlowBroker.Create(lFunc);
                FlowBroker.OnCreateFlowOutFlowTasks:=FlowBroker1BeforeFlowOut;
               // raise exception.Create('the exception is running...');

[B]在这里写事务[/B]
//更新表的事务和流程事务同步
lConn.ConnectionString:= 'DATABASEURL=Biz:\CPSAPP\CPSDB.DATABASE';
lConn.Transaction:=FlowBroker.FlowControl.FlowManager.Transaction;[/SIZE]
setXTaskStatusQry.Connection:=lConn;

经测试后,没有达到事务同步的效果。那应该怎么写的。
回复

使用道具 举报

发表于 2009-9-14 17:10:33 | 显示全部楼层
代码在哪个事件下写的?尝试换一个
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
回复 支持 反对

使用道具 举报

发表于 2009-9-14 17:41:24 | 显示全部楼层
你的业务数据处理的代码没有在流程事件中。
FlowBroker.OnCreateFlowOutFlowTasks:=FlowBroker1BeforeFlowOut;
没看到你的应用得地方。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-14 17:45:42 | 显示全部楼层
我在这个功能窗体上放了一个flowBroker,代码
procedure Tmainform.FlowBroker1BeforeFlowOut(Sender: TObject; Command: TFlowOutCommand);
var
   lFlowTask:TFlowTask;
begin
     lFlowTask:=Command.FlowTasks.FindFlowTask(agentToUnit);
     lFlowTask.Executors.Clear;
     lFlowTask.Executors.Add(agentToDept,agentToPositon,agentToPsn);
     //DataSetBroker1.dataset.FieldByName('FManagerExamPerson').AsString :='老叶';
     //DataSetBroker1.dataset.ApplyUpdates;
     //jsdialogs.ShowMsg('fsafdsa','asdfa');
     command.UserConfirm:=false;
end;
回复 支持 反对

使用道具 举报

发表于 2009-9-14 18:15:00 | 显示全部楼层
您这个里面为什么不处理业务数据
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-14 18:29:02 | 显示全部楼层
不好意思,还以为你走了呢  谢谢
这个语句
//改erp_task表的状态为已处理  update 语句
setXTaskStatus(setXTaskStatusQry,queryTask.FieldByName('guid').AsString);
再加上一个函数是处理业务数据的(还没有写)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-14 18:30:44 | 显示全部楼层
FlowBroker1BeforeFlowOut 这个函数里面处理业务数据不好吧 毕竟是流转前的动作。
业务数据的处理在按钮的单击事件里写。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-14 18:32:59 | 显示全部楼层
看来这次你是真走了  明天再请教吧 谢谢
回复 支持 反对

使用道具 举报

发表于 2009-9-15 08:41:25 | 显示全部楼层
你放在外面执行,更加不行。事务没有这样用的吧?
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-16 01:47 , Processed in 0.042433 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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