起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 231|回复: 8

【结帖】2827版本在流程监控中终止流程报错**

[复制链接]
发表于 2008-2-22 14:41:38 | 显示全部楼层 |阅读模式
错误提示如下图,在不升级的情况下要怎么解决

未命名.gif

6.75 KB, 下载次数: 164

回复

使用道具 举报

 楼主| 发表于 2008-2-22 16:11:29 | 显示全部楼层
请给个解决方法 版本是从2435按步骤升级至2827的
回复 支持 反对

使用道具 举报

发表于 2008-2-22 16:17:18 | 显示全部楼层
我在2826上没有问题啊,原来是好的吗?
是不是楼主的业务数据有问题啊?
请 跟踪一下代码看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-22 18:22:28 | 显示全部楼层
最初由 zfang 发布
[B]我在2826上没有问题啊,原来是好的吗?
是不是楼主的业务数据有问题啊?
请 跟踪一下代码看看 [/B]



2435版本上都是好的,业务数据没有问题,每个流程都不能终止,跟踪代码停留如下图所示,流程控制主窗体

未命名.jpg

38.17 KB, 下载次数: 151

回复 支持 反对

使用道具 举报

发表于 2008-2-23 10:17:43 | 显示全部楼层
楼主,这个在2827版本上测试是正常的。
在2827版本上没有找到楼主所说的流程监控主窗体和这段代码,
楼主跟踪一下lFlowList里面的内容是什么?

在流程监控库中流程终止的代码如下:
static function TFlowMonitorServices.AbortFlow(AFlow: TFlow): Boolean;
var
  lFlowControl: TFlowControl;
  lFlowList: TList;
  lCurrentTask: TTask;
  I: Integer;
begin
  Result := False;

  if AFlow = nil then
  begin
    jsDialogs.ShowMsg('请选择一个流程', '');
    Exit;
  end;
  if not(AFlow.State in [TFlowState.fsProcessing, TFlowState.fsWaiting]) then
  begin
    jsDialogs.ShowMsg('流程状态不能终止!', '');
    Exit;
  end;
  lFlowControl := TFlowControl.Create(BizSys.GlobalContext);
  try
    for I := 0 to AFlow.Tasks.Count - 1 do
    begin
      lCurrentTask := AFlow.Tasks[I];
      if lCurrentTask.State in [TTaskState.tsProcessing, TTaskState.tsStarted] then
        Break;
    end;
    lFlowControl.RegisterFlow(AFlow, lCurrentTask);

    if not lFlowControl.CanAbortFlow then
    begin
      JSDialogs.ShowMsg('此流程不能终止!', '');
      Exit;
    end;
    if JSDialogs.ConfirmBox(SysUtils.Format(msg_FlowAbortConfirm,
      [AFlow.DisplayName, AFlow.ID]), '', 2) then
    begin
      lFlowList := TList.Create;
      try
        //lFlowList.Add(AFlow);
     //   lFlowList.Add(lCurrentTask);
      //  lFlowControl.TaskAbort(nil);
        lFlowControl.FlowAbort(lFlowList);
        Result := True;
      finally
        lFlowList.Free;
      end;
    end;
  finally
    lFlowControl.UnRegisterFlow(AFlow, nil);
    lFlowControl.Free;
  end;
end;

与楼主给的代码有一些不同,请检查一下升级过程是否都正确完成呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-25 08:54:07 | 显示全部楼层
unit FLOWSTKOUTCTRLFORM;

interface

uses
  Business.System, Business.Forms, Business.Model,
  Business.Model.Org, Business.Model.Flow,
  SysFuncCommonUnit, SystemCore,
  BaseFlowBrowseFunc, BaseFlowStakeoutFunc;

type

  TFLOWSTKOUTCTRLFORM = class(BaseFlowStakeoutFunc.TBaseFlowStakeoutMainForm)
    actFlowBack: TAction;
    actFlowOut: TAction;
    actFlowTransmit: TAction;
    actFlowAbort: TAction;
    actTaskAbort: TAction;
    actModifyController: TAction;
    tbFlowBack: TToolButton;
    tbFlowOut: TToolButton;
    tbFlowTransmit: TToolButton;
    tbTaskAbort: TToolButton;
    tbFlowAbort: TToolButton;
    tbModifyController: TToolButton;
    mmiFlow: TMenuItem;
    N1: TMenuItem;
    pmiFlowAbort: TMenuItem;
    N2: TMenuItem;
    pmiFlowView: TMenuItem;
    N3: TMenuItem;
    pmiFlowBack: TMenuItem;
    pmiFlowOut: TMenuItem;
    pmiFlowTransmit: TMenuItem;
    pmiTaskAbort: TMenuItem;
    pmiModifyController: TMenuItem;
    pmiShowBizData: TMenuItem;
    mmiFlowBack: TMenuItem;
    mmiFlowOut: TMenuItem;
    mmiFlowTransmit: TMenuItem;
    mmiTaskAbort: TMenuItem;
    mmiFlowAbort: TMenuItem;
    mmiModifyController: TMenuItem;
    actAddExecutor: TAction;
    actCancelExecutor: TAction;
    pmiAddExecutor: TMenuItem;
    pmiCancelExecutor: TMenuItem;
    tbAddExecutor: TToolButton;
    tbCancelExecutor: TToolButton;
    procedure actFlowBackExecute(Sender: TObject);
    procedure actFlowOutExecute(Sender: TObject);
    procedure actFlowTransmitExecute(Sender: TObject);
    procedure actFlowAbortExecute(Sender: TObject);
    procedure actTaskAbortExecute(Sender: TObject);
    procedure actModifyControllerExecute(Sender: TObject);
    procedure actFlowAbortUpdate(Sender: TObject);
    procedure actModifyControllerUpdate(Sender: TObject);
    procedure BizFormShow(Sender: TObject);
    procedure actFlowBackUpdate(Sender: TObject);
    procedure actAddExecutorExecute(Sender: TObject);
    procedure actAddExecutorUpdate(Sender: TObject);
    procedure actCancelExecutorExecute(Sender: TObject);
    procedure actCancelExecutorUpdate(Sender: TObject);
  private
    {private declarations}
    function CreateFunc(const AContext: TContext; const ATask: TTask): TFunc;
    function GetFuncURL(const ATask: TTask): string;
//    function CreateOperatorURL: TOrgURL;
//    procedure ChangeTaskMsg(const AOrgURL: TOrgURL; ATask: TTask);
  protected
    function CreateFlowRangeDlg: TFlowRangeDlg; override;
    procedure DoFlowOperate(AFlowOperation: TFlowOperation);
    function HasActiveTaskMsg(const ATask: TTask): Boolean;
    function GetNewTaskMsgSequence(const ATask: TTask): Integer;
  public
    {public declarations}
  end;

  TFlowOperation = (foBack, foOut, foTransmit, foTaskAbort);

implementation

const
  //可以终止的流程状态
  csCanAbortFlowStates = [TFlowState.fsProcessing, TFlowState.fsPostPoned];
  //此常量定义了可以改变控制者的任务消息状态
  csCanModifyControllerStates = [TTaskMessageState.tmsSend, TTaskMessageState.tmsReceived,
    TTaskMessageState.tmsWaiting];
  {此常量定义了改变控制者时,新控制者的状态应于原来控制者一样的状态类型,
     如果不在此状态集合内,则新控制者的状态统一为“未接收”}
  csKeepOrginStates           = [TTaskMessageState.tmsWaiting];


  msg_FlowAbortConfirm = '确定要终止流程 "%s(%s)" 吗?';
  msg_CancelExecutor = '确定要取消执行者"%s%s%s"吗?';

  cFormat_BizDataCaption = '业务数据 [ %s ]';


procedure TFLOWSTKOUTCTRLFORM.actFlowBackExecute(Sender: TObject);
begin
  DoFlowOperate(TFlowOperation.foBack);
end;

procedure TFLOWSTKOUTCTRLFORM.actFlowOutExecute(Sender: TObject);
begin
  DoFlowOperate(TFlowOperation.foOut);
end;

procedure TFLOWSTKOUTCTRLFORM.actFlowTransmitExecute(Sender: TObject);
begin
  DoFlowOperate(TFlowOperation.foTransmit);
end;

procedure TFLOWSTKOUTCTRLFORM.actFlowAbortExecute(Sender: TObject);
var
  lFlowControl: TFlowControl;
  lFlow: TFlow;
  lFlowList: TList;
begin
  Inherited;
  lFlowControl := TFlowControl.Create(BizSys.GlobalContext);
  try
    lFlow := GetSelectedFlow;
    lFlowControl.RegisterFlow(lFlow, nil);
    if not lFlowControl.CanAbortFlow then
    begin
      JSDialogs.ShowMsg('此流程不能终止!', '');
      Exit;
    end;
    if JSDialogs.ConfirmBox(SysUtils.Format(msg_FlowAbortConfirm,
      [lFlow.DisplayName, lFlow.ID]), '', 2) then
    begin
      lFlowList := TList.Create;
      try
        lFlowList.Add(lFlow);
        lFlowControl.FlowAbort(lFlowList);
        ReloadProcFlow;
        RefreshFlowGrid;
      finally
        lFlowList.Free;
      end;
    end;
  finally
    lFlowControl.UnRegisterFlow(lFlow, nil);
    lFlowControl.Free;
  end;
end;

procedure TFLOWSTKOUTCTRLFORM.actTaskAbortExecute(Sender: TObject);
begin
  Inherited;
  DoFlowOperate(TFlowOperation.foTaskAbort);
end;

procedure TFLOWSTKOUTCTRLFORM.actModifyControllerExecute(Sender: TObject);
var
  lController: TControllerItem;
  lDialog: TSelSubordinationDlg;

  Save_Cursor: TCursor;
  lBizNode: TBizNode;
  lOrgURL: TOrgURL;
  lTask: TTask;
  lOrginTaskMsg, lNewTaskMsg: TTaskMessage;
  lFlow: TFlow;
begin
  Inherited;
  lController := GetSelectedController;
  if lController = nil then
    Exit;
  lDialog := TSelSubordinationDlg.Create(nil);
  try
    lDialog.Caption := '修改控制者';
    lDialog.PromptText :=
      '要修改当前控制者,请先从下面的组织模型树中选择要指定为控制者的组织单元,然后点击“确定”按钮即可。';
    lDialog.BizTreeView.ShowOptions := [TBizObjectKind.boOrgServer, TBizObjectKind.boFolder,
      TBizObjectKind.boOrgRoot, TBizObjectKind.boOrgan, TBizObjectKind.boDept,
      TBizObjectKind.boPositionMember, TBizObjectKind.boPersonMember,
      TBizObjectKind.boPositionRoot, TBizObjectKind.boPosition];
    lDialog.BizTreeView.SmartOptions := [TBizObjectKind.boFolder];
    lDialog.MustSelectedNode := [TBizObjectKind.boDept,
        TBizObjectKind.boPositionMember, TBizObjectKind.boPersonMember,
        TBizObjectKind.boPosition];
    lDialog.MultiSelect := False;
    lDialog.Init;

    if lDialog.ShowModal = Business.Forms.Controls.mrOK then
    begin
      Save_Cursor := Forms.Screen.Cursor;
      Forms.Screen.Cursor := Business.Forms.Controls.crHourGlass;
      try
        lBizNode := BizTree.BizTreeStructure.FindNodeByFullFileName(lDialog.Files[0]);
        if lBizNode <> nil then
        begin
          lOrgURL := TOrgURL.Create(lBizNode.BizURL);
          try
            lFlow := GetSelectedFlow;
            lTask := lFlow.Tasks.FindTaskByGUID(lController.Task.GUID);
            lOrginTaskMsg := lTask.TaskMessages.GetTaskMessage(lController.TaskMessage.GUID);
            if not (SysUtils.SameText(lOrginTaskMsg.ReceiverDeptID, lOrgURL.DeptID) and
              SysUtils.SameText(lOrginTaskMsg.ReceiverPositionID, lOrgURL.PositionID) and
              SysUtils.SameText(lOrginTaskMsg.ReceiverID, lOrgURL.PersonID)) then
            begin
              lNewTaskMsg := TTaskMessage.Create(lTask.TaskMessages);
              lNewTaskMsg.ParentGUID := lOrginTaskMsg.ParentGUID;
              if lOrginTaskMsg.State in csKeepOrginStates then
                 lNewTaskMsg.State := lOrginTaskMsg.State
              else
                lNewTaskMsg.State := TTaskMessageState.tmsSend;
              lNewTaskMsg.ReceiverDeptID := lOrgURL.DeptID;
              lNewTaskMsg.ReceiverPositionID := lOrgURL.PositionID;
              lNewTaskMsg.ReceiverID := lOrgURL.PersonID;
              lTask.TaskMessages.Add(lNewTaskMsg);

              lOrginTaskMsg.State := TTaskMessageState.tmsCanceled;
              Task.TaskManager.SaveTask(lTask);

              ReLoadFlowController(lFlow.GUID);
              RefreshControllerGrid;
            end;
          finally
            lOrgURL.Free;
          end;
        end;
      finally
        Forms.Screen.Cursor := Save_Cursor;
      end;
    end;
  finally
    lDialog.Free;
  end;
end;

procedure TFLOWSTKOUTCTRLFORM.actFlowAbortUpdate(Sender: TObject);
var
  lFlow: TFlow;
begin
  lFlow := GetSelectedFlow;
  if Assigned(lFlow) then
    actFlowAbort.Enabled := (lFlow.State in csCanAbortFlowStates)
  else
    actFlowAbort.Enabled := False;
end;

procedure TFLOWSTKOUTCTRLFORM.actModifyControllerUpdate(Sender: TObject);
var
  lController: TControllerItem;
begin
  Inherited;
  lController := GetSelectedController;
  if Assigned(lController) then
    actModifyController.Enabled := lController.TaskMessage.State in csCanModifyControllerStates
  else
    actModifyController.Enabled := False;
end;

function TFLOWSTKOUTCTRLFORM.CreateFlowRangeDlg: TFlowRangeDlg;
begin
  Result := TSysFlowRangeDlg.Create(Context);
end;

procedure TFLOWSTKOUTCTRLFORM.BizFormShow(Sender: TObject);
begin
  Inherited;
  {以下代码是为了解决ToolBar继承的按钮位置改动问题 }
  {tbFlowRange.Left := 700;
  tbRefresh.Left := 800;
  tbColumnSelector.Left := 900;

  tbFlowBack.Action := nil;
  tbFlowBack.Action := actFlowBack;
  tbFlowBack.Caption := '回退';

  tbFlowOut.Action := nil;
  tbFlowOut.Action := actFlowOut;
  tbFlowOut.Caption := '流转';

  tbFlowTransmit.Action := nil;
  tbFlowTransmit.Action := actFlowTransmit;
  tbFlowTransmit.Caption := '转发';

  tbTaskAbort.Action := nil;
  tbTaskAbort.Action := actTaskAbort;
  tbTaskAbort.Caption := '终止任务';

  tbFlowAbort.Action := nil;
  tbFlowAbort.Action := actFlowAbort;
  tbFlowAbort.Caption := '终止流程';

  tbModifyController.Action := nil;
  tbModifyController.Action := actModifyController;
  tbModifyController.Caption := '修改控制者';

  tbShowBizData.Action := nil;
  tbShowBizData.Action := actShowBizData;
  tbShowBizData.Caption := '业务数据';

  tbFlowView.Action := nil;
  tbFlowView.Action := actFlowView;
  tbFlowView.Caption := '浏览';}
end;

procedure TFLOWSTKOUTCTRLFORM.actFlowBackUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := False;
  //(Sender as TAction).Enabled := (CurrentSelTask <> nil);
end;

procedure TFLOWSTKOUTCTRLFORM.DoFlowOperate(AFlowOperation: TFlowOperation);
{var
  lFlowControl: TFlowControl;
  lOrgURL: TOrgURL;
  lFunc: TFunc;
  lResult: Boolean;
  lDoTask: TTask;}
begin
  {是否提供各种动作,还未定,暂且屏蔽
  if CurrentSelTask = nil then
    Exit;
  lDoTask := TTask.Create;
  try
    lDoTask.Assign(CurrentSelTask);
    lFlowControl := TFlowControl.Create(BizSys.GlobalContext);
    lFunc := CreateFunc(lFlowControl.Context, lDoTask);
    lOrgURL := CreateOperatorURL;
    try
      ChangeTaskMsg(lOrgURL, lDoTask);
      lFlowControl.ExecuteTask(lDoTask, lOrgURL);
      lFlowControl.Func := lFunc;
      lFunc.Run('');
      case AFlowOperation of
        TFlowOperation.foBack:
          lResult := lFlowControl.FlowBack(nil);
        TFlowOperation.foOut:
          lResult := lFlowControl.FlowOut(nil);
        TFlowOperation.foTransmit:
          lResult := lFlowControl.FlowTransmit(nil);
        TFlowOperation.foTaskAbort:
          lResult := lFlowControl.TaskAbort(nil);
      end;
      if lResult then
      begin
        ReloadProcFlow(GetSelectedProcNode);
        RefreshFlowGrid;
      end
      else
      begin}
        {恢复。保存后任务消息不变,需要内部支持}
        //Task.TaskManager.SaveTask(CurrentSelTask);
  {    end;
    finally
      lFunc.Free;
      lOrgURL.Free;
      lFlowControl.Free;
    end;
  finally
    lDoTask.Free;
  end;}
end;

{function TFlowStkoutCtrlForm.CreateOperatorURL: TOrgURL;
var
  lOrgURL: TOrgURL;
begin
  lOrgURL := TOrgURL.Create;
  try
    lOrgURL.SetBizURL(TSysFuncCommonUnit.GetPersonMember(Context).BizURL);
    Result := TOrgURL.Create(lOrgURL.DeptID, lOrgURL.PositionID,
      lOrgURL.PersonID);
  finally
    lOrgURL.Free;
  end;
end;}

function TFLOWSTKOUTCTRLFORM.GetFuncURL(const ATask: TTask): string;
var
  lProcURL: TBizURL;
  lProc: TProc;
begin
  lProcURL := TBizURL.Create;
  try
    lProcURL.URL := ATask.ProcURL;
    lProc := TProc(Business.Model.BizSys.BizSystem.GetBizObject(lProcURL));
    Result := TProcActivity(lProc.GetUnit(ATask.ProcUnitID)).FuncURL.URL;
  finally
    lProcURL.Free;
  end;
end;

function TFLOWSTKOUTCTRLFORM.CreateFunc(const AContext: TContext; const ATask: TTask): TFunc;
var
  lFuncURL: string;
  lBizObject: TBizObject;
  lBizClassURL: TBizClassURL;
begin
  lBizClassURL := TBizClassURL.Create;
  Try
    lFuncURL := GetFuncURL(ATask);
    lBizClassURL.BizURL.URL := lFuncURL;
    lBizObject := BizSys.BizService.CreateBizObject(lBizClassURL, Context);
    try
      Result := lBizObject as TFunc;
    except
      lBizObject.Free;
      raise;
    end;
  finally
    lBizClassURl.Free;
  end;
end;

{procedure TFlowStkoutCtrlForm.ChangeTaskMsg(const AOrgURL: TOrgURL; ATask: TTask);
var
  I: Integer;
  lTaskMsg: TTaskMessage;
  lNewMsg: TTaskMessage;
begin
  {for I := 0 to ATask.TaskMessages.Count - 1 do
  begin
    lTaskMsg := ATask.TaskMessages.Items[I];
    if lTaskMsg.State in Flow.SProcessingTaskMessageStates then
      lTaskMsg.State := TTaskMessageState.tmsCanceled;
  end;
  ATask.TaskMessages.AddTaskMessage(nil, AOrgURL, TTaskMessageState.tmsSend);
  Task.TaskManager.SaveTask(ATask);
end;}

procedure TFLOWSTKOUTCTRLFORM.actAddExecutorExecute(Sender: TObject);
var
  lController: TControllerItem;
  lDialog: TSelSubordinationDlg;
  Save_Cursor: TCursor;
  lBizNode: TBizNode;
  lOrgURL: TOrgURL;
  lTask: TTask;
  lFlow: TFlow;
  lExecuteMode: TTaskExecuteMode;
  lSequence: Integer;
begin
  lController := GetSelectedController;
  if lController = nil then
    Exit;

  lDialog := TSelSubordinationDlg.Create(nil);
  try
    lDialog.Caption := '添加执行者';
    lDialog.PromptText :=
      '要添加执行者,请先从下面的组织模型树中选择要添加的组织单元,然后点击“确定”按钮即可。';
    lDialog.BizTreeView.ShowOptions := [TBizObjectKind.boOrgServer, TBizObjectKind.boFolder,
      TBizObjectKind.boOrgRoot, TBizObjectKind.boOrgan, TBizObjectKind.boDept,
      TBizObjectKind.boPositionMember, TBizObjectKind.boPersonMember,
      TBizObjectKind.boPositionRoot, TBizObjectKind.boPosition];
    lDialog.BizTreeView.SmartOptions := [TBizObjectKind.boFolder];
    lDialog.MustSelectedNode := [TBizObjectKind.boDept,
        TBizObjectKind.boPositionMember, TBizObjectKind.boPersonMember,
        TBizObjectKind.boPosition];
    lDialog.MultiSelect := False;
    lDialog.Init;

    if lDialog.ShowModal = Business.Forms.Controls.mrOK then
    begin
      Save_Cursor := Forms.Screen.Cursor;
      Forms.Screen.Cursor := Business.Forms.Controls.crHourGlass;
      try
        lBizNode := BizTree.BizTreeStructure.FindNodeByFullFileName(lDialog.Files[0]);
        if lBizNode <> nil then
        begin
          lOrgURL := TOrgURL.Create(lBizNode.BizURL);

          lFlow := GetSelectedFlow;
          lTask := lFlow.Tasks.FindTaskByGUID(lController.Task.GUID);

          lSequence := 0;
          lExecuteMode := lTask.ExecuteMode;
          case lExecuteMode of
            TTaskExecuteMode.emSequential:
              begin
                lSequence := GetNewTaskMsgSequence(lTask);
                lTask.TaskMessages.AddTaskMessage(nil, lOrgURL, TTaskMessageState.tmsWaiting,
                  lSequence, False);
              end;
          else
            lTask.TaskMessages.AddTaskMessage(nil, lOrgURL, TTaskMessageState.tmsSend,
              lSequence, False);
          end;

          Task.TaskManager.SaveTask(lTask);

          ReLoadFlowController(lFlow.GUID);
          RefreshControllerGrid;
        end;
      finally
        Forms.Screen.Cursor := Save_Cursor;
      end;
    end;
  finally
    lDialog.Free;
  end;
end;

procedure TFLOWSTKOUTCTRLFORM.actAddExecutorUpdate(Sender: TObject);
var
  lTask: TTask;
begin
  lTask := GetCurrentSelTask;
  actAddExecutor.Enabled := (lTask <> nil) and
    (lTask.State in Task.SProcessingTaskStates);
end;

procedure TFLOWSTKOUTCTRLFORM.actCancelExecutorExecute(Sender: TObject);
var
  lController: TControllerItem;
  lTask: TTask;
  lTaskMsg: TTaskMessage;
  lFlow: TFlow;
  lDeptName, lPositionName, lPersonName: string;
begin
  lController := GetSelectedController;
  if lController = nil then
    Exit;

  lFlow := GetSelectedFlow;
  lTask := lFlow.Tasks.FindTaskByGUID(lController.Task.GUID);
  lTaskMsg := lTask.TaskMessages.GetTaskMessage(lController.TaskMessage.GUID);
  lDeptName := '';
  lPositionName := '';
  lPersonName := '';
  GetReceiverName(lTaskMsg, lDeptName, lPositionName, lPersonName);
  if JSDialogs.ConfirmBox(SysUtils.Format(msg_CancelExecutor,
      [lDeptName, lPositionName, lPersonName]), '', 2) then
  begin
    lTaskMsg.State := TTaskMessageState.tmsCanceled;
    Task.TaskManager.SaveTask(lTask);

    ReLoadFlowController(lFlow.GUID);
    RefreshControllerGrid;
  end;
end;

procedure TFLOWSTKOUTCTRLFORM.actCancelExecutorUpdate(Sender: TObject);
var
  lTask: TTask;
  lTaskMsg: TTaskMessage;
begin
  lTask := GetCurrentSelTask;
  lTaskmsg := GetCurrentSelTaskMessage;
  actCancelExecutor.Enabled := ((lTaskMsg <> nil) and
    (lTaskMsg.State in csCanModifyControllerStates)) and
    ((lTask <> nil) and HasActiveTaskMsg(lTask));
end;

function TFLOWSTKOUTCTRLFORM.HasActiveTaskMsg(const ATask: TTask): Boolean;
var
  I: Integer;
  lTaskMsg: TTaskMessage;
  lActiveCount: Integer;
begin
  Result := False;
  lActiveCount := 0;
  for I := 0 to ATask.TaskMessages.Count - 1 do
  begin
    lTaskMsg := ATask.TaskMessages.Items[I];
    if (lTaskMsg.Parent = nil) and (lTaskMsg.State in Task.SActiveTaskMessageStates) then
    begin
      lActiveCount := lActiveCount + 1;
      if lActiveCount >= 2 then
      begin
        Result := True;
        Exit;
      end;
    end;
  end;
end;

function TFLOWSTKOUTCTRLFORM.GetNewTaskMsgSequence(const ATask: TTask): Integer;
var
  I: Integer;
  lSequence: Integer;
  lTaskMsg: TTaskMessage;
begin
  lSequence := 0;
  for I := 0 to ATask.TaskMessages.Count - 1 do
  begin
    lTaskMsg := ATask.TaskMessages.Items[I];
    if (lTaskMsg.Parent = nil) and (lTaskMsg.Sequence > lSequence) then
      lSequence := lTaskMsg.Sequence;
  end;
  Result := lSequence + 1;
end;

end.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-25 08:57:39 | 显示全部楼层
这是全部的流程监控主窗体代码,我们升选择的是保留原有的业务功能树方式,这样是不是造成部分资源包不升级,怎样替换成正确的内容,升级过程中没有报错,我的电话是13858153739 希望电话沟通一下,事情比较急

报错时,监视lFlowList是空对象

未命名.jpg

37.86 KB, 下载次数: 139

回复 支持 反对

使用道具 举报

发表于 2008-2-25 09:16:30 | 显示全部楼层
楼主给的流程监控主窗体的代码都是 废弃 的
运行一下:业务模型\系统空间\系统功能\业务流程\流程监控\流程监控看一下能否终止呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-25 11:28:43 | 显示全部楼层
OK 搞定了
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-7 14:39 , Processed in 0.044503 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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