自动处理【任务单工序移动接口表】程序

这个程序,根据输入的参数可以自动处理WIP_MOVE_TXN_INTERFACE表。

虽然一般都是排一个“WIP 移动事务处理管理器”定期处理,但是个人认为这样子处理还是有一定的滞后性。用户想操作完毕立刻看到效果,但是老要等上几分钟。

所以专门开发了这个自动处理的程序。也是蛮实用。

逻辑也很简单,就是自动提交一个“WIP 移动事务处理工作流程”处理对应GROUP_ID的数据。

代码也共享出来:

   -----------------------------
   --处理接口表,可选处理方式
   -----------------------------
   PROCEDURE PROCESS_MOVE_TXN_INTERFACE(
      P_PROCESS_TYPE           VARCHAR2  ---处理方式,目前只有 提交请求 SUBMIT_REQUEST 希望以后有 立刻过账 PROCESS_ONLINE
     ,P_GROUP_ID               NUMBER    ---处理的组ID
     ,x_REQUEST_ID           OUT NUMBER --输出的请求ID
     ,x_retcode              OUT NUMBER  ---0:成功  非0:失败( 或者:0:成功  1:警告   2:错误  ----注意:确定警告的时候要做什么动作)
     ,x_errbuf               OUT VARCHAR2  ---具体的错误信息
   )
      IS
       L_PROCESS_PHASE     NUMBER;                             --标识程序的进度
       ---
       L_REQUEST_ID        NUMBER;
       ---
   BEGIN
      x_retcode := 0;
      x_errbuf := Null;

      L_PROCESS_PHASE := 0;

      ---首先的第一步是:检查不可以为空的参数
      IF P_PROCESS_TYPE IS NULL OR P_GROUP_ID IS NULL
      THEN
         x_errbuf := '调用PROCESS_MOVE_TXN_INTERFACE的时候,必要的参数不存在,请检查参数!';
         x_retcode := 2;
         RETURN;
      END IF;

      L_PROCESS_PHASE := 1;

     ------------Start------------
      IF P_PROCESS_TYPE = 'SUBMIT_REQUEST' THEN
        ---自动提交过账的请求
        ---WIP 移动事务处理工作流程
        -----WIP Move Transaction Worker
        L_REQUEST_ID :=
        FND_REQUEST.SUBMIT_REQUEST( 'WIP', -- application
                                    'WICTWS', -- program
                                    NULL,
                                    NULL, -- start_time (optional)
                                    FALSE, -- sub_request
                                    to_char(P_GROUP_ID), -- Group id to process
                                    '1', -- 貌似都给1,不知道什么情况下给2,需要验证!
                                    '2400', -- 貌似都给2400
                                    '1', --  貌似都给1
                                    chr(0)
                                    );
        L_PROCESS_PHASE := 2;
        dbms_output.PUT_LINE('自动产生的请求ID:'||L_REQUEST_ID);
        IF L_REQUEST_ID = 0 THEN
          x_errbuf := '自动提交请求失败!';
          x_retcode := 2;
          RETURN;
        ELSE
          x_errbuf := x_errbuf||'自动提交请求成功!请求ID:'||L_REQUEST_ID;
        END IF;
        x_REQUEST_ID := L_REQUEST_ID;
        L_PROCESS_PHASE := 3;
      ELSIF P_PROCESS_TYPE = 'PROCESS_ONLINE' THEN
         x_errbuf := '目前程序不支持处理方式:('||P_PROCESS_TYPE||')!请检查参数!';
         x_retcode := 2;
         RETURN;
        L_PROCESS_PHASE := 5;
      ELSE
         x_errbuf := '参数P_PROCESS_TYPE('||P_PROCESS_TYPE||')无效,请检查参数!';
         x_retcode := 2;
         RETURN;
      END IF;
      ------------End--------------

      L_PROCESS_PHASE := 6;

   EXCEPTION
      WHEN OTHERS
      THEN
         x_retcode := 2;
         x_errbuf :=
               'P_PROCESS_TYPE:'
            || P_PROCESS_TYPE
            || ' P_GROUP_ID:'
            || P_GROUP_ID
            || ' 产生移动事务处理的时候有异常错误!'
            || CHR(10)
            || '错误信息:'
            || TO_CHAR(SQLCODE)
            || '-'
            || SQLERRM
            || CHR(10)
            || '程序进度:'
            || L_PROCESS_PHASE;
         ----可以适当编写:如果错误,另外还需要处理的SQL
         ---因为如果前面有做UPDATE/INSERT/DELETE动作,虽然是跳到异常,但是,这动作不会自动回滚的!
   END;

 

--------------------------测试部分:

DECLARE
   L_RETCODE      NUMBER;
   L_ERRBUF       VARCHAR2(4000);
   ---
   L_GROUP_ID      NUMBER;
   L_REQUEST_ID    NUMBER;
   ---
BEGIN
   fnd_client_info.set_org_context(104);
   fnd_global.APPS_Initialize( user_id=>5954, resp_id=>52054, resp_appl_id =>20003);
   L_GROUP_ID := 9999;
  ---立刻过账
  XYG_PUB_WIP_PKG.PROCESS_MOVE_TXN_INTERFACE('SUBMIT_REQUEST',L_GROUP_ID,L_REQUEST_ID,L_RETCODE,L_ERRBUF);
  dbms_output.PUT_LINE(L_RETCODE || '-' || L_ERRBUF);
  IF L_RETCODE = 0 THEN
    dbms_output.PUT_LINE('成功产生请求ID:' || L_REQUEST_ID);
    COMMIT;
  ELSE
    dbms_output.PUT_LINE('过账有异常问题发生!'||L_ERRBUF);
    ROLLBACK;
  END IF;
END;

你可能感兴趣的:(Oracle,PL/SQL技巧,Oracle,EBS模组)