Tento příspěvek ale popisuje netradiční problém, kdy je potřeba v klientu systému SAP vytvořit IDOC a následně ho v tom samém klientu systému zpracovat. Toto řešení může být použitelné tam, kde chceme zachovat stávající vžité rozhraní ALE monitoringu (transakce WE02, BD87 atd.) i u jiných dat zpracovávaných v systému.
Tento příspěvek vychází z tutoriálu Step-by-step guide to ALE and IDOCs, který však popisuje komunikaci mezi dvěma klienty SAPu. Základním prvkem je použití funkčního modulu IDOC_INBOUND_ASYNCHRONOUS, který ze zadaných dat vytvoří inbound(vstupní) IDOC do systému. Tento IDOC je pak na vstupu zpracován funkčním modulem, který data z IDOCu zapíše do databázové tabulky.
Nebudu znovu popisovat kroky uvedené ve zmíněném tutoriálu, ale pouze rozdíly, které vedou ke zpracování IDOCu ve stejném systému v jakém se IDOC i vytvořil.
Základem je program pro generování IDOCu v systému, který využívá funkční modul IDOC_INBOUND_ASYNCHRONOUS. Program pracuje s předem založeným message type, idoc type, segment (vše podle tutoriálu).
Dále je idoc naplněn aplikačními a po té řídícími daty. Aby mohl být IDOC vytvořen a zároveň zpracován ve stejném systému, je nutné uvést stejné hodnoty v Recipient a Sender information (Port, Partner number a Partner Type).
Následně je v programu už jen zavolán funkční modul IDOC_INBOUND_ASYNCHRONOUS.
&---------------------------------------------------------------------*
*& Report Z_IDOC_TEST_ASYNCHRONOUS*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT Z_IDOC_TEST_ASYNCHRONOUS.
DATA: ltb_edidc LIKE edi_dc40 OCCURS 10 WITH HEADER LINE, "řídící data IDOCu ltb_edidd TYPE TABLE OF edi_dd40 WITH HEADER LINE, "aplikační data IDOCu S_ZSHSTUSEG LIKE ZSHSTUSEG. " struktura, která je stejná jako definice segmentu IDOCu z WE31 - plní se do ní aplikační dataPARAMETERS: P_NAME LIKE ZSHSTUSEG-ZSNAME. "vstupní parametr ltb_edidd-segnam = 'ZSHSTUSEG'. "název segmentu IDOCu ltb_edidd-segnum = 000001. "pořádové číslo segmentu v IDOCu - mohu jich dát více za sebou a přenášet několik záznamů v jednom IDOCu s_ZSHSTUSEG-ZSTUID = SY-TIMLO. "jako pořadové číslo vkládám aktuální čas - špatně jsem si navrhl tabulku s_ZSHSTUSEG-ZSNAME = P_NAME. "plním jmeno ze vstupního parametru do struktury ltb_edidd-sdata = S_ZSHSTUSEG. "strukturu s daty plním do tabulky? IDOCu APPEND ltb_edidd.
* Hlavička IDocu - posílám to localhostu do localhostu CLEAR ltb_edidc.
REFRESH: ltb_edidc.
ltb_edidc-direct = 2. ltb_edidc-mestyp = 'ZSTUDMESTYPE'." message type - WE81, WE82 ltb_edidc-idoctyp = 'ZSHSTUDDOCS'." idoc type - WE30* ltb_edidc-rcvpfc = ''. ltb_edidc-sndpor = 'SAPNSP'."tRFC port - SAPNSP je automatický port, který nemusím vytvářet (SID) ltb_edidc-sndprn = 'T90CLNT090'."sender port - WE20 ltb_edidc-sndprt = 'LS'."partner type - WE20 ltb_edidc-rcvpor = 'SAPNSP'."tRFC port - SAPNSP je automatický port, který nemusím vytvářet (SID) ltb_edidc-rcvprn = 'T90CLNT090'."receiver port - WE20 ltb_edidc-rcvprt = 'LS'."partner type - WE20 ltb_edidc-tabnam = 'EDI_DC40'. APPEND ltb_edidc.
* Vytvoření IDocu CALL FUNCTION 'IDOC_INBOUND_ASYNCHRONOUS' " funkční modul, který ze zadaných dat (ltb_edidc, ltb_edidd) vytvoří IDOC TABLES " dále však musí existovat logika,která vstupní IDOC zpracuje (funkční modul-SE37, přiřazení-WE57, input method-BD51, creating process code WE42, generating partner profile BD64-process code-WE20) ) idoc_control_rec_40 = ltb_edidc[] " popsáno zde - http://saptechnical.com/Tutorials/ALE/Guide/Index.htm idoc_data_rec_40 = ltb_edidd[]
EXCEPTIONS OTHERS = 1. IF sy-subrc NE 0. ROLLBACK WORK. MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.* Výmaz nebo kopírování importovaných souborů* funkce pro kopírování: PFL_COPY_OS_FILE* IF delfile NE space AND server NE space.* DELETE DATASET piv_pathfile.* ENDIF. COMMIT WORK. ENDIF.* Výmaz dat pro příští soubor REFRESH: ltb_edidd.
Výše zmíněný postup by sice IDOC vytvořil, ale ten by skončil s některým z chybných statusů zpracování. Pro korektní zpracování IDOCu je nutné nastavit několik dalších věcí.
V transakci WE20 je nutné nastavit námi použitý Message type do Inbound parameters.
Po rozkliknutí tohoto message type je potřeba určit, který Process code se použije při zpracování příchozího IDOCu.
Použijeme vlastní Process code, který si vytvoříme v transakci WE42 a přiřadíme mu Identification, což je v tomto případě zákaznický funkční modul.
Ve stejné transakci na záložce Logical message přiřadíme Message type.
Zde je uvedený kód funkčního modulu, který se stará o konečné zpracování dat příchozího IDOCu. Funkční modul přijatá data zapíše do tabulky ZSTUDENTS viz. tutoriál.
FUNCTION ZSTUDMESTYPE.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(INPUT_METHOD) LIKE BDWFAP_PAR-INPUTMETHD
*" REFERENCE(MASS_PROCESSING) LIKE BDWFAP_PAR-MASS_PROC
*" EXPORTING
*" VALUE(WORKFLOW_RESULT) LIKE BDWF_PARAM-RESULT
*" VALUE(APPLICATION_VARIABLE) LIKE BDWF_PARAM-APPL_VAR
*" VALUE(IN_UPDATE_TASK) LIKE BDWFAP_PAR-UPDATETASK
*" VALUE(CALL_TRANSACTION_DONE) LIKE BDWFAP_PAR-CALLTRANS
*" TABLES
*" IDOC_CONTRL STRUCTURE EDIDC
*" IDOC_DATA STRUCTURE EDIDD
*" IDOC_STATUS STRUCTURE BDIDOCSTAT
*" RETURN_VARIABLES STRUCTURE BDWFRETVAR
*" SERIALIZATION_INFO STRUCTURE BDI_SER
*" EXCEPTIONS
*" WRONG_FUNCTION_CALLED
*"----------------------------------------------------------------------
* Include File containing ALE constants
INCLUDE MBDCONWF.
*TABLES : ZSTUDENTS.
DATA : W_ZSHSTUSEG LIKE ZSHSTUSEG.
DATA : T_ZSTUDENTS LIKE ZSTUDENTS OCCURS 0 WITH HEADER LINE.
WORKFLOW_RESULT = C_WF_RESULT_OK.
LOOP AT IDOC_CONTRL.
IF IDOC_CONTRL-MESTYP NE 'ZSTUDMESTYPE'.
RAISE WRONG_FUNCTION_CALLED.
ENDIF.
* Before reading a new entry, clear application buffer
LOOP AT IDOC_DATA WHERE DOCNUM EQ IDOC_CONTRL-DOCNUM.
W_ZSHSTUSEG = IDOC_DATA-SDATA.
MOVE-CORRESPONDING W_ZSHSTUSEG TO T_ZSTUDENTS.
INSERT INTO ZSTUDENTS VALUES T_ZSTUDENTS.
ENDLOOP.
UPDATE ZSTUDENTS FROM T_ZSTUDENTS.
IF SY-SUBRC EQ 0.
IDOC_STATUS-DOCNUM = IDOC_CONTRL-DOCNUM.
IDOC_STATUS-STATUS = '53'.
IDOC_STATUS-MSGTY = 'I'.
IDOC_STATUS-MSGID = 'YM'.
IDOC_STATUS-MSGNO = '004'.
IDOC_STATUS-MSGV1 = T_ZSTUDENTS-ZSTUID.
APPEND IDOC_STATUS.
CLEAR IDOC_STATUS.
ELSE.
IDOC_STATUS-DOCNUM = IDOC_CONTRL-DOCNUM.
IDOC_STATUS-STATUS = '51'.
IDOC_STATUS-MSGTY = 'E'.
IDOC_STATUS-MSGID = 'YM'.
IDOC_STATUS-MSGNO = '005'.
IDOC_STATUS-MSGV1 = T_ZSTUDENTS-ZSTUID.
APPEND IDOC_STATUS.
CLEAR IDOC_STATUS.
WORKFLOW_RESULT = C_WF_RESULT_ERROR.
RETURN_VARIABLES-WF_PARAM = 'Error_Idocs'.
RETURN_VARIABLES-DOC_NUMBER = IDOC_CONTRL-DOCNUM.
APPEND RETURN_VARIABLES.
CLEAR RETURN_VARIABLES.
ENDIF.
ENDLOOP.
ENDFUNCTION.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(INPUT_METHOD) LIKE BDWFAP_PAR-INPUTMETHD
*" REFERENCE(MASS_PROCESSING) LIKE BDWFAP_PAR-MASS_PROC
*" EXPORTING
*" VALUE(WORKFLOW_RESULT) LIKE BDWF_PARAM-RESULT
*" VALUE(APPLICATION_VARIABLE) LIKE BDWF_PARAM-APPL_VAR
*" VALUE(IN_UPDATE_TASK) LIKE BDWFAP_PAR-UPDATETASK
*" VALUE(CALL_TRANSACTION_DONE) LIKE BDWFAP_PAR-CALLTRANS
*" TABLES
*" IDOC_CONTRL STRUCTURE EDIDC
*" IDOC_DATA STRUCTURE EDIDD
*" IDOC_STATUS STRUCTURE BDIDOCSTAT
*" RETURN_VARIABLES STRUCTURE BDWFRETVAR
*" SERIALIZATION_INFO STRUCTURE BDI_SER
*" EXCEPTIONS
*" WRONG_FUNCTION_CALLED
*"----------------------------------------------------------------------
* Include File containing ALE constants
INCLUDE MBDCONWF.
*TABLES : ZSTUDENTS.
DATA : W_ZSHSTUSEG LIKE ZSHSTUSEG.
DATA : T_ZSTUDENTS LIKE ZSTUDENTS OCCURS 0 WITH HEADER LINE.
WORKFLOW_RESULT = C_WF_RESULT_OK.
LOOP AT IDOC_CONTRL.
IF IDOC_CONTRL-MESTYP NE 'ZSTUDMESTYPE'.
RAISE WRONG_FUNCTION_CALLED.
ENDIF.
* Before reading a new entry, clear application buffer
LOOP AT IDOC_DATA WHERE DOCNUM EQ IDOC_CONTRL-DOCNUM.
W_ZSHSTUSEG = IDOC_DATA-SDATA.
MOVE-CORRESPONDING W_ZSHSTUSEG TO T_ZSTUDENTS.
INSERT INTO ZSTUDENTS VALUES T_ZSTUDENTS.
ENDLOOP.
UPDATE ZSTUDENTS FROM T_ZSTUDENTS.
IF SY-SUBRC EQ 0.
IDOC_STATUS-DOCNUM = IDOC_CONTRL-DOCNUM.
IDOC_STATUS-STATUS = '53'.
IDOC_STATUS-MSGTY = 'I'.
IDOC_STATUS-MSGID = 'YM'.
IDOC_STATUS-MSGNO = '004'.
IDOC_STATUS-MSGV1 = T_ZSTUDENTS-ZSTUID.
APPEND IDOC_STATUS.
CLEAR IDOC_STATUS.
ELSE.
IDOC_STATUS-DOCNUM = IDOC_CONTRL-DOCNUM.
IDOC_STATUS-STATUS = '51'.
IDOC_STATUS-MSGTY = 'E'.
IDOC_STATUS-MSGID = 'YM'.
IDOC_STATUS-MSGNO = '005'.
IDOC_STATUS-MSGV1 = T_ZSTUDENTS-ZSTUID.
APPEND IDOC_STATUS.
CLEAR IDOC_STATUS.
WORKFLOW_RESULT = C_WF_RESULT_ERROR.
RETURN_VARIABLES-WF_PARAM = 'Error_Idocs'.
RETURN_VARIABLES-DOC_NUMBER = IDOC_CONTRL-DOCNUM.
APPEND RETURN_VARIABLES.
CLEAR RETURN_VARIABLES.
ENDIF.
ENDLOOP.
ENDFUNCTION.
Dále je potřeba ještě v transakci WE57 potřeba přiřadit Basic Idoc Type a Message Type k funkčnímu modulu.
Po spuštění programu v SE38 zkontrolujeme v transakci WE02 správné zpracování IDOCu.