起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 719|回复: 26

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

[复制链接]
发表于 2009-8-4 09:10:02 | 显示全部楼层 |阅读模式
在一个单独的功能上,代码启动另外一个流程,所以要将流程的业务数据和流程放在一个事物里。出现了,下面的错误

error.rar

51.61 KB, 下载次数: 95

回复

使用道具 举报

发表于 2009-8-4 09:14:12 | 显示全部楼层
TTask表 主键重复了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-4 09:16:32 | 显示全部楼层
可是不知怎么会重复呢,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-4 09:19:15 | 显示全部楼层
代码启动流程时,我是将业务数据主表的FGuid赋给流程FlowValue
没有操作任务表
任务表应该系统自动维护的吧,
   //启动流程实例
      //lFlowControl.StartupFlow(lBizURL, 'APPLY', lExecutor, lFlowValue);
回复 支持 反对

使用道具 举报

发表于 2009-8-4 09:29:58 | 显示全部楼层
把你完整代码贴一下看看吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-4 09:50:43 | 显示全部楼层
//针对外售清单,启动物资领用流程
procedure TMRBD.BitBtn3Click(Sender: TObject);
var
  lFlowValue: TFlowValue;
  lFlowControl: TFlowControl;
  lExecutor: TOrgURL;
  lGuid,lMatCode: String;
  lNO,i: Integer;
  lQuantity, lValue: Double;
  lMatList,lGuidList: TStrings;
  lHandle: TTransactionHandle;
  lTransaction: TTransaction;
  lDataSet: TDataSet;
  lConnection: TConnection;
  lSqlStr,lSql:String;
begin

  lNO:=1;lQuantity:=0;lMatCode:='';
  lMatList := TStringList.Create;
  lGuidList := TStringList.Create;
  lFlowValue := TFlowValue.Create;
  lExecutor := TOrgURL.Create('XXB', 'ITGCS', 'LIUHY');
  lConnection:= dsSale.DataSet.Connection;
  with dsApplyMain.DataSet,dsApplyDetail do
  try

      if not Active then Open;
      //添加主流程数据
   Append ;
      lGuid:=FieldByName ('FGuid').AsString ;
      FieldByName ('FOutStore').AsString :='JD';
      FieldByName ('FMaterialRequisitionDept').AsString :=lExecutor.DeptID;
      FieldByName ('FMaterialRequisitioner').AsString :=lExecutor.PersonID;
      FieldByName ('FProcKind').AsString:='1';
      TCommonLib.GetStockBillNo(dsApplyMain.DataSet, FieldByName('FOutStore').AsString,  FieldByName('FBizKind').AsString, 'FStockBillNo');
      dsSale.DataSet.Filter:='FisSale=''T''';
      lSql:=  dsSale.DataSet.Filter;
      dsSale.DataSet.Filtered :=true;
      dsSale.DataSet.Open ;
      lNO:= dsSale.DataSet.RecordCount;
      if dsSale.DataSet.RecordCount <=0 then
      begin
        jsdialogs.ShowMsg ('你没有选择要外售的物资,不会启动物资领用任务!','');
        dsSale.DataSet.Filtered :=false;
        TSQLDataSet(dsSale.DataSet).SQLFilter:='FisBuy=''F''';
        TSQLDataSet(dsSale.DataSet).SQLFiltered :=true;
        dsSale.DataSet .Refresh ;
        exit;
      end;
      //添加明细数据
      DataSet.DisableControls ;
      dsSale.DataSet .DisableControls ;
      dsSale.DataSet .First ;
      if not DataSet.Active then DataSet.Open;
      while not dsSale.DataSet .Eof do
      begin
        DataSet.Append;
        DataSet.FieldByName('FMainID').AsString:=lGuid;
        lMatCode:= dsSale.DataSet.FieldByName ('FMatCode').AsString ;
        lQuantity:= dsSale.DataSet.FieldByName ('FRequestQuantity').AsFloat;
        lValue:= Sysutils.StrToFloatDef(lMatList.Values[lMatCode],0);
        lMatList.Values [lMatCode]:=Sysutils.FloatToStr(lQuantity+lValue);
        DataSet.FieldByName('FMatCode').AsString:=lMatCode;
        DataSet.FieldByName('FWeight').AsFloat:=dsSale.DataSet.FieldByName ('FSingleWeight').AsFloat ;
        DataSet.FieldByName('FApplyQuantity').AsFloat:=lQuantity;
        DataSet.Post ;
        lGuidList.Add(dsSale.DataSet.FieldByName ('FGuid').AsString);
        dsSale.DataSet.Next ;
        lNO:=lNO+1;
    end;
    lHandle:= lTransaction.Start(False);
    try

      lSqlStr:=StrUtils.AnsiReplaceText(sysutils.Trim(lGuidList.Text), #13#10, ''',''');
      lFlowValue.IDs.Add(lGuid);            //流程ID
      lFlowValue.Subject := '['+FieldByName('FStockBillNo').AsString+']'
                +FieldByName('FMaterialRequisitionDept').DisplayText +'-'+ FieldByName('FMaterialRequisitioner').DisplayText ;      //流程主题

      //启动流程实例
      //lFlowControl.StartupFlow(lBizURL, 'APPLY', lExecutor, lFlowValue);

      //流程实例数据保存到数据库
      //lFlowControl.FlowRunnerbyIndex[0].CurrentTask.SaveToDB;
      TCommonFunc.UserStartFlow(Context, lTransaction, lFlowValue, lExecutor, 'Biz:\SCMSPACE\ClaimMaterialFlow.Proc', 'APPLY');

      ApplyUpdates(True);
      jsdialogs.ShowMsg ('已经在你的工作台上启动了一个物资领用流程','');
      dsSale.DataSet.Filtered :=false;
      lConnection.ExecuteSQL('update MATREQUIRMENT set FisSale=''T'' where FGuid in ('+sysutils.QuotedStr(lSqlStr)+')');
      lTransaction.Commit(lHandle);
    except
      lTransaction.Rollback(lHandle);
    end;
  finally
    lFlowValue.Free;
    lMatList.Free ;
    dsSale.DataSet.EnableControls ;
    DataSet.EnableControls;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-4 09:58:15 | 显示全部楼层
lTransaction:= DataSet.Connection.Transaction;
      lConnection.Transaction:= lTransaction;
这两句是放在下面的位置,刚才复制时丢掉了
  try
      lTransaction:= DataSet.Connection.Transaction;
      lConnection.Transaction:= lTransaction;
      if not Active then Open;
      //添加主流程数据
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-4 10:07:41 | 显示全部楼层
zfang同志,麻烦你看一下,大概意思是,
  当选择一个清单列表里的若干个物资后,单击一下按钮,
就在按钮事件里,实现启动某个流程,并且将选择的数据,添加到将要启动的流程里作为业务数据,然后再更新这个清单列表所选物资选择标志置为真,
  考虑到,启动流程可能失败,提交业务数据可能失败,更新列表可能失败,所以,想把三者的提交做到一个事务里去,
  我贴出的代码,是将三者的事务都和业务数据的事务统一。
回复 支持 反对

使用道具 举报

发表于 2009-8-4 10:30:12 | 显示全部楼层
事务的话,可以尝试一下 FlowControl.FlowManager.Transaction这个流程锁使用的事务跟你的业务数据的事务相同就行。
回复 支持 反对

使用道具 举报

发表于 2009-8-4 10:31:19 | 显示全部楼层
1楼的问题跟你6楼代码,看不出来是哪里出问题。你调试看看具体任务数据怎么产生的。
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-18 12:23 , Processed in 0.045774 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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