比来须要用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人员的保护压力。
今后我会连气儿存眷这些题目。