起步软件技术论坛-X3

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

【结】如何准确访问当前任务的后续任务**

[复制链接]
发表于 2008-4-1 09:32:51 | 显示全部楼层
给我们来个电话吧,
http://bbs.justep.com/announcement.php?s=&forumid=25

原理就是 (因为B是默认环节,所以就能找到,如果要找到C必须把B环节的接收者去掉)如果不用代码你用流转界面你也会看到如果B有接收者,C肯定是选不中的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-1 11:05:52 | 显示全部楼层
根据流程下一个环节的执行规则,创建流程任务FlowTask触发OnCreateFlowOutFlowTasks事件
现在的需求是用户在弹出流传窗体后,默认选择环节B,有需要的时候再取消默认执行者去选择环节C。
OnCreateFlowOutFlowTasks貌似不能满足需求。
有其它的办法解决吗?
回复 支持 反对

使用道具 举报

发表于 2008-4-1 11:23:13 | 显示全部楼层
OnCreateFlowOutFlowTasks貌似不能满足需求。
哪里不满足需求呢?请具体说说,另外,把你的代码帖出来看看。如果没有做,你先尝试做一下,跟踪看一下代码,看一下效果。
(实现的方法,是增加一个字段或者一个变量出来,默认赋值为0,如果要走C赋值1,然后在OnCreateFlowOutFlowTasks 事件上判断该字段或者变量的值是0,还是1,如果是0,给B赋执行者,如果是1,去掉B环节的执行者,给C赋执行者)

有其它的办法解决吗?
你这样的问题,默认走B,偶尔走C,且你需要根据你自己的业务数据来设定执行者,只能这样,A环节的 onCreateFlowOutFlowTasks 来做
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-1 13:23:22 | 显示全部楼层
我1楼的代码就是OnCreateFlowOutFlowTasks事件当中的代码。
您细想想,当触发该事件的时候,默认环节是B,由用户取消执行者,想选择环节C。
您给的办法根本就不可能在这个时候触发啊?!是在流转窗口出来之前就触发了……
还有其它的事件么?
回复 支持 反对

使用道具 举报

发表于 2008-4-1 13:38:38 | 显示全部楼层
OnCreateFlowOutFlowTasks 这个事件点击流转按钮,出来流转对话框前就触发了,你那边没有触发?你设置断点跟踪过?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-1 14:19:45 | 显示全部楼层
能触发,但这不是能不能触发的问题,而是触发了解决不了我的需求。
您再看看帖子的内容。
回复 支持 反对

使用道具 举报

发表于 2008-4-1 14:59:52 | 显示全部楼层
请把你现在实现的所有代码帖出来我看看,
(仅仅1楼的代码肯定不行,需要结合我13楼的方案哦)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-1 15:15:02 | 显示全部楼层
代码如下:
unit SHBD;

interface

uses
  Business.System, Business.Model, Business.Forms, Business.Model.Flow, Business.Data;

type
  TSHBD = class(TFormDoc)
    InfoBroker: TInfoBroker;
    DocView1: TDocView;
    FlowBroker1: TFlowBroker;
    Panel1: TPanel;
    ToolBar1: TToolBar;
    ToolButton2: TToolButton;
    ToolButtonDropTicket: TToolButton;
    ToolButton1: TToolButton;
    DataNavigator1: TDataNavigator;
    DocViewBar: TDocViewBar;
    ImageList1: TImageList;
    ActionList1: TActionList;
    ActDropTicket: TAction;
    procedure FlowBroker1CreateFlowOutFlowTasks(Sender: TObject; Command: TFlowOutCommand);
    procedure ActDropTicketExecute(Sender: TObject);
  private
    {private declarations}
  public
    {public declarations}
  end;

implementation

procedure TSHBD.FlowBroker1CreateFlowOutFlowTasks(Sender: TObject; Command: TFlowOutCommand);
var
  lQuery: TQuery;
  lFlowID, lDeptID: string;
  lFlowOrder, lFlowCount, lRATIFY: integer;
  lFlowTask: TFlowTask;
  lRange: String;
  lUnits: TList;
  i: integer;
begin
  //exit;


  // 修改流转顺序表
  lQuery := TQuery.Create(nil);
  //lUnits := TList.Create;
  try
    lQuery.ConnectionString := 'DATABASEURL=Biz:\DDJHXT\MAINTAIN.Database';
    // 判断数据唯一性
    lQuery.Close;
    lQuery.CommandText := 'select * from T_FLOWQUEUE where REQUISITION_ID = ''' + FlowBroker1.FlowControl.Flow.ID + '''';
    lQuery.Open;
    if not lQuery.IsEmpty then
    begin
      lQuery.Delete;
      lQuery.ApplyUpdates();
    end;

    lQuery.Close;
    lQuery.CommandText := 'select * from T_TICKETFLOWMODE where REQUISITION_ID = ''' + FlowBroker1.FlowControl.Flow.ID + ''' order by IS_RATIFY, FLOW_ORDER';
    lQuery.Open;
    if not lQuery.IsEmpty then
    begin
      lFlowID := lQuery.FieldByName('REQUISITION_ID').AsString;
      lFlowOrder := lQuery.FieldByName('FLOW_ORDER').AsInteger;
      lFlowCount := lQuery.RecordCount;
      lDeptID := lQuery.FieldByName('DEPARTMENT_ID').AsString;
      lRATIFY := lQuery.FieldByName('IS_RATIFY').AsInteger;
      lQuery.Close;
      lQuery.CommandText := 'insert into T_FLOWQUEUE Values(''' + lFlowID + ''', ' + SysUtils.inttostr(lFlowOrder) + ', ' + SysUtils.inttostr(lFlowCount) + ', ''' + lDeptID + ''', ''' + SysUtils.inttostr(lRATIFY) + ''')';
      lQuery.Execute;
    end;
    // 指定下一环节的执行者
    lQuery.Close;
    lQuery.CommandText := 'select * from T_FLOWQUEUE where REQUISITION_ID = ''' + FlowBroker1.FlowControl.Flow.ID + '''';
    lQuery.Open;

    //Command.FlowControl.CurrentProcUnit.GetSuccedentUnits(lUnits,
    //  [TProcUnitKind.ukActivity], [TProcUnitKind.ukActivity]);  // ukActivity表示活动环节
    //for i := 0 to lUnits.Count - 1 do
    //begin
    //  if SysUtils.UpperCase(TProcUnit(lUnits).ID) = 'YCSBLZGN' then
    //  begin
    //    TProcUnit(lUnits[I]).
    //  end;
    //end;
    lFlowTask := Command.FlowTasks.FindFlowTask('YCSBLZGN');
    //lFlowTask := Command.FlowTasks.FindFlowTask('HSYWGN');
    if lFlowTask <> nil then
    begin
      lRange := 'OrgChildren(OrgKey('''+lQuery.FieldByName('DEPARTMENT_ID').AsString+''','''',''''), '''', True, False)';
      lFlowTask.ExecutorMustBeFuncOwner:=True;       //执行者必须是功能拥有者
      lFlowTask.ExecutorAmount:= TTaskExecutorAmount.teaMulti; //TTaskExecutorAmount.teaMulti;  //执行者范围 多个
      //    lFlowTask.ExecutorAmount:=TTaskExecutorAmount.teaOne;  //执行者范围 单个
      lFlowTask.ExecutorKinds := [TTaskExecutorKind.ekPersonMember]; //执行者类型   人员成员
      lFlowTask.AllowExecutorRange:=lRange;  //限定执行者范围
      lFlowTask.ExecutorRange:=lRange; //默认执行者范围
      //lFlowTask.ExecuteMode := TTaskExecuteMode.emSimultaneous ;  //任务执行方式  同时执行
      //    lFlowTask.ExecuteMode := TTaskExecuteMode.emSimultaneous ;  //任务执行方式  同时执行
      //    lFlowTask.ExecuteMode := TTaskExecuteMode.emExclusive ;  //任务执行方式  独立执行
          lFlowTask.ExecuteMode := TTaskExecuteMode.emMonopolize ;  //任务执行方式  独占方式
      //    lFlowTask.ExecuteMode := TTaskExecuteMode.emSequential ;  //任务执行方式  顺序执行
      lFlowTask.PreemptMode :=TTaskPreemptMode.omFirstOpen;  //抢占方式 第一个打开
      //    lFlowTask.PreemptMode :=TTaskPreemptMode.omFirstProcess; //抢占方式 第一个处理
      lFlowTask.AssignMode := TTaskAssignMode.amSingleness;//TTaskAssignMode.amSingleness;  //任务分配方式   独立分配
      //    lFlowTask.AssignMode := TTaskAssignMode.amTogether;    //任务分配方式   共同分配
    end;
  finally
    lQuery.Free;
    //lUnits.Free;
  end;

  {lQuery := TQuery.Create(nil);
  try
    lQuery.ConnectionString := 'DATABASEURL=Biz:\DDJHXT\MAINTAIN.Database';
    lQuery.Close;
    lQuery.CommandText := 'select * from T_FLOWQUEUE where REQUISITION_ID = ''' + FlowBroker1.FlowControl.Flow.ID + '''';
    lQuery.Open;
  finally
    lQuery.Free;
  end; }
end;

procedure TSHBD.ActDropTicketExecute(Sender: TObject);
var myform:TFPCT;
begin
try
   myform:=TFPCT.Create(context);
   myform.ShowModal;
finally
   myform.Free;
end;
end;

对13#的解决方案:A环节的 onCreateFlowOutFlowTasks触发时环节B必须是默认的环节,所以根本不能在这里进行判断。

end.
回复 支持 反对

使用道具 举报

发表于 2008-4-1 15:36:04 | 显示全部楼层
楼主,啥意思,B和C是否只能走一个,要么B要么C,是吗?
那你定义不要用XOR环节了,直接用OR,走B给B赋执行者,走C给C赋执行者。你看这样是否可行。

原先的意思是用变量或者字段的值来区分要走B还是走C,默认走B,给个初值就走B,如果要C,那么直接在点击流转前给变量或者字段赋另一个值,这样清空B的执行者,然后走C,给C赋执行者

如果还不理解,再给我来个电话
回复 支持 反对

使用道具 举报

发表于 2008-4-8 09:17:27 | 显示全部楼层
楼主,实现的咋样了,无论结果如何,都请跟帖反馈

如果还是不行,请把你的代码和效果图都帖上来,我看看
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-13 10:55 , Processed in 0.043325 second(s), 14 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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