起步软件技术论坛-X3

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

[分享]流程揭密2-流程中的控制**

[复制链接]
 楼主| 发表于 2007-11-23 09:18:59 | 显示全部楼层
如果用Query修改其他数据表中的数据,也可以跟流程放在一个事务中,只要指定Query对应的Transaction是流程的事务就可以了
比如:
procedure TMainForm.FlowBroker1AfterFlowOut(Sender: TObject; Command: TFlowOutCommand);
var
  lQry: TQuery;
  lConn: TConnection;
begin
  lQry := TQuery.Create(nil);
  lConn := TConnection.Create(nil);
  try
    lConn.ConnectionString := 'DATABASEURL=Biz:\OPERATION\OPERATIONDB.DATABASE';
    lConn.Transaction := FlowBroker1.FlowControl.FlowManager.Transaction;
    lQry.Connection := lConn;
    lQry.CommandText := 'Update CRM_PRODUCT set UOM=''1'' where PRODUCTID='''+DataSetBroker1.DataSet.FieldByName('PRODUCTID').AsString+'''';;
    lQry.Execute;
  finally
    lQry.Free;
    lConn.Free;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-23 10:58:20 | 显示全部楼层

根据业务数据中的字段,设定下一个环节的执行者

procedure TMainForm.FlowBroker1CreateFlowOutFlowTasks(Sender: TObject; Command: TFlowOutCommand);
var
  i: Integer;
  lField: TDataField;
  lFlowTask: TFlowTask;
begin
  for i:=0 to Command.FlowTasks.Count-1 do
  begin
    lFlowTask := Command.FlowTasks;
    if SysUtils.SameText(lFlowTask.ProcUnit.ID, 'ZJHJ1') then
      lField := DataSetBroker1.DataSet.FieldByName('PRODUCTTYPE')
    else if SysUtils.SameText(lFlowTask.ProcUnit.ID, 'ZJHJ2') then
      lField := DataSetBroker1.DataSet.FieldByName('PRODUCTTYPE')
    else
      lField := DataSetBroker1.DataSet.FieldByName('CONTENT');
    lFlowTask.ExecutorMustBeFuncOwner := False;
    lFlowTask.AllowExecutorRange := Org.OrgExpr.OrgChildren(Org.OrgExpr.OrgKey(lField.AsString, '', ''), '', True);
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-23 13:16:58 | 显示全部楼层

根据业务数据,决定是否可以流转

procedure TMainForm.FlowBroker1BeforeFlowOut(Sender: TObject; Command: TFlowOutCommand);
begin
  DataSetBroker1.DataSet.DisableControls;
  try
    DataSetBroker1.DataSet.First;
    while not DataSetBroker1.DataSet.Eof do
    begin
      if DataSetBroker1.DataSet.FieldByName('FNumber').IsNull then
      begin
        Command.Accept := False;
        Break;
      end;
      DataSetBroker1.DataSet.Next;
    end;
  finally
    DataSetBroker1.DataSet.EnableControls;
  end;
  if not Command.Accept then
    jsDialogs.ShowError('请输入所有记录的数量!', '不能流转');
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-23 14:30:49 | 显示全部楼层

在事件中决定条件分支环节或者条件环节的结果

在条件环节或者条件分支环节前的功能窗体上,可以截获OnCalcProcCondition,根据数据集中的数据确定表达式的值
Command.Accept 为真,表示表达式结果为真
Command.Accept 为假,表示表达式结果为假
Command.Handled表示计算完成,不会引发其他事件中计算这个表达式了
Command.ProcCondition对应的条件分支环节,当环节后面有多个条件环节或者条件分支环节时候,可以用这个属性来区分
procedure TMainForm.FlowBroker1CalcProcCondition(Sender: TObject; Command: TCalcProcConditionCommand);
var
  lSum: Integer;
begin
  DataSetBroker1.DataSet.DisableControls;
  try
    lSum := 0;
    DataSetBroker1.DataSet.First;
    while not DataSetBroker1.DataSet.Eof do
    begin
      Inc(lSum, DataSetBroker1.DataSet.FieldByName('FNumber').AsInteger);
      DataSetBroker1.DataSet.Next;
    end;
  finally
    DataSetBroker1.DataSet.EnableControls;
  end;
  Command.Accept := lSum>10000;
  Command.Handled := True;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-28 08:59:30 | 显示全部楼层

过程模型上访问功能或者信息上的数据集

2楼说的,过程模型上定义的事件始终会触发,在功能上定义的事件,只有在相应环节运行时候才会触发,那么在过程模型中触发的事件,如何访问功能,或者访问信息呢
流程控制FlowControl有一个Func的属性,对应当前环节的功能
注: 有关ObjectHelper,请参考 http://wiki.justep.cn/ObjectHelper
有关 环境,请参考 http://bbs.justep.com/forum.php?mod=viewthread&tid=19153
var
  lFunc: TFunc;
  lMainForm: TForm;
  lDataSet: TDataSet;
begin
  lFunc := Command.FlowControl.Func;
  //功能的主窗体属性
  lMainForm := ObjectHelper.GetPropertyValue(lFunc, 'MainForm', []) as TForm;
  //窗体上的数据集代理
  lDataSet := (ObjectHelper.GetFieldValue(lMainForm, 'DataSetBroker1') as TDataSetBroker).DataSet;
  Dialogs.ShowMessage(lDataSet.Fields[0].AsString);
end;

var
  lFunc: TFunc;
  lInfo: TInfo;
  lMainForm: TForm;
  lDataSet: TDataSet;
begin
  //功能环境的第一个子环境的Owner是信息,请参考 有关环境的说明
  lInfo := Command.FlowControl.Func.Context.Children[0].Owner as TInfo;
  lDataSet := lInfo.DataSetByID('BZSJJ1');
  Dialogs.ShowMessage(lDataSet.Fields[0].AsString);
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-28 14:40:33 | 显示全部楼层

过程模型上,用SQL语句修改数据

可以用上面给出的方法,通过数据集来访问流程字段的值
也可以直接用 FlowControl.Flow.ID 得到流程字段的值(如果是一个流程实例对应多条业务数据的,用 FlowControl.Flow.IDs )
procedure TYGLCSLDYDTYWSJLC.ProcAfterFlowFinish(Sender: TObject; Command: TFlowFinishCommand);
var
  i: Integer;
  lConn: TConnection;
  lParams: TParams;
  lParam: TDataParam;
  lSQL: String;
begin
  lParams := TParams.Create;
  lConn := TConnection.Create(nil);
  try
    lConn.ConnectionString := 'DATABASEURL=Biz:\OPERATION\OPERATIONDB.DATABASE';
    lConn.Transaction := Command.FlowControl.Transaction;
    lParam := lParams.CreateParam(TFieldType.ftString, 'id', TParamType.ptInput);
    lSQL := 'Update CRM_PRODUCT set UOM=''2'' where PRODUCTID=:id';
    for i:=0 to Command.FlowControl.Flow.IDs.Count-1 do
    begin
      lParam.AsString := Command.FlowControl.Flow.IDs;
      lConn.ExecuteSQL(lSQL, lParams, 1, '数据已被更改!');
    end;
  finally
    lParam.Free;
    lParams.Free;
    lConn.Free;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-5 09:27:28 | 显示全部楼层

流转对话框控制

系统默认的流转对话框在 系统空间\用户界面基础\界面库\系统接口\流转窗体 中定义

在代码中调用流转对话框,可以用
SystemCore.TSystemCore.SystemInterface.EditFlowOutFlowTasks(Command);

如果要修改所有流程的流转对话框,可以修改这个 EditFlowOutFlowTasks 调用自己的流转窗体
如果是在某个环节上用特定的流转对话框,可以在这个环节的 OnCreateFlowOutFlowTasks 事件中调用自己的流转对话框对Command中的FlowTasks做相应的操作,然后设置Command.UserConfirm:= False,来禁止系统默认的流转对话框。
例如:以下代码弹出流转对话框
procedure TMAINFORM.FlowBrokerCreateFlowOutFlowTasks(Sender: TObject; Command: TFlowOutCommand);
begin
  //在这里可以改调用自己的对话框
  Command.Accept :=   SystemCore.TSystemCore.SystemInterface.EditFlowOutFlowTasks(Command);
  Command.UserConfirm := False;
end;
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-1 11:06 , Processed in 0.045030 second(s), 13 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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