Sei sulla pagina 1di 7

Creare configurare e inviare un IDOC di outbound in SAP R/3

Ecco una guida step-by-step semplice e descrittiva per creare da zero un idoc di outbound, in uno scenario di esempio in cui il sistema sender SAP R/3 ed il receiver un sistema PI.

Step 1: creazione e configurazione dell'IDOC Cos' un IDOC? In SAP R/3 un IDOC un messaggio, contenente informazioni. Le informazioni sono contenute in semplici campi, organizzati in strutture chiamate segmenti. Un IDOC pu contenere uno o pi segmenti, e questi possono essere uguali o diversi tra loro, a seconda delle esigenze. Per chi ne sa qualcosa, un IDOC molto simile ad un XML. Esistono IDOC standard e custom, in questa guida ne costruiremo ovviamente uno custom. Oltre a contenere le informazioni che si vuole trasmettere, l'IDOC contiene anche dei dati di testata, necessari ad esempio a specificare il sistema destinatario del messaggio. La prima cosa da fare, per iniziare, costruire i segmenti che il nostro IDOC conterr. Per costruire un segmento, occorre specificarne un nome e definire i campi che lo costituiscono, con i relativi data element. Per fare ci utilizziamo la transazione WE31 (sviluppo segmenti).

In questo caso ho creato il segmento ZSEGM99. Ora occorre inserire una descrizione, e poi elencare i vari campi che lo costituiscono, assieme ai relativi data element.

Come esempio ho inserito tre campi, assieme ai data element. Le lunghezze verranno automaticamente definite da SAP. Occorre tenere presente che in un IDOC i dati sono sempre contenuti in campi di tipo char. Dopo aver salvato il segmento, occorre ancora renderlo attivo. Per fare ci andiamo su EDIT-

>Set Release

A questo punto il segmento creato diviene utilizzabile. Alla destra della segment definition si vedr che il checkbox "Release" ora spuntato, come nella prossima figura:

Con la WE31 abbiamo finito.

A questo punto creiamo l'IDOC vero e proprio, ovvero definiamo il suo "Basic Type". Per fare ci andiamo nella transazione WE30.

Scegliamo il nome per il Basic Type: in questo esempio ho creato l'oggetto Y_BASICTYPE. Automaticamente la mia utenza viene utilizzata per definirne l'amministratore. Inoltre occorre inserire la solita descrizione.

E' arrivato il momento di sfruttare il segmento precedentemente creato e utilizzarlo come contenitore di informazioni per questo IDOC. Andiamo su EDIT->Create Segment

Ora, supponiamo che io voglia trasmettere un singolo IDOC contenente i dati relativi a tutti i miei clienti, in questo caso dovr specificare che il numero di segmenti ZSEGM99 consentiti nel presente IDOC infinito. Oppure potremmo trovarci nel caso in cui vogliamo spedire tanti singoli IDOCs, uno per ciascun cliente. In questo caso definiremo la numerosit uguale a 1. Vediamo nella prossima figura come vengono specificate queste informazioni.

In pratica specifichiamo se il segmento deve essere obbligatorio o facoltativo, ed il range numerico di segmenti che possono essere ripetuti. Abbiamo finito. Come nella transazione precedente, anche qui necessario attivare il basic type, settando la release dal men EDIT.

Con il basic type abbiamo concluso. -Questo contenuto ti sembra utile? Clicca il pulsante "Mi Piace" qui sotto!La prossima transazione da usare la WE81. Questa ci consentir di creare un nuovo oggetto: il message type. Qual lo scopo del nostro IDOC? Con lo stesso basic type, potrei voler trasmettere dati con scopi differenti. Per esempio, il basic type che abbiamo costruito, potrebbe servire per aggiornare le anagrafiche di due sistemi differenti. Per questo motivo necessario definire uno o pi message types ed in seguito associarli al basic type costruito. Andiamo in WE81.

Qui troviamo semplicemente una tabella, dove possiamo stabilire un nome per il nostro message type e fornire la descrizione. Aggiungiamo quindi una nuova entry a questa tabella, poi salviamo.

L'associazione tra message type e basic type la faremo usando la transazione WE82 (vedi table EDIMSG).

Occorre anche indicare la release, che corrisponde a quella relativa al segmento usato. L'IDOC pronto per l'utilizzo, e lo step 1 concluso. Step 2: scrivere il programma che caricher e spedir l'IDOC al sistema receiver Dalla SE38 creiamo un programma che faccia le opportune estrazioni di dati con cui caricare l'IDOC. Questo programma verr poi probabilmente usato come Job, e quindi schedulato per girare periodicamente, oppure lanciato a seconda delle esigenze. Ecco la struttura base del programma: DATA: gw_edidcp TYPE edidc, gw_ediddp TYPE edidd, gt_ediddp TYPE TABLE OF edidd. CONSTANTS: c_mestypp LIKE edidc-mestyp VALUE 'ZMESSAGETYPE', c_idoctpp LIKE edidc-idoctp VALUE 'Y_BASICTYPE', c_rcvprt VALUE '', "Partner Type of Receiver: da configurare in WE20 c_rcvprn VALUE '', "Partner Number of Receiver:da configurare in WE20 c_segmname TYPE edidd-segnam VALUE 'ZSEGM99', c_hlevel TYPE edi_hlevel VALUE '02'. START-OF-SELECTION. PERFORM extract_data TABLES gt_data. IF gt_data[] IS NOT INITIAL. PERFORM set_idoc TABLES gt_data gt_ediddp CHANGING gw_edidcp. PERFORM create_idoc TABLES gt_log. ENDIF. In questo esempio, la routine extract_data prepara i dati nella tabella gt_data. Questa verr usata per alimentare l'idoc nella routine set_idoc. Vediamola: *&------------------------------------------------------------* *& Form SET_IDOC *&------------------------------------------------------------* FORM set_idoc TABLES lt_idoc_data STRUCTURE gt_data lt_ediddp STRUCTURE edidd CHANGING lw_edidcp STRUCTURE gw_edidcp. DATA: lw_main_segm LIKE ZSEGM99, lw_ediddp TYPE edidd. *Fill_edidc CLEAR lw_edidcp. lw_edidcp-mestyp lw_edidcp-idoctp lw_edidcp-rcvprt lw_edidcp-rcvprn

= = = =

c_mestypp. c_idoctpp. c_rcvprt. c_rcvprn.

*Fill_edidd LOOP AT lt_idoc_data. CLEAR: lw_main_segm.

MOVE-CORRESPONDING lt_idoc_data TO lw_main_segm. CLEAR: lw_ediddp. MOVE lw_main_segm TO lw_ediddp-sdata. MOVE c_segmname TO lw_ediddp-segnam. MOVE c_hlevel TO lw_ediddp-hlevel. APPEND lw_ediddp TO lt_ediddp. ENDLOOP. ENDFORM. " SET_IDOC Infine, la routine create_idoc inoltrer l'idoc. Eccola: *&------------------------------------------------------------* *& Form CREATE_IDOC *&------------------------------------------------------------* FORM create_idoc TABLES lt_log STRUCTURE gt_log. DATA: lt_control LIKE edidc OCCURS 0 WITH HEADER LINE, lf_idoc LIKE edidc-docnum. *Send a single IDOC CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE' EXPORTING master_idoc_control = gw_edidcp TABLES communication_idoc_control = lt_control master_idoc_data = gt_ediddp EXCEPTIONS error_in_idoc_control = 1 error_writing_idoc_status = 2 error_in_idoc_data = 3 sending_logical_system_unknown = 4 OTHERS = 5. CASE sy-subrc. WHEN 0. COMMIT WORK. CALL FUNCTION 'DEQUEUE_ALL'. LOOP AT lt_control. lf_idoc = lt_control-docnum. EXIT. ENDLOOP. CLEAR lt_log. WRITE icon_green_light AS ICON TO lt_log-type. CONCATENATE text-006 lf_idoc INTO lt_log-message SEPARATED BY space. WHEN OTHERS. CLEAR lt_log. WRITE icon_red_light AS ICON TO lt_log-type. CASE sy-subrc. WHEN 1. MOVE text-001 TO lt_log-message. WHEN 2. MOVE text-002 TO lt_log-message. WHEN 3. MOVE text-003 TO lt_log-message. WHEN 4. MOVE text-004 TO lt_log-message. WHEN 5. MOVE text-005 TO lt_log-message. ENDCASE.

ENDCASE. CONDENSE lt_log-message. APPEND lt_log. ENDFORM. " CREATE_IDOC Step 3: configurazione del partner profile e distribution model A chi mando l'IDOC? Al sistema partner. Chi il partner? Lo definisco nella transazione WE20(vedi tabella EDP21 per inbound parameters e tabella EDP13 per outbound parameters). Qui infatti specifico il partner profile di outbound (solitamente in questa fase occorre l'aiuto dei sistemisti). Ovvero specifico che un certo message type, deve essere recapitato ad un certo sistema receiver. Quindi l'IDOC ZMESSAGETYPE potrebbe per esempio essere mandato al Logical System PI di sviluppo (che in questo caso si chiama DPI001) e avremo:

Inoltre andr indicato il numero di porta del sistema receiver ed il basic type dell'IDOC. Per finire, configuriamo il Distribution Model, dalla transazione BD64. Qui definiamo un nome di modello, e gli associamo il nome del sistema sender, del receiver ed il message type dell'IDOC. Clicchiamo su Add Message Type (stando in modalit modifica) ed inseriamo queste informazioni.

Abbiamo finito. Non ci rimane che lanciare il programma. Questo estrarr i dati dal DB di R/3, caricher l'IDOC e lo inoltrer al sistema receiver. Il risultato di ci sar visualizzabile sulla transazione WE05.