[SAP] IDOC-Verarbeitung

Transaktionen

BD67 (Eingangsmethoden pflegen)
BD79 (Pflege IDoc-Umsetzungsregeln)
BD87 (Statusmonitor für ALE-Nachrichten)

  • “IDocs im Eingang” selektieren -> Button “Verarbeiten”

SALE (ALE-Customizing anzeigen)
WE02 / WE05 (IDoc-Listen)

  • Selektion der IDocs
  • IDoc im ALV doppelklicken
  • Datensätz aufklappen
  • Doppelklick auf A4-Seiten-Icon vor dem Segment
  • Menü -> Datensatz -> Anzeigen -> Ändern
  • Einträge Ändern
  • Button “Speichern” (Blaue Diskette)

WE09 (IDocs suchen über Inhalt)
WE07 (IDoc Statistik)
WE11 (Löschen von IDocs)
WE19 (IDoc-Testwerkzeug (Simulation, Test und Verbuchung))

  • IDOC-Debugging
  • Erzeugen von Kopien eines existierenden IDocs -> ggf. Gefahr von Doppelbuchungen im System

WE20 (Partnervereinbarungen)
WE21 (Portbeschreibung)
WE30 (Entwicklung IDoc-Typ)
WE31 (Entwicklung IDoc-Segment)
WE41 (Vorgangscodes im Ausgang)
WE42 (Vorgangscodes im Eingang)
WE44 (Partnerarten und Prüfungen)
WE57 (Zuordnung Nachrichten zu Anw.-Objekt)
WE60 (Dokumentation für IDoc-Typen)
WE64 (Dokumentation Nachrichtentypen)
WE81 (Logische Nachrichtentypen)
WE82 (Zuordnung Nachrichten zu IDoc-Typ)
WE84 (Assignment of IDoc and appl. fields)
WLF_IDOC (IDoc Verarbeitung)

Programme

RC1_IDOC_SET_STATUS (EHS: Report zum IDOC-Status Umsetzen (nur für interne Zwecke von EHS)
RBDINPUT (Verarbeitung von eingehenden IDocs)
RBDMANIN (Starten der Fehlerbehandlung für nicht eingebuchte IDocs)
RBDMANI2 (Manuelle Verarbeitung von IDocs: Nicht gebuchte IDocs einbuchen)
RBDAPP01 (Eingangsverarbeitung von übergabebereiten IDocs)

Funktionsbausteine

EDI_DATA_INCOMING (EDI: Aufruf der Eingangsverarbeitung für eine IDoc-Datei)
IDOC_INBOUND_ASYNCHRONOUS (IDoc-Eingangsverarbeitung über tRFC)
IDOC_INBOUND_SINGLE (Eingangsverarbeitung für ein übergebenes IDoc)
IDOC_INBOUND_IN_QUEUE (IDoc: Eingang über qRFC)
IDOC_INBOUND_XML_SOAP_HTTP (eingang über soap http)
IDOC_INBOUND_XML_VIA_HTTP (eingang über http)
IDOC_CTRL_INBOUND_CONVERT (Konvertierung IDoc-Datensatz von externer in interne Darstellung)
IDOC_DATA_INBOUND_CONVERT (Konvertierung IDoc-Datensatz von externer in interne Darstellung)
IDOC_INBOUND_PROCESS_DATA_GET (Lesen der Verarbeitungsdaten für die IDoc-Eingangsverarbeitung)
IDOC_INBOUND_WRITE_TO_DB (Eingangs-IDoc mit Struktur EDI_DD wird auf der Datenbank abgespeichert)
IDOC_OUTPUT_ORDERS (Ausgabe Bestellungen für EDI in Zwischenstruktur ab Release 3.0A)
MASTER_IDOC_DISTRIBUTE (Schnittstelle der Anwendung zur ALE-Schicht auf der Ausgangsseite)
COMMUNICATION_IDOC_CREATE (ALE-Verarbeitung von Master-IDoc zu Communication-IDocs)
EDI_OUTPUT_NEW (EDI: Kommunikation)
ALE_IDOC_SERVICES_APPLY_IN (Ausführen der ALE-Services (Filtern, Umsetzen, …) für ein IDoc: Eingang)
ALE_IDOC_SERVICES_APPLY_OUT (Ausführen der ALE-Services (Filtern, Umsetzen, …) für ein IDoc: Ausgang)

Tabellen

EDIDC (Kontrollsatz (IDoc))
EDIDS (Statussatz (IDoc))
EDID4 (IDoc-Datensätze ab 4.0)
EDISDEF (IDoc Entwicklung : IDoc Segmentdefinitionen)
EDSAPPL (EDI: IDoc-Segment Anwendungsstruktur)
EDIMSGT (Kurzbeschreibung der SAP Nachrichtentypen)
EDIPORT (Sammeltabelle für alle Porttypen zur IDoc-Verarbeitung)
TBDLS (Logisches System)
EDIFCT (IDoc: Zuordnung von FB zu log. Nachricht und IDoc Typ)
TEDS2 (Kurzbeschreibung der IDoc-Statuswerte)

Includes

MBDCONST (ALE – Konstanten)

Links

[SAP] IDoc Monitor – IDocs vergleichen

WLF_IDOC (IDoc Verarbeitung)

  • Selektionsbild -> Button “Ausführen”
  • im ALV -> Button “Vergleichen”

Hinweis

Die Funktionen “Kontrollsatz verändern”, “IDoc kopieren und Segment löschen”, “IDoc-Status ändern” können im Produktivsystem nur genutzt werden, wenn

  • Benutzer die Berechtigung hat
  • SU3 Parameter RWLFIDOC_NEW_EXPERT = X gesetzt ist
  • nach der Selektion der IDocs „&EXPERT“ ins Transaktionsfeld eingegeben wurde

Links

[ABAP] IDoc: Basistyp lesen

TYPES: ty_it_pt_syntax TYPE STANDARD TABLE OF edi_iapi02 WITH DEFAULT KEY.
TYPES: ty_it_pt_extensions TYPE STANDARD TABLE OF edi_iapi04 WITH DEFAULT KEY.

* Segmenttyp
PARAMETERS: p_ityp TYPE edbas-idoctyp.

DATA(lv_pe_attributes) = VALUE edi_iapi01( ).
DATA(it_pt_syntax) = VALUE ty_it_pt_syntax( ).
DATA(it_pt_pre_syntax) = VALUE ty_it_pt_syntax( ).
DATA(it_pt_extensions) = VALUE ty_it_pt_extensions( ).

CALL FUNCTION 'IDOCTYPE_READ'
  EXPORTING
    pi_idoctyp       = p_ityp
  IMPORTING
    pe_attributes    = lv_pe_attributes
  TABLES
    pt_syntax        = it_pt_syntax
    pt_pre_syntax    = it_pt_pre_syntax
    pt_extensions    = it_pt_extensions
  EXCEPTIONS
    object_not_found = 1
    db_error         = 2
    no_authority     = 3
    OTHERS           = 4.

IF sy-subrc = 0.
  cl_demo_output=>write( lv_pe_attributes ).
  cl_demo_output=>write( it_pt_syntax ).
  cl_demo_output=>write( it_pt_pre_syntax ).
  cl_demo_output=>write( it_pt_extensions ).
  cl_demo_output=>display( ).
ENDIF.

[ABAP] IDoc: Strukturen der IDoc-Segmente in eine interne Tabelle lesen

* http://thinkdoforward.com/sap-idoc-tabellen-erfahrene-berater-kennen-diese-tabellen/

* Tabellen: EDIDC   – Kontrollsatz (IDoc)
*           EDIDS   – Statussatz (IDoc)
*           EDID4   – IDoc-Datensätze ab 4.0
*           EDISDEF - IDoc Entwicklung : IDoc Segmentdefinitionen
*           EDSAPPL - EDI: IDoc-Segment Anwendungsstruktur
*           EDIMSGT - Kurzbeschreibung der SAP Nachrichtentypen

TYPES: BEGIN OF ty_idoc_seg_entry,
         seg_name  TYPE string,
         comp_name TYPE string,
         value     TYPE string,
       END OF ty_idoc_seg_entry.

* IDoc-Nummer
PARAMETERS: p_idoc TYPE edidc-docnum DEFAULT '12345'.

START-OF-SELECTION.

* Lesen Segmentdaten des IDocs
  SELECT *
    INTO TABLE @DATA(it_int_edid)
    FROM edid4
    WHERE docnum EQ @p_idoc.

  IF sy-subrc = 0.
* Tabelle für aufbereitete Segmentdaten
    DATA: it_segment_data TYPE STANDARD TABLE OF ty_idoc_seg_entry WITH DEFAULT KEY.

* all. Feldsymbol für Umwandlung der Daten
    FIELD-SYMBOLS: <seg_data> TYPE any.

* Segmentdaten auslesen
    LOOP AT it_int_edid ASSIGNING FIELD-SYMBOL(<s>).
* Typecast für Umwandlung LCHR -> Type
      ASSIGN <s>-sdata TO <seg_data> CASTING TYPE (<s>-segnam).

* Typedescriptor zum Auslesen der einzelnen Datenfelder
      DATA(o_type) = cl_abap_typedescr=>describe_by_data( <seg_data> ).

      CASE o_type->kind.
* wenn Strukturtyp
        WHEN cl_abap_typedescr=>kind_struct.
          DATA(o_desc) = CAST cl_abap_structdescr( o_type ).

* Datenfelder der Struktur durchloopen
          LOOP AT o_desc->get_components( ) ASSIGNING FIELD-SYMBOL(<c>).
* Wert des Feldes auslesen
            ASSIGN COMPONENT <c>-name OF STRUCTURE <seg_data> TO FIELD-SYMBOL(<val>).
            IF <val> IS ASSIGNED.
* Zeile für Segment erstellen mit Segmentname, Komponenten-(Feld-)name, Wert
              APPEND VALUE #( seg_name  = <s>-segnam
                              comp_name = <c>-name
                              value     = <val>
                            ) TO it_segment_data.
            ENDIF.
          ENDLOOP.

        WHEN OTHERS.

      ENDCASE.
    ENDLOOP.

* Datenausgabe
    cl_demo_output=>display( it_segment_data ).
  ENDIF.

[ABAP] IDoc: Segmente und Statusinfos lesen

* http://thinkdoforward.com/sap-idoc-tabellen-erfahrene-berater-kennen-diese-tabellen/

* Tabellen: EDIDC   – Kontrollsatz (IDoc)
*           EDIDS   – Statussatz (IDoc)
*           EDID4   – IDoc-Datensätze ab 4.0
*           EDISDEF - IDoc Entwicklung : IDoc Segmentdefinitionen
*           EDSAPPL - EDI: IDoc-Segment Anwendungsstruktur
*           EDIMSGT - Kurzbeschreibung der SAP Nachrichtentypen

* IDoc-Nummer
PARAMETERS: p_idoc TYPE edidc-docnum DEFAULT '12345'.

START-OF-SELECTION.

  DATA: lv_idoc_control TYPE edidc.
  DATA: lv_number_of_data_records TYPE sy-dbcnt.
  DATA: lv_number_of_status_records TYPE sy-dbcnt.
  DATA: it_int_edids TYPE STANDARD TABLE OF edids WITH DEFAULT KEY.
  DATA: it_int_edidd TYPE STANDARD TABLE OF edidd WITH DEFAULT KEY.

* Lesen aller Informationen eines IDocs
  CALL FUNCTION 'IDOC_READ_COMPLETELY'
    EXPORTING
      document_number          = p_idoc
    IMPORTING
      idoc_control             = lv_idoc_control
      number_of_data_records   = lv_number_of_data_records
      number_of_status_records = lv_number_of_status_records
    TABLES
      int_edids                = it_int_edids
      int_edidd                = it_int_edidd
    EXCEPTIONS
      document_not_exist       = 1
      document_number_invalid  = 2
      OTHERS                   = 3.

  IF sy-subrc = 0.
    cl_demo_output=>write_data( lv_idoc_control ).
    cl_demo_output=>write_data( lv_number_of_data_records ).
    cl_demo_output=>write_data( lv_number_of_status_records ).
    cl_demo_output=>write_data( it_int_edids ).
    cl_demo_output=>write_data( it_int_edidd ).
    cl_demo_output=>display( ).
  ENDIF.

[ABAP] IDoc: Infos zu IDoc-Typ lesen (Segmente, Felder)

* Tabelle EDBAS
PARAMETERS: p_btype TYPE edbas-idoctyp DEFAULT 'ORDERS05'.

START-OF-SELECTION.

  DATA: lv_pe_header TYPE edi_iapi10.

  DATA: it_pt_segments TYPE STANDARD TABLE OF edi_iapi11 WITH DEFAULT KEY.
  DATA: it_pt_fields TYPE STANDARD TABLE OF edi_iapi12 WITH DEFAULT KEY.
  DATA: it_pt_fvalues TYPE STANDARD TABLE OF edi_iapi14 WITH DEFAULT KEY.
  DATA: it_pt_messages TYPE STANDARD TABLE OF edi_iapi17 WITH DEFAULT KEY.

* IDoctyp mit Segmenten lesen (RFC-fähig)
  CALL FUNCTION 'IDOCTYPE_READ_COMPLETE'
    EXPORTING
      pi_idoctyp         = p_btype
    IMPORTING
      pe_header          = lv_pe_header
    TABLES
      pt_segments        = it_pt_segments
      pt_fields          = it_pt_fields
      pt_fvalues         = it_pt_fvalues
      pt_messages        = it_pt_messages
    EXCEPTIONS
      object_unknown     = 1
      segment_unknown    = 2
      relation_not_found = 3.

  IF sy-subrc = 0.
    cl_demo_output=>write_data( lv_pe_header ).
    cl_demo_output=>write_data( it_pt_segments ).
    cl_demo_output=>write_data( it_pt_fields ).
    cl_demo_output=>write_data( it_pt_fvalues ).
    cl_demo_output=>write_data( it_pt_messages ).
    cl_demo_output=>display( ).
  ENDIF.

[ABAP] IDoc als XML-Datei speichern

PARAMETERS: p_idoc TYPE edi_docnum.

START-OF-SELECTION.

  TRY.
      DATA(o_idoc_xml) = NEW cl_idoc_xml1( docnum = p_idoc ).

      DATA: lv_xml TYPE string.

      o_idoc_xml->get_xmldata_as_string( IMPORTING data_string = lv_xml ).

      DATA(it_xml) = VALUE stringtab( ( |{ lv_xml }| ) ).

      DATA: lv_temp_dir TYPE string.

* Temp-Directory holen
      cl_gui_frontend_services=>get_desktop_directory( CHANGING desktop_directory = lv_temp_dir ).
* Note 1442303, sonst ist lv_temp_dir leer
      cl_gui_cfw=>flush( ).

* Dateinamen zusammenbauen
      DATA(lv_filename) = |{ lv_temp_dir }\\my_xml.xml|.

* Datei im Zielverzeichnis erzeugen
      cl_gui_frontend_services=>gui_download( EXPORTING
                                                filename = lv_filename
                                                filetype = 'ASC'
                                              CHANGING
                                                data_tab = it_xml ).

      WRITE: / lv_filename.
    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.