起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 302|回复: 10

【结】修改批处理环节中的任务主题**

[复制链接]
发表于 2008-6-11 17:17:24 | 显示全部楼层 |阅读模式
流程的启动规则中有对流程主题的定义
表达式中根据业务参数拼接出流程主题
如图:

启动规则.jpg

50.89 KB, 下载次数: 168

回复

使用道具 举报

 楼主| 发表于 2008-6-11 17:18:30 | 显示全部楼层
需要修改主题的任务所对应的环节(注意图中该环节的任务取值规则)
如图:

对票.jpg

49.65 KB, 下载次数: 170

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-11 17:21:01 | 显示全部楼层
在2#提供的图片中的“检修对票”环节的前驱环节所对应的信息中对流程主题修改的代码如下:
procedure TJXDPLHS.FlowAction1BeforeAction(Sender: TObject; var Accept: Boolean);
var
  i: Integer;
  lTask: TTask;
  lTasks: TList;
  lStringList : TStringList;
  lQuery : TQuery;
begin
  lQuery := TQuery.Create(nil);
  lQuery.ConnectionString:='DATABASEURL=Biz:\DDJHXT\MAINTAIN.Database';
  lTasks := TList.Create;
  try
    for i:= FlowBroker1.FlowControl.TaskCount - 1 downto 0 do
    begin
      lTask := FlowBroker1.FlowControl.TaskByIndex;
      if  (DataSetBroker1.DataSet.Locate('REQUISITION_ID',lTask.BizDatas.Items[0].BizDataKeys.Items[0].Value,[TLocateOption.loCaseInsensitive])) then
      begin
      lTasks.Clear;
      lTasks.Add(lTask);
      ID := Variants.VarToStr(lTask.BizDatas.Items[0].BizDataKeys.Items[0].Value);
      lQuery.Close;
      lQuery.CommandText := 'select * from T_GENMAINTENANCESCHEDULING where REQUISITION_ID = ''' + ID + '''';
      lQuery.Open;
      if not lQuery.IsEmpty then
      begin
        try
          lStringList := TStringList.Create();
          try
            lStringList := JXZY.TJXZY.SplitString(lTask.Subject, '||');
            lStringList[1] := lQuery.FieldByName('REAL_START_TIME').AsString;
            lStringList[2] := lQuery.FieldByName('REAL_END_TIME').AsString;
            lStringList[3] := lQuery.FieldByName('UNIT_ID').AsString;
            lStringList[4] := lQuery.FieldByName('EQUIPMENT_ID').AsString;
            lTask.Subject := lStringList[0] + '||' + lStringList[1] + '||' + lStringList[2] + '||' + lStringList[3] + '||' + lStringList[4];
            lTask.SaveToDB;
          finally
            lStringList.Free;
          end;
        except
          //
        end;
      end;
      FlowBroker1.FlowControl.FlowOut(lTasks);
      first_flowed:='是';
      Accept := false;
      end;
    end;
  finally
    lTasks.Free;
    lQuery.Free;
  end;
回复 支持 反对

使用道具 举报

发表于 2008-6-11 17:50:08 | 显示全部楼层
你把3楼的代码放到 AfterFlowOut  事件上去做,并屏蔽3楼代码的FlowBroker1.FlowControl.FlowOut(lTasks); 这句
你现在是先修改任务,然后再FlowOut,还没有产生任务呢,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-11 18:27:19 | 显示全部楼层
首先,代码修改如下:
procedure TJXDPLHS.FlowAction1BeforeAction(Sender: TObject; var Accept: Boolean);
var
  i: Integer;
  lTask: TTask;
  lTasks: TList;
  lStringList : TStringList;
  lQuery : TQuery;
begin
  lQuery := TQuery.Create(nil);
  lQuery.ConnectionString:='DATABASEURL=Biz:\DDJHXT\MAINTAIN.Database';
  lTasks := TList.Create;
  try
    for i:= FlowBroker1.FlowControl.TaskCount - 1 downto 0 do
    begin
      lTask := FlowBroker1.FlowControl.TaskByIndex;
      if  (DataSetBroker1.DataSet.Locate('REQUISITION_ID',lTask.BizDatas.Items[0].BizDataKeys.Items[0].Value,[TLocateOption.loCaseInsensitive])) then
      begin
      lTasks.Clear;      
      ID := Variants.VarToStr(lTask.BizDatas.Items[0].BizDataKeys.Items[0].Value);
      lQuery.Close;
      lQuery.CommandText := 'select * from T_GENMAINTENANCESCHEDULING where REQUISITION_ID = ''' + ID + '''';
      lQuery.Open;
      if not lQuery.IsEmpty then
      begin
        try
          lStringList := TStringList.Create();
          try
            lStringList := JXZY.TJXZY.SplitString(lTask.Subject, '||');
            lStringList[1] := lQuery.FieldByName('REAL_START_TIME').AsString;
            lStringList[2] := lQuery.FieldByName('REAL_END_TIME').AsString;
            lStringList[3] := lQuery.FieldByName('UNIT_ID').AsString;
            lStringList[4] := lQuery.FieldByName('EQUIPMENT_ID').AsString;
            lTask.Subject := lStringList[0] + '||' + lStringList[1] + '||' + lStringList[2] + '||' + lStringList[3] + '||' + lStringList[4];
            lTask.SaveToDB;
          finally
            lStringList.Free;
          end;
        except
          //
        end;
      end;
      lTasks.Add(lTask);
      FlowBroker1.FlowControl.FlowOut(lTasks);
      first_flowed:='是';
      Accept := false;
      end;
    end;
  finally
    lTasks.Free;
    lQuery.Free;
  end;
其中lTasks.Add(lTask);挪到了下面。斑竹说的没有产生任务是什么意思??我跟踪代码看lTask的对象是有内容的,并且是我想要的那条任务。
其次,按照斑竹给的方法,在原事件中调用流转:FlowBroker1.FlowControl.FlowOut(nil);
在FlowOut事件中写3#的代码。效果依旧,主题还是起始任务生成时的主题,既不是上一环节,也不是我修改的。
回复 支持 反对

使用道具 举报

发表于 2008-6-11 19:01:34 | 显示全部楼层
那需要做例子测试一下了,明天给结果吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-12 08:55:50 | 显示全部楼层
顶一下,斑竹辛苦了。
回复 支持 反对

使用道具 举报

发表于 2008-6-12 11:20:31 | 显示全部楼层
楼上代码修改的是当前环节的任务主题。
如果要修改流转到下一环节后,产生的新任务主题,应该在AfterFlowout或者OnCreateFlowOutTasks中修改。
回复 支持 反对

使用道具 举报

发表于 2008-6-12 11:21:12 | 显示全部楼层
楼主,你现在在哪个公司工作?
我刚才打电话到科东公司找你,HR说你离职了。
回复 支持 反对

使用道具 举报

发表于 2008-6-12 15:25:23 | 显示全部楼层
procedure TMainForm.BizFormClose(Sender: TObject; var Action: TCloseAction);
var
  lTasks: TList;
  lFlow: TFlow;
  lCurrentTask: TTask;
  i, j: integer;
begin
  Action := TCloseAction.caFree;

  lTasks := TList.Create;
  for i := FlowBroker1.FlowControl.FlowCount-1 downto 0 do
    begin
      lFlow := FlowBroker1.FlowControl.FlowByIndex;
      lCurrentTask := FlowBroker1.FlowControl.TaskByIndex;
      lTasks.Clear;

      lFlow.GetLastTasksByTask(lCurrentTask, lTasks);
      for j := lTasks.Count-1 downto 0 do
        begin
          TTask(lTasks.Items[j]).Subject := getTaskSubjectFromDataset(lCurrentTask);
          TTask(lTasks.Items[j]).SaveToDB;
        end;
    end;
  lTasks.Free;
end;
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-17 13:56 , Processed in 0.042973 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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