起步软件技术论坛-X3

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: lxs202

关于流程事务的问题

[复制链接]
发表于 2010-5-28 09:26:20 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-5-28 11:00:52 | 显示全部楼层
这个帖子我早就看了。
  我这里FlowBroker1 根本都感知不到。
我是用代码创建一个新的流程,面不是去处理已有流程的某个环节。

我的问题和这个http://bbs.justep.com/forum.php? ... 7%B3%CC%CA%C2%CE%F1 是一样的。
回复 支持 反对

使用道具 举报

发表于 2010-5-28 11:27:03 | 显示全部楼层
楼主,你按 下面的代码 试一下
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
      //再处理流程
      UserStartFlow(lTransaction,'Biz:\CSLZ\CSLZ3\DMQDLCJSWCLLC.Proc','BM1','GW1','RY1',
                      'DMQDLCJSWCLRK',lGUID,'test','tttt');

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

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

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

使用道具 举报

 楼主| 发表于 2010-5-29 09:15:32 | 显示全部楼层
procedure THGZB_H_FSQ_doc.ToolButton4Click(Sender: TObject);


//...............................


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

    lHandle:= lTransaction.Start(False);
    try


      //先处理业务数据(测试事务时,可以跟处理流程的代码换个位置)
        DataSetBroker_hgz.DataSet.Edit;
        DataSetBroker_hgz.DataSet.FieldByName('status').AsString:='办理中';
        DataSetBroker_hgz.DataSet.Post;
        DataSetBroker_hgz.DataSet.ApplyUpdates;

        lQuery.Close;
        lquery.CommandText:='insert into x3_drp_flowid (id, biztablename,OP_USER,OP_date)values '
                            +' (:id,:biztablename,:OP_USER,:OP_date)';
        lquery.Params.ParamByName('id').AsString:=AFlowID;
        lquery.Params.ParamByName('biztablename').AsString:='qm_hgzbf';
        lquery.Params.ParamByName('OP_USER').AsString:=SystemUtils.TContextUtils.GetOperator(self.Context).DisplayName; //操作者用户名
        lquery.Params.ParamByName('OP_date').AsDateTime:=business.Data.SysSrv.SysService.Time;
        lQuery.Execute;

        //再处理流程
      TZLGLXX_info(InfoBroker.Info).UserStartFlow(ADept,ARole,APerson,AFlowUrl,AStartProc,AFlowID,ASubject,ADescription,lTransaction);

      lTransaction.Commit(lHandle);
      Dialogs.ShowMessage('事务成功');
    except
      DataSetBroker_hgz.DataSet.CancelUpdates;
      lTransaction.Rollback(lHandle);
      Dialogs.ShowMessage('事务失败');
    end;
  finally
    lQuery.Free;
    lConnection.Free;
    lTransaction.Free;
  end;



procedure TZLGLXX_info.UserStartFlow(ADept,ARole,APerson,AFlowUrl,AStartProc,AFlowID,ASubject,ADescription:string;ATransaction:TTransaction);
var
  lBizURL:TBizURL;
  lFlowValue:TFlowValue;
  lFlowControl:TFlowControl;
  lExecutor:Org.TOrgURL;
begin

  lBizURL := TBizURL.Create;
  lFlowValue := TFlowValue.Create;
  lFlowControl := TFlowControl.Create(Self.Context);
  lExecutor := Org.TOrgURL.Create(ADept, ARole, APerson);
  lBizURL.URL := AFlowUrl;

  try
    lFlowValue.IDs.Add(AFlowID);       //流程ID
    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
       raise;
    end;

  finally
    lFlowControl.Free;
    lFlowValue.Free;
    lBizURL.Free;
  end;
end;


这样还是不行。业务数据保存不成功的情况下。流程还是会被创建。
回复 支持 反对

使用道具 举报

发表于 2010-5-31 08:50:43 | 显示全部楼层
应该不会啊,我这边测试 是好的,看我给你个我这边运行效果的录像

录像3.rar

1.45 MB, 下载次数: 62

回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-8 22:10 , Processed in 0.040852 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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