起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: Haumwell

[请求]代码启动流程问题

[复制链接]
 楼主| 发表于 2009-8-4 11:00:21 | 显示全部楼层
TCommonFunc.UserStartFlow(Context, lTransaction, lFlowValue, lExecutor, 'Biz:\SCMSPACE\ClaimMaterialFlow.Proc', 'APPLY');
上面这个方法,传进去的lTransaction 就是赋给

FlowControl.FlowManager.Transaction:=lTransaction
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-4 11:03:31 | 显示全部楼层
你调试看看具体任务数据怎么产生的。
我要怎么做可以看到具体任务数据的产生
回复 支持 反对

使用道具 举报

发表于 2009-8-4 13:51:37 | 显示全部楼层
感觉像是提交多次导致。
回复 支持 反对

使用道具 举报

发表于 2009-8-4 13:53:10 | 显示全部楼层
TCommonFunc.UserStartFlow这个方法的实现贴一下看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-4 14:16:20 | 显示全部楼层
static function TCommonFunc.UserStartFlow(AContext:TContext; ATransaction:TTransaction; AFlowValue: TFlowValue; AExecutor:TOrgURL; AFlowUrl,AStartProc: string):Boolean;
var
  lBizURL: TBizURL;
  lFlowControl: TFlowControl;
  I:integer;
begin
  Result:= True;
  lFlowControl := TFlowControl.Create(AContext);
  if Assigned(ATransaction) then lFlowControl.FlowManager.Transaction:= ATransaction;
  lBizURL := TBizURL.Create;
  try
    lBizURL.URL := AFlowUrl;
    try
      //启动流程实例
      lFlowControl.StartupFlow(lBizURL, AStartProc, AExecutor, AFlowValue);
      //流程实例数据保存到数据库
      for I:=0 to lFlowControl.FlowRunnerCount-1 do
        lFlowControl.FlowRunnerbyIndex[I].CurrentTask.SaveToDB;
    except
      Result:= False;
    end;
  finally
    lFlowControl.Free;
    lBizURL.Free;
  end;
end;
回复 支持 反对

使用道具 举报

发表于 2009-8-4 14:39:00 | 显示全部楼层
lFlowControl.FlowRunnerbyIndex[I].CurrentTask.SaveToDB;
这个取消看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-4 15:21:29 | 显示全部楼层
取消SaveToDB工作台上没有任务了,不行。

新建文件夹.rar

113.96 KB, 下载次数: 44

回复 支持 反对

使用道具 举报

发表于 2009-8-4 15:40:01 | 显示全部楼层
楼主,我测试的结果是可以的。(我这里没用主从,但应该是一样的)

procedure TMainForm.UserStartFlow (ATransaction: TTransaction;AFlowUrl,ADept,ARole,APerson,
          AStartProc,AFlowID,ASubject,ADescription:string);
var
  lBizURL: TBizURL;
  lFlowValue: TFlowValue;
  lFlowControl: TFlowControl;
  lExecutor: TOrgURL;
begin
  lBizURL := TBizURL.Create;
  lFlowValue := TFlowValue.Create;
  lFlowControl := TFlowControl.Create(Self.Context);
  lExecutor := TOrgURL.Create(ADept, ARole, APerson);
  lBizURL.URL := AFlowUrl;
  try
    lFlowValue.IDs.Add(AFlowID);            //流程字段的 值
    lFlowValue.Subject := ASubject;         //流程主题
    lFlowValue.Description := ADescription; //流程描述
    try
      lFlowControl.FlowManager.Transaction :=  ATransaction;
      //启动流程实例
      lFlowControl.StartupFlow(lBizURL, AStartProc, lExecutor, lFlowValue); //AStartProc 入口环节ID
      //流程实例数据保存到数据库
      //lFlowControl.FlowRunnerbyIndex[0].CurrentTask.SaveToDB;
    except
    end;
  finally
    lFlowControl.Free;
    lFlowValue.Free;
    lBizURL.Free;
  end;
end;

procedure TMainForm.Button1Click(Sender: TObject);
var
  lHandle: TTransactionHandle;
  lTransaction: TTransaction;
  lConnection : TConnection;
  lGUID : String;
begin
  lGUID := Business.System.JSCommon.CreateGUIDStr;

  lTransaction := TTransaction.Create(nil);
  lConnection := TConnection.Create(nil);
  try
    lTransaction := DataSetBroker1.DataSet.Connection.Transaction;
    lConnection.ConnectionString := DataSetBroker1.DataSet.ConnectionString;
    lConnection.Transaction:= lTransaction;

    lHandle:= lTransaction.Start(False);
    try
      //先处理业务数据(测试事务时,可以跟处理流程的代码换个位置)
      if not DataSetBroker1.DataSet.Active then
        DataSetBroker1.DataSet.Active := True;
      DataSetBroker1.DataSet.Append;
      DataSetBroker1.DataSet.FieldByName('id').AsString := lGUID;
      //DataSetBroker1.DataSet.FieldByName('spbh').AsString := '1234567890123456789012345678901234567890';
      //上面的spbh为必填字段,测试事务可以不给他添值看看是否回滚
      DataSetBroker1.DataSet.Post;

      //再处理流程
      UserStartFlow(lTransaction,'Biz:\CSLZ\CSLZ3\DMQDLCJSWCLLC.Proc','BM1','GW1','RY1',
                      'DMQDLCJSWCLRK',lGUID,'test','tttt');

      lConnection.ExecuteSQL('update B set SPBH=''FF'' where id = '''+lGUID+''' ');
      DataSetBroker1.DataSet.ApplyUpdates;

      lTransaction.Commit(lHandle);
      Dialogs.ShowMessage('事务成功');
    except
      DataSetBroker1.DataSet.CancelUpdates;
      lTransaction.Rollback(lHandle);
      Dialogs.ShowMessage('事务失败');
    end;
  finally
    lConnection.Free;
    lTransaction.Free;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-4 16:21:07 | 显示全部楼层
还是提示说 任务表插入了重复键,而且,执行了回滚可是,工作台上,还是产生了任务消息,打开就会频繁的报错,out index of bounds
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-4 16:35:11 | 显示全部楼层
说明一点,这几个数据集不是在一个数据库里,都会涉及到提交到数据库,不过都是SQL Server2000
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-18 12:33 , Processed in 0.041678 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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