Header orange

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

Guida publicata da: Anonymous
Parole chiave: SAP, IDOC, outbound, segmenti, transazione, codice ABAP, creare, configurare, inviare.

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.

-Sei uno sviluppatore ABAP? Salva il tuo codice (o la tua guida) su You-Specialist, lo troverai sempre disponibile su internet! Usa questo link, inserisci il codice nel form e noi lo pubblicheremo. Ricorda di dare una breve descrizione sull'utilizzo del codice o sulla sua funzione-


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 = c_mestypp.
lw_edidcp-idoctp = c_idoctpp.
lw_edidcp-rcvprt = c_rcvprt.
lw_edidcp-rcvprn = 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.

ADS LINK LARGO 2