Manchmal brauchst du ein SAP IDoc in Dateiform, z.B. um nachzuweisen, dass du die Daten richtig versendet hast, oder um Testdaten für dein Entwicklungssystem zu generieren. Hier sind mehrere Möglichkeiten, ein IDoc als Datei zu speichern:
- SE37 mit dem Funktionsbaustein IDOC_XML_TRANSFORM und etwas manueller Nacharbeit => XML
- SE38 mit einem eigenen Programm (Quellcode siehe unten) => XML
- Speichern aus dem Message Monitor eines SAP PI/PO, wenn das IDoc darüber versendet wurde => XML
- Export über die IDoc-Testtransaktion WE 19 und Speicherung über den Dateiausgang => internes Textformat, eine Zeile pro Segment
- WE02 über „Drucken“ => Ausgabe in Tabellenform, nicht weiterverwendbar, aber alle Felder des IDocs werden erklärt. Diese Ausgabe kannst du auch speichern
- Speichern des IDocs als generelles Ausgabeformat mit passendem Customizing in WE20/WE21
Welcher Weg für dich der richtige ist, hängt vom gewünschten Format ab. Außerdem könnte es sein, dass du nicht für alle Wege die nötigen Berechtigungen hast. Womöglich kannst du sie auch nicht bekommen.
Lass uns gemeinsam schauen, wie diese Möglichkeiten genau funktionieren und welche Vor- bzw. Nachteile sie haben. In der Regel brauchst du zumindest die Nummer des IDocs, das du als Datei speichern willst. Du bekommst sie aus den üblichen Transaktione zur IDoc-Suche, wie BD87 (IDoc nach Status) oder WE09 (Suche über Inhalt).
SE37 mit dem Funktionsbaustein IDOC_XML_TRANSFORM
Der Funktionsbaustein IDOC_XML_TRANSFORM bekommt als Eingabeparameter die Nummer des IDocs.
Nach F8 (Ausführen) erscheint ein Popup mit aufgeräumten XML.
Dieses kannst du folgendermaßen speichern:
- Alles markieren (mit der Maus drüberziehen oder CTRL-A wie „alles“)
- Kopieren (CTRL-C)
- Einfügen in deinen Lieblings-Texteditor wie Notepad++ oder z.B. den XML-Editor von FirstObject (Freeware).
Achtung: die Ausgabe hat überflüssige Leerzeichen, die das XML-Dokument syntaktisch ungültig machen. Daher sind mehrere Ersetzungen nötig. (Search/Replace), und zwar:
- „<blank“ => „<„
- „</blank>“ => „</“
- „blank/>“ => „/>“
Vorteile:
- du bekommst als Zielformat XML
Nachteile:
- die Ausgabe muss nachbearbeitet werden. Das ist OK, wenn du dies nur ab und zu brauchst. Wenn du es aber häufiger brauchst, ist es einfacher, ein Programm zu verwenden. Und das geht so:
SE38 mit einem eigenen Programm
Hier ist Quellcode für einen ABAP-Report Z_SAVE_IDOC_XML. Eingangsparameter ist die IDoc-Nummer. Anschließend wird der Dateiname in einem Standard-Speicherdialog von Windows abgefragt und die Datei wird auf der lokalen Festplatte abgelegt.
Vorteile:
- Die Ausgabe hat nicht die Formatierungsfehler von IDOC_XML_TRANSFORM
Nachteil:
- Du brauchst einen Entwicklerschlüssel auf dem System, um den Code einzuspielen. Möglicherweise hast du diesen nicht und kannst ihn auch nicht bekommen.
Hier ist der Quellcode für ein Programm Z_SAVE_IDOC_AS_XML_
*&---------------------------------------------------------------------* *& Report Z_SAVE_IDOC_AS_XML *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT z_save_idoc_as_xml. DATA: lv_filename TYPE string, lv_path TYPE string, lv_filetype TYPE string VALUE 'XML', lv_fullpath TYPE string, lv_xml_data TYPE string, lt_xml_table type STANDARD TABLE OF string. PARAMETERS: p_docnum TYPE edidc-docnum. * Prompt user for filename and location to save the XML file CALL METHOD cl_gui_frontend_services=>file_save_dialog EXPORTING default_extension = lv_filetype CHANGING filename = lv_filename path = lv_path fullpath = lv_fullpath. IF lv_filename IS INITIAL OR lv_path IS INITIAL. MESSAGE 'Filename or path not specified' TYPE 'E'. ENDIF. TRY. DATA(lo_idoc_xml) = NEW cl_idoc_xml1( docnum = p_docnum ). lo_idoc_xml->get_xmldata_as_string( IMPORTING data_string = lv_xml_data ). append lv_xml_data to lt_xml_table. CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING filename = lv_fullpath changing data_tab = lt_xml_table EXCEPTIONS file_write_error = 1 no_batch = 2 gui_refuse_filetransfer = 3 invalid_type = 4 no_authority = 5 unknown_error = 6 header_not_allowed = 7 separator_not_allowed = 8 filesize_not_allowed = 9 header_too_long = 10 dp_error_create = 11 dp_error_send = 12 dp_error_write = 13 unknown_dp_error = 14 access_denied = 15 dp_out_of_memory = 16 disk_full = 17 dp_timeout = 18 file_not_found = 19 dataprovider_exception = 20 control_flush_error = 21 not_supported_by_gui = 22 error_no_gui = 23 others = 24 . CATCH cx_root INTO DATA(lx_root). MESSAGE lx_root->get_text( ) TYPE 'E'. ENDTRY.
Parameter des Reports ist die Nummer des IDocs.
Die eigentliche Konvertierung des IDocs in einen XML-String geschieht mittels der Klasse cl_idoc_xml1. Diese gehört zum SAP-Lieferumfang. Dieser String wird dann über eine Standardfunktion zum Schreiben einer Textdatei auf dem lokalen Rechner des Anwenders gespeichert. Der Dateiname wird abgefragt.
Speichern aus dem Message Monitor eines SAP PI/PO
Oft werden IDocs über ein SAP-PI bzw. SAP-PO verschickt. (Ab Version 7.5 heißt es „PO“). Dieses übernimmt den Nachrichtenaustausch mit externen Systemen und ist in der Lage, umfangreiche Formatkonvertierungen vorzunehmen. Der Austausch von IDocs mit einem SAP-ERP-System ist mit einem PO leicht möglich.
Der Messagemonitor des PO kann dir die verarbeiten IDocs anzeigen und abspeichern. Es gibt hier auch die Möglichkeit, die XML-Datei vorher zu formatieren (Pretty-Print).
Vorteile:
- Das Datenfornat ist XML
- Über „Testnachricht versenden“ kannst du die generierten XML-Dateien weiterverwenden. Beispiel: wegen eines Programmfehlers ist das versendete IDoc fehlerhaft. XML-Datei holen, in einem Texteditor korrigieren, über „Testnachricht“ an das externe System verschicken. Das System verhält sich so, als ob das IDoc vom SAP gekommen wäre.
Nachteile:
- Wenn du als Entwickler das IDoc-Format gerade geändert hast, kann es sein, dass das neue Format im PO noch nicht bekannt ist. Abhilfe schafft das Löschen des Metadata-Caches, so dass das PO sich beim nächsten IDoc das Format neu lädt. Wenn dies unterbleibt, kann es sein, dass das PO die neuen Felder ode neuen Segmente nicht kennt und einfach unter den Tisch fallen lässt. Das sieht dann ggf. so aus, als ob der Sender diese Daten überhaupt nicht geliefert hat. Das gespeicherte XML ist also nicht notwenigerweise identisch mit dem IDoc, das von SAP tatsächlich verwendet wurde!
Speichern des IDocs als generelles Ausgabeformat mit passendem Customizing in WE20/WE21
Bei ausgehenden IDocs gibt es verschiedene Möglichkeiten, was mit diesen geschehen soll. Üblich ist die Übergabe an ein PI/PO. Man kann aber auch die IDocs auf das Dateisystem des SAP-Applicationservers schreiben und sie von dort mit Bordmitteln, also ohne PO, weiterverarbeiten. Dazu braucht man dann z.B. regelmäßige Batchprogramme, die sich um diese Dateien kümmern.
Zum sporadischen Kopieren oder Analysieren von IDocs eignet sich dieser Weg aber nicht. Daher werde ich ihn an dieser Stelle nicht weiter betrachten.
Export über die IDoc-Testtransaktion WE19
Die Testtransaktion WE19 bietet die Möglichkeit, ein IDoc zu kopieren, zu bearbeiten und zu versenden. Auf Produktivsystemen erfolgt zunächst eine deutliche Warnung, dass diese Transaktion auf Produktivsystemen nicht aufgerufen werden soll.
Wichtiger Hinweis: die resultierende Datei hat ein technisches Format. Du kannst damit ein Idoc von einem System herunterladen, um sie auf einem anderen SAP-System wieder hochzuladen. Aber es entsteht KEIN XML.
Zum Speichern eines IDocs und zum Kopieren auf ein Testsystem bietet diese Transaktion aber eine hilfreiche Möglichkeit.
Hier ist eine Schritt-für-Schritt-Anleitung:
Du startest die Transaktion WE19 und gibtst die Nummer des gewünschten IDocs ein.
Nach F8 oder Drücken des grünen Buttons erscheit dieser Dialog. Hier kannst du zunächst die Daten des IDocs ändern, sofern du das willst.
Anschließend gibt es mehrere Möglichkeiten, was du mit dem IDoc nun machen kannst. In diesem Falle nimmst du „Eingang Datei“. Es erscheint dann dieser Dialog.
Hier ist es ganz wichtig, dass du die Checkbox „IDoc-Eingangsverbeitung der Datei sofort starten“ NICHT ankreuzt. Du willst die Datei ja nicht verarbeiten, sondern nur speichern. Wenn du dies auf einem Produktivsystem machst und die Checkbox angekreuzt ist, dann erzeugst UND verarbeitest du das IDoc erneut.
Als Pfadname eigenet sich das Temp-Verzeichnis. Welches der absolute Pfad des Tempverzeichnisses ist, kannst du in der Transaktion AL11 nachsehen:
Nun hast du die Datei auf dem SAP-Applicationserver abgelegt. Aber wie kommst du an die Datei heran?
Hier gibt es zwei Wege.
- Wenn Du einen Shellzugang zum SAP-Applicationserver hast, kannst Du ein Programm wie WinSCP verwenden, um die Datei direkt herunterzuladen. Wenn nicht gibt es noch
- CG3Y: herunterladen einer Datei.
Nachteile:
- Es entsteht auf dem System ein neues IDoc, das nicht verarbeitet werden darf.
- Das Ausgabeformat ist nicht XML.
WE02 über „Drucken“
Vorteile:
- Zu jedem Feld bekommst du den technischen Namen, den Inhalt UND die Bedeutung des Felds. Das ist ein guter Weg, um alle Felder des IDocs erklärt zu bekommen.
Nachteile:
- Man bekommt eine Textwüste und keine XML-Datei. Die Datei ist unübersichtlich. Man kann die Ausgabe als Datei speichern, aber es wird nicht möglich sein, diese Datei irgendwie automatisch weiterzuverabeiten.
Zusammenfassung
Zwei der genannten Wege sind die einfachsten:
- Im SAP ist SE37 mit dem Funktionsbaustein IDOC_XML_TRANSFORM das einfachste.
- Wenn ein PI/PO-System involviert ist, dann führt der Message Monitor dort auch direkt zum Ziel.
Mehr SAP-Tipps und Tricks findest du hier.