čtvrtek 27. června 2013

Generování a zpracování vlastního IDOC v SAPu

Standardní použití komunikace IDOC je koncipováno jako přenos dat mezi různými SAP i nonSAP systémy.

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 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.



Žádné komentáře:

Okomentovat