ABAP触发处理链函数

比来须要用ABAP触发处理惩罚链,并且还要把握处理惩罚链的履行次数,找了很多材料,终于成功实现了。我目


前知道的办法有两种。一种是直接经由过程SAP供给的API函数去触发处理惩罚链,别的一种就是经由过程事务触发处


理链。下面分别对两种触发处理惩罚链的办法做大致申明。


Method1:API


在BW中,找到Function group : RSPC_API


里面有如下函数:RSPC_API_CHAIN_GET_ERRORS
              RSPC_API_CHAIN_GET_LOG
              RSPC_API_CHAIN_GET_PROCESSES
              RSPC_API_CHAIN_GET_RUNS
              RSPC_API_CHAIN_GET_STARTCOND
              RSPC_API_CHAIN_GET_STATUS
              RSPC_API_CHAIN_GET_VARIABLES
              RSPC_API_CHAIN_INTERRUPT
              RSPC_API_CHAIN_MAINTAIN
              RSPC_API_CHAIN_RESTART
              RSPC_API_CHAIN_SCHEDULE
              RSPC_API_CHAIN_SET_STARTCOND
              RSPC_API_CHAIN_START
              RSPC_API_GET_CHAINS
              RSPC_API_PROCESS_GET_INFO
              RSPC_API_PROCESS_GET_JOBS
              RSPC_API_PROCESS_GET_LOG
              RSPC_API_PROCESS_RESTART
              RSPC_API_SYSTEM_MESSAGE_GET


信赖大师经由过程函数名称也可能知道了函数的功能。放一个PDF介绍这些函数的,有爱好的可以研究一下。


/Files/clsoho/ICCJobSchedulingBWCertificationScenarios.pdf


这里我应用RSPC_API_CHAIN_START来触发处理惩罚链,这些函数都是RFC函数。


当然,要想多次履行处理惩罚链,必须包管前次的处理惩罚链履行已经停止。所以如何获取处理惩罚链的状况,也是个题目。


我还是应用这里面的函数RSPC_API_CHAIN_GET_STATUS来获得处理惩罚链的当前状况。以此断定处理惩罚链是否履行完成。


下面是示例法度代码:


REPORT  ztest888 MESSAGE-ID ZXXX.


DATA: logid TYPE rspc_logid.
DATA: rs_status TYPE rspc_state.
DATA: nsec TYPE i.



PARAMETERS: p_chain TYPE rspc_chain OBLIGATORY.
PARAMETERS: times TYPE int1 OBLIGATORY DEFAULT 1.



INITIALIZATION.
  "initial wait time
  nsec = 60.


AT SELECTION-SCREEN.



START-OF-SELECTION.


"RUN PROCESS CHAINP_CHAIN TIMES 。
  DO times TIMES.


    CLEAR: logid,
           rs_status.


    CALL FUNCTION ""RSPC_API_CHAIN_START""
      EXPORTING
        i_chain               = p_chain
      IMPORTING
        e_logid               = logid
      EXCEPTIONS
        system_failure        = 1
        communication_failure = 2
        failed                = 3
        OTHERS                = 4.


    IF sy-subrc EQ 0. "START PROCESS CHAIN SUCESSFUL


      "SUCESS START PROCESS CHAIN,READ PROCESS CHAIN STATUS
      CALL FUNCTION ""RSPC_API_CHAIN_GET_STATUS""
        EXPORTING
          i_chain               = ""ZBW_ALL_MONTH""
          i_logid               = logid
        IMPORTING
          e_status              = rs_status
        EXCEPTIONS
          system_failure        = 1
          communication_failure = 2.


      IF sy-subrc <> 0.
        MESSAGE e000(zcrm) WITH  ""READ PROCESS CHAIN"" p_chain ""STATUS WRONG!"".
      ENDIF.



      WHILE rs_status EQ ""A"". "PROCESS CHAIN STATUS "A",PROCESSING


        MESSAGE s000 WITH ""PROCESS CHAIN"" p_chain ""正在履行中!请守候&#8230;&#8230;"".


        WAIT UP TO nsec SECONDS.


        CALL FUNCTION ""RSPC_API_CHAIN_GET_STATUS""
          EXPORTING
            i_chain               = p_chain
            i_logid               = logid
          IMPORTING
            e_status              = rs_status
          EXCEPTIONS
            system_failure        = 1
            communication_failure = 2.


        IF sy-subrc <> 0.
          MESSAGE e000(zcrm) WITH  ""READ PROCESS CHAIN"" p_chain ""STATUS WRONG!"".
        ENDIF.


      ENDWHILE.


      "IF PROCESS CHAIN""S STATUS IS NOT "A",COMPLETE SUCESSFUL OR WITH ERROR


      CASE rs_status.
        WHEN ""G"".
          "PROCESS CHAIN COMPLETE SUCESSFULLY
          MESSAGE i000 WITH ""PROCESS CHAIN"" p_chain ""SUCESSFULLY COMPLETE-"" sy-index.
        WHEN ""R"".
          "PROCESS CHAIN INCLUDE ERRORS
          MESSAGE e000 WITH ""PROCESS CHAIN"" p_chain ""COMPLETE WITH ERRORS!"".
          EXIT.
        WHEN ""X"".
          "PROCESS CHAIN INTERUPT
          MESSAGE e000 WITH ""PROCESS CHAIN"" p_chain ""INTERUPT"".
          EXIT.
        WHEN OTHERS.
          "OTHER ERRORS
          MESSAGE e000 WITH ""PROCESS CHAIN"" p_chain ""UNKONW ERROR!"".
          EXIT.
      ENDCASE.
    ELSE.
      "PROCESS CHAIN STARTED WRONG
      MESSAGE e000 WITH  ""PROCESS CHAIN"" p_chain ""START UNSUCESSFUL-"" sy-index.


      "ADD 1 TO TIMES
      times = times + 1.
    ENDIF.
  ENDDO.


METHOD2:经由过程定义事务触发处理惩罚链。


这种办法在Software Developer Network上已经有教材了。这里上传一PDF文档,只须要按照此文档操纵,就不会有题目了。


但这种访求须要将处理惩罚链开端变式设置为:直接规划->事务后->输入事务和参数。事务用事务码SM62定义。


并且调剂功课 。PDF文件下载地址:/Files/clsoho/TriggeringtheProcessChainsatParticularDateusingEvents.pdf


办法2的示例代码如下:


REPORT  ztest999 MESSAGE-ID zxxx.


DATA: eventid TYPE btceventid.
DATA: eventpara TYPE btcevtparm.
DATA: logid TYPE rspc_logid.
DATA: rs_status TYPE rspc_state.
DATA: nsec TYPE i.
DATA: lt_logs TYPE TABLE OF rspc_s_log_f4.
DATA: ls_logs LIKE LINE OF lt_logs.
DATA: rs_flag TYPE c VALUE """".


PARAMETERS: p_chain TYPE rspc_chain OBLIGATORY.
PARAMETERS: times TYPE int1 OBLIGATORY DEFAULT 1.



INITIALIZATION.
  "INITIAL WAIT TIME
  nsec = 60.


AT SELECTION-SCREEN.



START-OF-SELECTION.


  "RUN PROCESS CHAINP_CHAIN TIMES 。
  eventid = ""ZPC_MONTH"".
  eventpara = ""ZPC_MONTH_PARA"".


  DO times TIMES.


    CALL METHOD cl_batch_event=>raise
      EXPORTING
        i_eventid                      = eventid
        i_eventparm                    = eventpara
      EXCEPTIONS
        excpt_raise_failed             = 1
        excpt_server_accepts_no_events = 2
        excpt_raise_forbidden          = 3
        excpt_unknown_event            = 4
        excpt_no_authority             = 5
        OTHERS                         = 6.
    IF sy-subrc EQ 0.
      MESSAGE s000 WITH ""EVENT TRIGGER SUCESSFUL !"".
      rs_flag = ""X"".
    ELSE.
      MESSAGE s000 WITH ""EVENT TRIGGER WITH WRONG!"".
      EXIT.
    ENDIF.


    "EVENT TRIGGER SUCESSFUL,READ PROCESS CHAIN STATUS


    IF rs_flag EQ ""X"". "START PROCESS CHAIN SUCESSFUL


      WAIT UP TO 30 SECONDS.


      CALL FUNCTION ""RSPC_API_CHAIN_GET_RUNS""
        EXPORTING
          i_chain  = p_chain
          i_date   = sy-datum
        TABLES
          e_t_logs = lt_logs
        EXCEPTIONS
          failed   = 1
          OTHERS   = 2.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.


      "SORT LOG TABLE
      SORT lt_logs BY datum zeit.


      " READ LOG TABLE LATEST LOGID
      READ TABLE lt_logs INDEX 1 INTO ls_logs.
      logid = ls_logs-log_id.



      "READ PROCESS CHAIN STATUS BY PROCESS CHAIN AND LOGID
      CALL FUNCTION ""RSPC_API_CHAIN_GET_STATUS""
        EXPORTING
          i_chain               = p_chain
          i_logid               = logid
        IMPORTING
          e_status              = rs_status
        EXCEPTIONS
          system_failure        = 1
          communication_failure = 2.


      IF sy-subrc <> 0.
        MESSAGE e000(zcrm) WITH  ""READ PROCESS CHAIN"" p_chain ""STATUS WRONG!"".
      ENDIF.



      WHILE rs_status EQ ""A"". "PROCESS CHAIN STATUS "A",PROCESSING


        MESSAGE s000 WITH ""PROCESS CHAIN"" p_chain ""IS RUNNING!"".


        WAIT UP TO nsec SECONDS.


        CALL FUNCTION ""RSPC_API_CHAIN_GET_STATUS""
          EXPORTING
            i_chain               = p_chain
            i_logid               = logid
          IMPORTING
            e_status              = rs_status
          EXCEPTIONS
            system_failure        = 1
            communication_failure = 2.


        IF sy-subrc <> 0.
          MESSAGE e000(zcrm) WITH  ""READ PROCESS CHAIN"" p_chain ""STATUS WRONG!"".
        ENDIF.


      ENDWHILE.


      "IF PROCESS CHAIN""S STATUS IS NOT "A",COMPLETE SUCESSFUL OR WITH ERROR


      CASE rs_status.
        WHEN ""G"".
          "PROCESS CHAIN COMPLETE SUCESSFULLY
          MESSAGE i000 WITH ""PROCESS CHAIN"" p_chain ""SUCESSFULLY COMPLETE-"" sy-index.
        WHEN ""R"".
          "PROCESS CHAIN INCLUDE ERRORS
          MESSAGE e000 WITH ""PROCESS CHAIN"" p_chain ""COMPLETE WITH ERRORS!"".
          EXIT.
        WHEN ""X"".
          "PROCESS CHAIN INTERUPT
          MESSAGE e000 WITH ""PROCESS CHAIN"" p_chain ""INTERUPT"".
          EXIT.
        WHEN OTHERS.
          "OTHER ERRORS
          MESSAGE e000 WITH ""PROCESS CHAIN"" p_chain ""UNKONW ERROR!"".
          EXIT.
      ENDCASE.
    ELSE.
      "PROCESS CHAIN STARTED WRONG
      MESSAGE e000 WITH  ""PROCESS CHAIN"" p_chain ""START UNSUCESSFUL-"" sy-index.


      "ADD 1 TO TIMES
      times = times + 1.
    ENDIF.


  ENDDO.


这两种办法的差别在于一个是直接经由过程API函数去触发处理惩罚链的,须要将处理惩罚链开端变式设置为应用元链或API。然则第二种办法是经由过程


事务触发处理惩罚链的,所以须要将开端变式设置为直接规划,事务后输入事务和事务参数。并且须要调剂处理惩罚链后,履行法度才干触发。


当然,代码不是很完美,有可能会产存亡轮回等题目。可以按照须要自行批改。BW处理惩罚链完全可能进行集成,以削减IT人员的保护压力。


今后我会连气儿存眷这些题目。

猜你喜欢

转载自blog.csdn.net/bxy5511/article/details/7573400