起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 195|回复: 3

【结帖】删除任务流程的存储过程[请求]**

[复制链接]
发表于 2008-1-5 10:19:51 | 显示全部楼层 |阅读模式
保存新的单据后,创建了任务流程。现在要把保存的单据删除掉,同时将产生的任务流程删除掉,我自己写了个存储过程,不知道是否正确,请给与指导,谢谢!!!
CREATE OR REPLACE PROCEDURE proc_del_flow_task (                --删除流程任务
                                                as_bill_guid VARCHAR2)
AS
   CURSOR cur_flow
   IS
      SELECT fid, fguid
        FROM tflow;

   lb_fid           BLOB;
   li_amount        INTEGER;
   li_offset        INTEGER;
   ls_hexstr        VARCHAR2 (100);
   ls_bill_guid     VARCHAR2 (100);
   lbl_find         BOOLEAN;
   ls_tflow_fguid   VARCHAR2 (100);
BEGIN
   li_amount := 100;
   li_offset := 1;
   lbl_find := FALSE;

   OPEN cur_flow;

   LOOP
      FETCH cur_flow
       INTO lb_fid, ls_tflow_fguid;

      EXIT WHEN cur_flow%NOTFOUND;
      DBMS_LOB.READ (lb_fid, li_amount, li_offset, ls_hexstr);
      ls_bill_guid := func_hex_to_asc (ls_hexstr);--该函数是将16进制数字转换为字符串
      --只截取前32位字符
      ls_bill_guid := SUBSTR (ls_bill_guid, 1, 32);

      IF ls_bill_guid = as_bill_guid
      THEN
         lbl_find := TRUE;
         EXIT;
      END IF;
   END LOOP;

   CLOSE cur_flow;

   IF lbl_find
   THEN
       --找到了单据guid对应的流程ID了
      --根据tflow.fguid = tflowid.FFLOWGUID的关联关系删除流程ID表的记录
      DELETE FROM tflowid
            WHERE fflowguid = ls_tflow_fguid;

      --根据tflow.fguid = ttask.FFLOWGUID的关联关系
      --以及ttask.fguid = TTASKMESSAGE.FTASKGUID的关联关系,删除任务消息表TTASKMESSAGE中的记录
      DELETE FROM ttaskmessage a
            WHERE EXISTS (
                     SELECT 1
                       FROM ttask b
                      WHERE a.ftaskguid = b.fguid
                        AND b.fflowguid = ls_tflow_fguid);

      --再根据ttask.fguid = TTASKBIZDATA.FTASKGUID的关联关系,删除任务业务数据表TTASKBIZDATA中的记录
      DELETE FROM ttaskbizdata a
            WHERE EXISTS (
                     SELECT 1
                       FROM ttask b
                      WHERE a.ftaskguid = b.fguid
                        AND b.fflowguid = ls_tflow_fguid);

      --然后删除任务表TTASK的记录
      DELETE FROM ttask
            WHERE fflowguid = ls_tflow_fguid;

      --最后删除流程表对应记录
      DELETE FROM tflow
            WHERE fguid = ls_tflow_fguid;
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      RAISE;
END;
/
回复

使用道具 举报

发表于 2008-1-5 10:33:47 | 显示全部楼层
存储过程语法不熟悉。根据楼主注释的信息看,操作是正确的。语法部分要楼主自己去调试了。或者可以在程序中使用下面的方法进行删除。
var eng: TFlowEngine;
    fparam:TLoadFlowParam;
    iquery: TQuery;
    guid: string;
    tparam: TLoadTaskParam;
begin
  eng:=TFlowEngine.Create();
  fparam:=TLoadFlowParam.Create();
  tparam:=TLoadTaskParam.create();
  iquery:=TQuery.Create(nil);
  try
    iquery.ConnectionString:=BizObjConsts.cSysDatabaseConnectionString;
    iquery.CommandText:='select FFlowGuid from TFlowID where FID='''+DataSetBrokerBZSJJ1.DataSet.FieldByName('ID').AsString+'''';
    iquery.Open;
    guid:=iquery.FieldByName('FFLowGUID').AsString;
    fparam.GUIDs.Add(guid);
    tparam.FlowGUIDs.Add(guid);
    eng.DeleteFlows(fparam,tparam);
    eng.DeleteTasks(tparam);
  finally
    eng.Free;
    fparam.Free;
    iquery.Free;
  end;

end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-5 11:50:18 | 显示全部楼层
谢谢,看来我原先的存储过程写的有问题,我重新修改了一下
CREATE OR REPLACE PROCEDURE proc_del_flow_task (                --删除流程任务
                                                as_bill_guid VARCHAR2)
AS
   ls_tflow_fguid   VARCHAR2 (100);
   lbl_find         BOOLEAN;
BEGIN
   lbl_find := TRUE;

   --TFLOWID表的FID字段存储的就是单据的流程字段的值,据此找到单据的流程GUID
   BEGIN
      SELECT fflowguid
        INTO ls_tflow_fguid
        FROM tflowid
       WHERE fid = as_bill_guid;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         lbl_find := FALSE;
   END;

   IF lbl_find
   THEN
       --找到了单据guid对应的流程ID了
      --根据tflow.fguid = ttask.FFLOWGUID的关联关系
      --以及ttask.fguid = TTASKMESSAGE.FTASKGUID的关联关系,删除任务消息表TTASKMESSAGE中的记录
      DELETE FROM ttaskmessage a
            WHERE EXISTS (
                     SELECT 1
                       FROM ttask b
                      WHERE a.ftaskguid = b.fguid
                        AND b.fflowguid = ls_tflow_fguid);

      --再根据ttask.fguid = TTASKBIZDATA.FTASKGUID的关联关系,删除任务业务数据表TTASKBIZDATA中的记录
      DELETE FROM ttaskbizdata a
            WHERE EXISTS (
                     SELECT 1
                       FROM ttask b
                      WHERE a.ftaskguid = b.fguid
                        AND b.fflowguid = ls_tflow_fguid);

      --然后删除任务表TTASK的记录
      DELETE FROM ttask
            WHERE fflowguid = ls_tflow_fguid;

      --删除流程表对应记录
      DELETE FROM tflow
            WHERE fguid = ls_tflow_fguid;

      --最后删除流程ID表的记录
      DELETE FROM tflowid
            WHERE fid = as_bill_guid;
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      RAISE;
END;
/
回复 支持 反对

使用道具 举报

发表于 2008-1-14 10:03:14 | 显示全部楼层
楼主,还有其他问题吗?
没有就结帖了。
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-5 06:07 , Processed in 0.048043 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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