출판된 한글판 도서
ERP SAP R/3 ALE, EDI & IDOC 기술 |
Original Book Contents
5.7 ALE Function Module의 생성
Customer Hierarchy에 대하여 change document를 생성해 낼 수 있도록 SAP application프로그램을 enhance 했으므로, 이제는 Customer Hierarchy와 관련된 change pointer를 읽어서, 우리가 이미 생성한 IDOC type ZKNVHM01에 값을 채워서 IDOC을 생성해 내는 ALE function module을 작성할 필요가 있다. 대부분의 master data에 대한 ALE function module은 표준적인 접근방식을 따르고 있는데, 이들은 먼저 필요한 자료를 수집하고, IDOC이 필요로 하는 값을 채워서 IDOC을 만들고, 만들어진 IDOC을 분배하는 절차를 거친다. 먼저, 특정 message type에 대해서 아직까지 처리되지 않은 모든 change pointer자료를 수집하고, 그 각각에 대하여 key값을 찾아서 internal table로 만들어 주는 표준 function module이 있다. 이렇게 해서 생성된 internal table은 다른 function module로 전달되어, 그에 대응하는 IDOC type에서 필요로 하는 값을 결정하여 IDOC을 생성하게 되고, 이렇게 생성된 IDOC은 표준 ALE function module을 사용하여 통신계층(communication layer)으로 전송되는 것이다.
이러한 과정에서 사용되는 두 가지 function module을 구축해 보자. SAP의 명명 규칙에 따라, 우리는 그것들에 “ZMASTERIDOC_CREATE_SMD_ZDEBHI”와 “ZMASTERIDOC_CREATE_ZDEBHI”라는 이름을 부여할 것이다. [그림 5-8]과 [그림 5-9]는 두 function module에 대한 프로그램 코드를 보여주고, [그림 5-10]은 global data를 보여주고 있다. 이 두 function module에 대한 대강의 줄거리는 다음과 같다.
function module ZMASTERIDOC_CREATE_SMD_ZDEBHI는 먼저 SAP가 제공하는 표준 API인 “CHANGE_POINTERS_READ”을 사용하여 table BDCP와 BDCPS을 읽어서, message type ZDEBHI에 대하여 아직 처리되지 않은 모든 change pointer 자료를 수집한다. 그런 다음, 이러한 change pointer들에 대한 key값을 파악하여 internal table에 보관한다. 이러한 각각의 key 값에 대하여 change document의 Change ID field에 의해 message function 값이 결정된다. Internal table에는 그 key값이 함께 저장되고, 나중에 이 internal table상에 있는 모든 자료에 대하여 function module ZMASTERIDOC_CREATE_ZDEBHI를 호출하여, IDOC이 필요로 하는 값을 결정하여 IDOC을 생성하고, 생성된 IDOC을 분배하게 된다. 이러한 처리를 거친 후에, 처리된 모든 change pointer는 다른 internal table에 append되고, 이 append된 internal table은 function module CHANGE_POINTER_STATUS_WRITE로 전달된다. 그러면 이 API는 table BDCPS를 갱신하여 그 change pointer가 처리되었음을 표시한다.
다음은 function module ZMASTERIDOC_CREATE_ZDEBHI의 기본적인 내용을 살펴 보기로 하자. 첫 번째 module에서 function module ZMASTERIDOC_CREATE_ZDEBHI가 호출되면, 그 module로 전달되어 온 key값을 이용하여 table KNVH에서 자료를 조회한다. 이 module은 이러한 자료를 가지고 IDOC segment Z1KNVHM을 생성해 낸다. 나중에 EDIDD key field에 적절한 값을 채우고, segment Z1KNVHM을 EDIDD의 SDATA로 옮긴다. 그런 다음, 이렇게 완성된 EDIDD 자료는 internal table T_IDOC_DATA에 append된다. message type이나 IDOC type과 같이, 이 시점에서 사용 가능한 EDIDC 정보들이 채워지고, 이렇게 생성된 structure형태의 정보는 internal table T_IDOC_DATA과 함께, SAP의 표준 function module인 MASTER_IDOC_DISTRIBUTE로 전달된다. 이 표준 module은 customer distribution model과
partner profile에 따라서 IDOC의 송신자와 수신자를 결정하고, IDOC을 통신계층(communication layer)으로 분배한다. 프로그램에 대한 코드는 [그림 5-9]를 참조하라. 이러한 작업이 기본적으로 master data IDOC을 생성하고, 분배하는데 필요한 절차들이다.
(참고 : 기본적으로 위와 같은 function module들을 생성할 때는, 처음부터 일일이 수작업으로 작성하는 것이 아니라, 다른 message type을 처리하는 function module을 복사한 다음, 여러분의 필요에 따라 적절히 수정하여 사용하면 된다. 예를 들면, message type DEBMAS에 대한 change pointer를 처리해 주는 function module인 MASTERIDOC_CREATE_SMD_DEBMAS와 MASTERIDOC_CREATE_DEBMAS를 복사하여 사용할 수 있을 것이다)
************************************************************************ * This function module has been modeled after standard SAP function * modules for processing master data change pointers, such as * MASTERIDOC_CREATE_SMD_DEBMAS. This function module was used * as a skeleton for the following function module for processing * customer hierarchy change pointers. ************************************************************************
FUNCTION ZMASTERIDOC_CREATE_SMD_ZDEBHI. *"--------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" VALUE(MESSAGE_TYPE) LIKE TBDME-MESTYP *"--------------------------------------------------------------------- * ************************MODIFICATION************************************ * Programmer : Rajeev Kasturi * * Date : Feb. 1998 * * Description : This function module has been created anew for * * generating Customer Hierarchy IDOCs used in ALE distribution of * * changes (creates/changes/deletes) of SD Customer Hierarchy. The new * * Message Type for this purpose is ZDEBHI, and the custom "Basic IDOC" * * type is ZKNVHM01. * ************************************************************************ DATA: BEGIN OF F_KNVHKEY, MANDT LIKE KNVH-MANDT, HITYP LIKE KNVH-HITYP, KUNNR LIKE KNVH-KUNNR, VKORG LIKE KNVH-VKORG, VTWEG LIKE KNVH-VTWEG, SPART LIKE KNVH-SPART, DATAB LIKE KNVH-DATAB, END OF F_KNVHKEY. * DATA: BEGIN OF F_KNVH. INCLUDE STRUCTURE ZKNVHKEY. DATA: END OF F_KNVH. * DATA: BEGIN OF T_KNVHKEY OCCURS 10. INCLUDE STRUCTURE ZKNVHKEY. DATA: END OF T_KNVHKEY. * DATA: BEGIN OF T_CHGPTRS OCCURS 10. INCLUDE STRUCTURE BDCP. DATA: END OF T_CHGPTRS.
DATA: BEGIN OF T_CPIDENT OCCURS 10, CPIDENT LIKE BDCP-CPIDENT, END OF T_CPIDENT.
DATA: BEGIN OF T_CPIDENT_KNVH OCCURS 10, MANDT LIKE KNVH-MANDT, HITYP LIKE KNVH-HITYP, KUNNR LIKE KNVH-KUNNR, VKORG LIKE KNVH-VKORG, VTWEG LIKE KNVH-VTWEG, SPART LIKE KNVH-SPART, DATAB LIKE KNVH-DATAB, CPIDENT LIKE BDCP-CPIDENT, END OF T_CPIDENT_KNVH.
* created idocs * SAP created variables - does not follow naming stds. DATA: CREATED_M_IDOCS LIKE SY-TABIX. DATA: CREATED_COMM_IDOCS LIKE SY-TABIX. DATA: CREATED_C_IDOCS LIKE SY-TABIX. DATA: DONE_SINCE_COMMIT LIKE SY-TABIX.
* read all not processed change pointers for the given messagetype, * object class KUNHIER * return code is not checked for since no exception is raised by * the function module. CALL FUNCTION 'CHANGE_POINTERS_READ' EXPORTING CHANGE_DOCUMENT_OBJECT_CLASS = 'KUNHIER' MESSAGE_TYPE = MESSAGE_TYPE READ_NOT_PROCESSED_POINTERS = 'X' TABLES CHANGE_POINTERS = T_CHGPTRS.
* REFRESH T_KNVHKEY. * * create all keys from the change pointers LOOP AT T_CHGPTRS. * table KNVH * table KNVH of the change document equals the table KNVH PERFORM MOVE_X_TO_Y USING T_CHGPTRS-TABKEY+0(3) F_KNVHKEY-MANDT. IF F_KNVHKEY-MANDT = SPACE. F_KNVHKEY-MANDT = T_CHGPTRS-MANDT. ENDIF. * PERFORM MOVE_X_TO_Y USING T_CHGPTRS-TABKEY+3(1) F_KNVHKEY-HITYP. * PERFORM MOVE_X_TO_Y USING T_CHGPTRS-TABKEY+4(10) F_KNVHKEY-KUNNR. * PERFORM MOVE_X_TO_Y USING T_CHGPTRS-TABKEY+14(4) F_KNVHKEY-VKORG. * PERFORM MOVE_X_TO_Y USING T_CHGPTRS-TABKEY+18(2) F_KNVHKEY-VTWEG. * PERFORM MOVE_X_TO_Y USING T_CHGPTRS-TABKEY+20(2) F_KNVHKEY-SPART. * PERFORM MOVE_X_TO_Y USING T_CHGPTRS-TABKEY+22(8) F_KNVHKEY-DATAB. * READ TABLE T_KNVHKEY WITH KEY F_KNVHKEY. * MOVE F_KNVHKEY-MANDT TO T_KNVHKEY-MANDT. MOVE F_KNVHKEY-HITYP TO T_KNVHKEY-HITYP. MOVE F_KNVHKEY-KUNNR TO T_KNVHKEY-KUNNR. MOVE F_KNVHKEY-VKORG TO T_KNVHKEY-VKORG. MOVE F_KNVHKEY-VTWEG TO T_KNVHKEY-VTWEG. MOVE F_KNVHKEY-SPART TO T_KNVHKEY-SPART. MOVE F_KNVHKEY-DATAB TO T_KNVHKEY-DATAB. * PERFORM CONVERT_CDCHGID_TO_MSGFN USING T_CHGPTRS-CDCHGID T_KNVHKEY-MSGFN. IF SY-SUBRC <> 0. APPEND T_KNVHKEY. ELSE. MODIFY T_KNVHKEY INDEX SY-TABIX. ENDIF. * * add pointer to processed pointers MOVE-CORRESPONDING F_KNVHKEY TO T_CPIDENT_KNVH. MOVE T_CHGPTRS-CPIDENT TO T_CPIDENT_KNVH-CPIDENT. APPEND T_CPIDENT_KNVH. ENDLOOP. * SORT T_KNVHKEY BY MANDT HITYP KUNNR VKORG VTWEG SPART DATAB. SORT T_CPIDENT_KNVH BY MANDT HITYP KUNNR VKORG VTWEG SPART DATAB. * * initialize counter variables for created idocs CREATED_M_IDOCS = 0. CREATED_C_IDOCS = 0. DONE_SINCE_COMMIT = 0.
CLEAR T_CPIDENT. REFRESH T_CPIDENT.
* call of the idoc creator LOOP AT T_KNVHKEY WHERE MANDT = SY-MANDT. CLEAR F_KNVH. MOVE-CORRESPONDING T_KNVHKEY TO F_KNVH. * return code is not checked for since no exception is raised by * the function module. * CALL FUNCTION 'ZMASTERIDOC_CREATE_ZDEBHI' EXPORTING KNVHKEY = F_KNVH RCVPFC = ' ' RCVPRN = ' ' RCVPRT = ' ' SNDPFC = ' ' SNDPRN = ' ' SNDPRT = ' ' MESSAGE_TYPE = MESSAGE_TYPE IMPORTING CREATED_COMM_IDOCS = CREATED_COMM_IDOCS. * CREATED_M_IDOCS = CREATED_M_IDOCS + 1. CREATED_C_IDOCS = CREATED_C_IDOCS + CREATED_COMM_IDOCS. DONE_SINCE_COMMIT = DONE_SINCE_COMMIT + 1. * * append all processed pointer LOOP AT T_CPIDENT_KNVH WHERE MANDT = F_KNVH-MANDT AND HITYP = F_KNVH-HITYP AND KUNNR = F_KNVH-KUNNR AND VKORG = F_KNVH-VKORG AND VTWEG = F_KNVH-VTWEG AND SPART = F_KNVH-SPART AND DATAB = F_KNVH-DATAB. * T_CPIDENT-CPIDENT = T_CPIDENT_KNVH-CPIDENT. APPEND T_CPIDENT. * ENDLOOP.
IF DONE_SINCE_COMMIT >= C_IDOCS_BEFORE_COMMIT. DONE_SINCE_COMMIT = 0. * * write status of all processed pointers * return code is not checked for since no exception is raised by * the function module. CALL FUNCTION 'CHANGE_POINTERS_STATUS_WRITE' EXPORTING MESSAGE_TYPE = MESSAGE_TYPE TABLES CHANGE_POINTERS_IDENTS = T_CPIDENT. * COMMIT WORK. * return code is not checked for since no exception is raised by * the function module. CALL FUNCTION 'DEQUEUE_ALL'. * CLEAR T_CPIDENT. REFRESH T_CPIDENT. * ENDIF. * ENDLOOP. "at t_knvhkey * * commit if necessary IF DONE_SINCE_COMMIT > 0. * * write status of all processed pointers * return code is not checked for since no exception is raised by * the function module. CALL FUNCTION 'CHANGE_POINTERS_STATUS_WRITE' EXPORTING MESSAGE_TYPE = MESSAGE_TYPE TABLES CHANGE_POINTERS_IDENTS = T_CPIDENT. * COMMIT WORK. * return code is not checked for since no exception is raised by * the function module. CALL FUNCTION 'DEQUEUE_ALL'. * ENDIF. * MESSAGE ID 'B1' TYPE 'I' NUMBER '038' WITH CREATED_M_IDOCS MESSAGE_TYPE. MESSAGE ID 'B1' TYPE 'I' NUMBER '039' WITH CREATED_C_IDOCS MESSAGE_TYPE. ENDFUNCTION.
*&---------------------------------------------------------------------* *& Form MOVE_X_TO_Y *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_T_CHGPTRS-TABKEY+20(2) text * * -->P_F_KNVHKEY-SPART text * *----------------------------------------------------------------------* FORM MOVE_X_TO_Y USING X Y. * Y = X. * ENDFORM. " MOVE_X_TO_Y *&---------------------------------------------------------------------* *& Form CONVERT_CDCHGID_TO_MSGFN *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_T_CHGPTRS-CDCHGID text * * -->P_T_KNVHKEY-MSGFN text * *----------------------------------------------------------------------* FORM CONVERT_CDCHGID_TO_MSGFN USING CDCHGID LIKE BDCP-CDCHGID MSGFN LIKE Z1KNVHM-MSGFN. * MSGFN = SPACE. * CASE CDCHGID. WHEN 'I'. MSGFN = C_MSGFN_I. WHEN 'U'. MSGFN = C_MSGFN_U. WHEN ' '. MSGFN = C_MSGFN_R. WHEN 'D'. MSGFN = C_MSGFN_D. WHEN 'E'. MSGFN = C_MSGFN_D. WHEN 'S'. MSGFN = C_MSGFN_S. ENDCASE. * ENDFORM. " CONVERT_CDCHGID_TO_MSGFN *&---------------------------------------------------------------------* *& Form FILL_SEGMENT_Z1KNVHM *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_KNVHKEY-MSGFN text * *----------------------------------------------------------------------* FORM FILL_SEGMENT_Z1KNVHM USING MSGFN. * CLEAR Z1KNVHM. * Z1KNVHM-MSGFN = MSGFN. Z1KNVHM-HITYP = KNVH-HITYP. Z1KNVHM-KUNNR = KNVH-KUNNR. Z1KNVHM-VKORG = KNVH-VKORG. Z1KNVHM-VTWEG = KNVH-VTWEG. Z1KNVHM-SPART = KNVH-SPART. Z1KNVHM-DATAB = KNVH-DATAB. Z1KNVHM-DATBI = KNVH-DATBI. Z1KNVHM-HKUNNR = KNVH-HKUNNR. Z1KNVHM-HVKORG = KNVH-HVKORG. Z1KNVHM-HVTWEG = KNVH-HVTWEG. Z1KNVHM-HSPART = KNVH-HSPART. Z1KNVHM-GRPNO = KNVH-GRPNO. Z1KNVHM-BOKRE = KNVH-BOKRE. Z1KNVHM-PRFRE = KNVH-PRFRE. Z1KNVHM-HZUOR = KNVH-HZUOR. * ENDFORM. " FILL_SEGMENT_Z1KNVHM
|
그림 5‑8 Change Pointer를 처리하는 ALE Function Module
************************************************************************ * This function module and global data was closely modeled after * standard SAP function modules such as MASTERIDOC_CREATE_DEBMAS. * This function * module was used a skeleton to create the following * function module for distribution of customer hierarchy master IDOCs. ************************************************************************
FUNCTION ZMASTERIDOC_CREATE_ZDEBHI. *"---------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" VALUE(KNVHKEY) LIKE ZKNVHKEY STRUCTURE ZKNVHKEY *" VALUE(RCVPFC) LIKE BDALEDC-RCVPFC *" VALUE(RCVPRN) LIKE BDALEDC-RCVPRN *" VALUE(RCVPRT) LIKE BDALEDC-RCVPRT *" VALUE(SNDPFC) LIKE BDALEDC-SNDPFC *" VALUE(SNDPRN) LIKE BDALEDC-SNDPRN *" VALUE(SNDPRT) LIKE BDALEDC-SNDPRT *" VALUE(MESSAGE_TYPE) LIKE TBDME-MESTYP *" EXPORTING *" VALUE(CREATED_COMM_IDOCS) LIKE SY-TABIX *"---------------------------------------------------------------------- ************************MODIFICATION************************************ * Programmer : Rajeev Kasturi * * This function module is called from the driver FM : * * "ZMASTERIDOC_CREATE_SMD_ZDEBHI".. * * The processing is based on the change document object KUNHIER. * ************************************************************************
DATA: BEGIN OF F_IDOC_HEADER. INCLUDE STRUCTURE EDIDC. DATA: END OF F_IDOC_HEADER.
DATA: BEGIN OF T_IDOC_DATA OCCURS 10. INCLUDE STRUCTURE EDIDD. DATA: END OF T_IDOC_DATA.
DATA: BEGIN OF T_IDOC_COMM_CONTROL OCCURS 10. INCLUDE STRUCTURE EDIDC. DATA: END OF T_IDOC_COMM_CONTROL.
DATA: ACTIVE_FLAG(1) TYPE C.
DATA: COMM_CONTROL_LINES LIKE SY-TABIX.
DATA: IDOC_CIMTYPE LIKE EDIDC-CIMTYP.
DATA: PARTNER_TYPE LIKE TPAR-NRART. "P30K057526
DATA: COUNTRY_ISO LIKE T005-INTCA.
* initial CLEAR T_IDOC_COMM_CONTROL. REFRESH T_IDOC_COMM_CONTROL. CLEAR T_IDOC_DATA. REFRESH T_IDOC_DATA.
CLEAR IDOC_CIMTYPE.
* fill T_IDOC_DATA for Segment Z1KNVHM with KNVH SELECT SINGLE * FROM KNVH WHERE HITYP = KNVHKEY-HITYP AND KUNNR = KNVHKEY-KUNNR AND VKORG = KNVHKEY-VKORG AND VTWEG = KNVHKEY-VTWEG AND SPART = KNVHKEY-SPART AND DATAB = KNVHKEY-DATAB. IF SY-SUBRC = 0. PERFORM FILL_SEGMENT_Z1KNVHM USING KNVHKEY-MSGFN. * CLEAR T_IDOC_DATA. T_IDOC_DATA-SEGNAM = C_SEGNAM_Z1KNVHM. T_IDOC_DATA-MANDT = SY-MANDT. T_IDOC_DATA-SDATA = Z1KNVHM. * APPEND T_IDOC_DATA. ENDIF. * * fill IDOC_HEADER F_IDOC_HEADER-MESTYP = MESSAGE_TYPE. F_IDOC_HEADER-IDOCTP = C_IDOCTP_ZDEBHI. F_IDOC_HEADER-CIMTYP = IDOC_CIMTYPE. F_IDOC_HEADER-SNDPFC = SNDPFC. F_IDOC_HEADER-SNDPRN = SNDPRN. F_IDOC_HEADER-SNDPRT = SNDPRT. F_IDOC_HEADER-RCVPFC = RCVPFC. F_IDOC_HEADER-RCVPRN = RCVPRN. F_IDOC_HEADER-RCVPRT = RCVPRT. F_IDOC_HEADER-SERIAL = SPACE. * * CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE' EXPORTING MASTER_IDOC_CONTROL = F_IDOC_HEADER TABLES COMMUNICATION_IDOC_CONTROL = T_IDOC_COMM_CONTROL MASTER_IDOC_DATA = T_IDOC_DATA EXCEPTIONS ERROR_IN_IDOC_CONTROL = 01 ERROR_WRITING_IDOC_STATUS = 02 ERROR_IN_IDOC_DATA = 03 SENDING_LOGICAL_SYSTEM_UNKNOWN = 04.
IF SY-SUBRC <> 0. ENDIF.
DESCRIBE TABLE T_IDOC_COMM_CONTROL LINES COMM_CONTROL_LINES. CREATED_COMM_IDOCS = COMM_CONTROL_LINES. ENDFUNCTION.
|
그림 5‑9 Master IDOC을 생성하고 전송하는 ALE Function Module
FUNCTION-POOL ZDEB. "MESSAGE-ID .. * * DATA: C_MSGFN_I LIKE Z1KNVHM-MSGFN VALUE '009', "New C_MSGFN_U LIKE Z1KNVHM-MSGFN VALUE '004', "Change C_MSGFN_R LIKE Z1KNVHM-MSGFN VALUE '005', "Refresh C_MSGFN_T LIKE Z1KNVHM-MSGFN VALUE '023', "Synchronisation C_MSGFN_D LIKE Z1KNVHM-MSGFN VALUE '003', "Deletion C_MSGFN_S LIKE Z1KNVHM-MSGFN VALUE '018'. "Reissue DATA: C_IDOCS_BEFORE_COMMIT LIKE SY-TABIX VALUE 50. DATA: C_SEGNAM_Z1KNVHM LIKE EDIDD-SEGNAM VALUE 'Z1KNVHM'. DATA: C_IDOCTP_ZDEBHI LIKE BDALEDC-IDOCTP VALUE 'ZKNVHM01'. TABLES: KNVH, Z1KNVHM.
|
그림 5‑10 ALE Function Module에서 사용되는 Global Data