Im SAP ERP– bzw. SAP S/4HANA-System ist es notwendig, Dokumente via ArchiveLink abzulegen und in einer Anwendung anzeigen bzw. aufrufen zu lassen. Hiermit ist es möglich, Dokumente abzulegen und aufzurufen. In diesem Artikel wird näher erläutert wie man mithilfe einem ABAP-Programm einfach und schnell eine Ablage via ArchiveLink einrichtet und gleichzeitig wieder ermitteln kann. Zudem hinaus wird gezeigt wie man Dokumente als XSTRING ermitteln kann.
Datenablage via ArchiveLink
Das Vorgehen für die Einrichtung einer Datenablage via ArchiveLink in Form einer Datenbankablage ist im SAP Hinweis 595563 im Detail beschrieben. Darin wird erläutert, dass folgende Schritte für die Einrichtung notwendig sind:
- HTTP Port aktivieren – Transaktion SMICM
- Service „/sap/bc/contentserver“ aktivieren – Transaktion SICF
- Zertifikat für System-PSE einrichten – Transaktion STRUST
- Gültiges Austauschverzeichnis festlegen – Programm RSPARAM (Transaktion SA38)
- Tabelle erstellen als Kopie von SDOKCONT1 – Transaktion SE11
- Content-Repository erstellen – Transaktion OAC0
- Dokumentart erstellen – Transaktion OAC2 und OAC3
- ABAP-Report für Dokumentenablage via ArchiveLink
Die hier erläuterten Schritte sind für die Ablage kleinerer Dateien geeignet. Im Produktivsystem oder bei größeren Daten sollte man die Daten nicht in Form einer Datenbankablage speichern, sondern mit einem SAP Content Server.
HTTP Port aktivieren
Zuerst muss geprüft werden, ob der HTTP-Port aktiv ist. Hierfür startet man die Transaktion SMICM und ruft die Serviceanzeige mit „Springen > Services“ oder „Umschalt+F1“ auf. Hier gilt es zu prüfen, ob der Port für das Protokoll HTTP eingerichtet ist. Es muss ein Port außer 0 vorhanden sein. Wenn dieser HTTP-Port fehlt, muss er definiert werden über „Services > Anlegen“.
Über „Services > Aktivieren“ kann man den HTTP-Port aktivieren, falls er deaktiviert ist.
Service „/sap/bc/contentserver“ aktivieren
Als Nächstes prüft man in der Transaktion SICF, ob der Service „/sap/bc/contentserver“ aktiv ist. Wenn nicht, kann man ihn mit einem Rechtsklick aktivieren.
Zertifikat für System-PSE einrichten
Im Trust-Manager muss das Zertifikat für das System-PSE eingerichtet und aktiviert sein. Das kann man einfach in der Transaktion STRUST prüfen und ggf. anpassen.
Gültiges Austauschverzeichnis festlegen
Für die Dokumentenablage muss ein geeignetes Austauschverzeichnis ermittelt werden. Es empfiehlt sich, den globalen Profil-Parameter „DIR_GLOBAL“ zu verwenden. Mit dem Report RSPARAM und der Transaktion SA38 kann man die Profil-Parameter im System anzeigen lassen und ein passendes Verzeichnis ermitteln.
Tabelle erstellen als Kopie von SDOKCONT1
Die Dokumente werden in einer SAP-Tabelle gespeichert. Als Vorlage für dieses Vorgehen eignet sich die Tabelle SDOKCONT1 ideal. Hierbei handelt es sich um eine SAP-Tabelle für Dokumenteninhalte. Sowohl für einen Import als auch einen Export. Die Tabelle befindet sich im Paket SDOK.
Um eine eigene Tabelle auf Basis der Tabelle SDOKCONT1 erstellen zu können, ruft man den ABAP-Dictionary mit dem Transaktionscode SE11 auf. Im Feld „Datenbanktabelle“ gibt man die Tabelle SDOKCONT1 ein und klickt auf den Button „Kopieren“ oder die Tastenkombination „Strg+F5“. Im Feld „nach Tabelle“ gibt man den gewünschten Namen an. Hierbei muss man auf den Namensraum achten.
Nach Klick auf „Weiter“ bzw. Enter, gibt man das Paket an, in das man die Tabelle zuordnen möchte.
Nach dem Erstellen der Tabelle kann sie noch nicht genutzt werden. Es soll die Erweiterungskategorie definiert werden und die Tabelle muss noch aktiviert werden. Dafür gibt man im ABAP-Dictionary (Transaktion SE11) einfach im Feld „Datenbanktabelle“ den Namen der erstellten Tabelle ein und geht anschließend in den Änderungsmodus. Unter „Zusätze > Erweiterungskategorie…“ wählt man nun die Erweiterungskategorie aus. Es empfiehlt sich, diese Tabelle als „beliebig erweiterbar“ einzustellen.
Anschließend aktiviert man die Tabelle, indem man auf den Button „Aktivieren“ klickt oder „Strg+F3“ nutzt.
Content-Repository erstellen
Ein Content-Repository ist die Schnittstelle zwischen dem physischen Ablageort der Dokumente (Tabelle auf Basis von SDOKCONT1) und dem SAP-System selbst. Für die Datenablage via ArchiveLink muss deshalb ein Content-Repository in der Transaktion OAC0 angelegt werden.
Sobald man die Transaktion OAC0 aufruft, klickt man auf den „Anlegen“-Button oder verwendet die F5-Taste. Eventuell muss man in den Änderungsmodus wechseln.
Anschließend gibt man in der Detailansicht die notwendigen Informationen für das Content-Repository an. Folgende Informationen sind bei der Erstellung des Content-Repositories notwendig:
- Dokumentenbereich: ARCHLINK (ArchiveLink)
- Ablagetyp: Datenbank des SAP-Systems
- Ablagesubtyp: Normal
- Inhaltstabelle: <erstellte Tabelle auf Basis von SDOKCONT1>
Dokumentart erstellen
Die Klassifizierung der Dokumente erfolgt über eine Dokumentart. Hierbei erstellt man in der Transaktion OAC2 eine gewünschte Dokumentart. Dabei gibt man auch den Dokumententyp an. In diesem Beispiel werden somit PDF-Dokumente via ArchiveLink abgelegt.
Nachdem die Dokumentart in der Transaktion OCA2 erstellt wurde, muss diese dem Content-Repository verknüpft werden. Die Verknüpfung für Content-Repositories wird in der Transaktion OAC3 eingerichtet. Hier gibt man den Objekttyp, die Dokumentart, das Content-Repository, die Verknüpfungstabelle und die Verweilzeit an. Im Änderungsmodus kann man einfach einen neuen Eintrag hinzufügen.
In diesem Beispiel legen wir das Dokument mit dem Objekttyp „DRAW“ ab und verknüpfen es mit der Verknüpfungstabelle TOA01. Als Alternative sind TOA02 und TOA03 ebenfalls möglich.
ABAP-Report für Dokumentenablage via ArchiveLink
Mit einem einfachen Report kann man nun Dokumente via ArchiveLink ablegen. Dabei verwendet man folgende Funktionsbausteine:
- ARCHIVOBJECT_CREATE_FILE
- Legt die Datei über logischen oder physischen Pfad ab
- ARCHIV_CONNECTION_INSERT
- Fügt einen Satz in der Verknüpfungstabelle ein
- Gemäß Customizing in der Transaktion OAC3, z. B. TOA01
- ARCHIVOBJECT_DELETE
- Löscht das abgelegte Dokument, falls kein Eintrag in der Verknüpfungstabelle erzeugt werden konnte
*&---------------------------------------------------------------------* *& Report Z_DOK_ARCHIVELINK *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT z_dok_archivelink. *---------------------------------------------------------------------- * Datendeklaration *---------------------------------------------------------------------- DATA: lv_arc_doc_id TYPE saeardoid, lv_archiv_id TYPE saearchivi, lv_doc_type TYPE saedoktyp. *---------------------------------------------------------------------- * Selektionsbild *---------------------------------------------------------------------- PARAMETERS: p_file TYPE saepfad LOWER CASE, p_sapobj TYPE toa01-sap_object, p_arobj TYPE toa01-ar_object, p_objid TYPE saeobjid LOWER CASE. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN PUSHBUTTON /2(38) save_doc USER-COMMAND save_doc. SELECTION-SCREEN SKIP 1. PARAMETERS p_docid TYPE saeardoid. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN PUSHBUTTON /2(38) show_doc USER-COMMAND show_doc. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN COMMENT /2(38) TEXT-001. "Customizing für Datenablage SELECTION-SCREEN PUSHBUTTON /2(38) smicm USER-COMMAND smicm. SELECTION-SCREEN PUSHBUTTON /2(38) sicf USER-COMMAND sicf. SELECTION-SCREEN PUSHBUTTON /2(38) strust USER-COMMAND strust. SELECTION-SCREEN PUSHBUTTON /2(38) sa38 USER-COMMAND sa38. SELECTION-SCREEN PUSHBUTTON /2(38) se11 USER-COMMAND se11. SELECTION-SCREEN PUSHBUTTON /2(38) oac0 USER-COMMAND oac0. SELECTION-SCREEN PUSHBUTTON /2(38) oac2 USER-COMMAND oac2. SELECTION-SCREEN PUSHBUTTON /2(38) oac3 USER-COMMAND oac3. *---------------------------------------------------------------------- * Initialisierung *---------------------------------------------------------------------- INITIALIZATION. save_doc = |{ icon_system_save }Dokument via ArchiveLink ablegen|. show_doc = |{ icon_display }Dokument anzeigen|. smicm = |{ icon_execute_object }HTTP-Port aktivieren (SMICM)|. sicf = |{ icon_execute_object }Service aktivieren (SICF)|. strust = |{ icon_execute_object }Zertifikat einrichten (STRUST)|. sa38 = |{ icon_execute_object }Austauschverzeichnis|. se11 = |{ icon_execute_object }Tabelle erstellen (SE11)|. oac0 = |{ icon_execute_object }Content-Repository (OAC0)|. oac2 = |{ icon_execute_object }Dokumentart erstellen (OAC2)|. oac3 = |{ icon_execute_object }Verknüpfung einrichten (OAC3)|. *---------------------------------------------------------------------- * AT SELECTION-SCREEN - Lokale Datei *---------------------------------------------------------------------- AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. CLEAR p_file. CALL FUNCTION 'WS_FILENAME_GET' EXPORTING mask = '*.*' title = 'Datenbankablage via ArchiveLink' IMPORTING filename = p_file EXCEPTIONS inv_winsys = 1 no_batch = 2 selection_cancel = 3 selection_error = 4 OTHERS = 5. *---------------------------------------------------------------------- * AT SELECTION-SCREEN - Buttons *---------------------------------------------------------------------- AT SELECTION-SCREEN. CASE sy-ucomm. WHEN 'SAVE_DOC'. *---------------------------------------------------------------------- * Prüfe Customizing (OAC3) *---------------------------------------------------------------------- CLEAR lv_archiv_id. CLEAR lv_doc_type. SELECT SINGLE archiv_id doc_type FROM toaom INTO (lv_archiv_id, lv_doc_type) WHERE sap_object = p_sapobj AND ar_object = p_arobj. IF lv_archiv_id IS NOT INITIAL AND lv_doc_type IS NOT INITIAL. *---------------------------------------------------------------------- * Legt die Datei über logischen oder physischen Pfad ab *---------------------------------------------------------------------- CALL FUNCTION 'ARCHIVOBJECT_CREATE_FILE' EXPORTING archiv_id = lv_archiv_id document_type = lv_doc_type path = p_file IMPORTING archiv_doc_id = lv_arc_doc_id EXCEPTIONS error_archiv = 1 error_communicationtable = 2 error_upload = 3 error_kernel = 4 OTHERS = 5. IF sy-subrc = 0. p_docid = lv_arc_doc_id. *---------------------------------------------------------------------- * Fügt einen Satz in der Verknüpfungstabelle ein *---------------------------------------------------------------------- CALL FUNCTION 'ARCHIV_CONNECTION_INSERT' EXPORTING archiv_id = lv_archiv_id arc_doc_id = lv_arc_doc_id ar_object = p_arobj object_id = p_objid sap_object = p_sapobj doc_type = lv_doc_type EXCEPTIONS error_connectiontable = 1 OTHERS = 2. IF sy-subrc = 0. MESSAGE 'Datenbankablage erfolgreich' TYPE 'S'. ELSE. *---------------------------------------------------------------------- * Löscht das abgelegte Dokument, falls kein Eintrag in der Verknüpfungstabelle erzeugt werden konnte *---------------------------------------------------------------------- CALL FUNCTION 'ARCHIVOBJECT_DELETE' EXPORTING archiv_id = lv_archiv_id archiv_doc_id = lv_arc_doc_id EXCEPTIONS error_archiv = 1 error_communicationtable = 2 error_kernel = 3 OTHERS = 4. MESSAGE 'Fehler bei Datenbankablage' TYPE 'E'. ENDIF. ELSE. MESSAGE 'Fehler bei Archivierung' TYPE 'E'. ENDIF. ELSE. "Fehler im Customizing in OAC3 MESSAGE 'Fehler im Customizing - Bitte OAC3 prüfen.' TYPE 'E'. ENDIF. WHEN 'SHOW_DOC'. IF p_docid IS NOT INITIAL AND lv_archiv_id IS NOT INITIAL. *---------------------------------------------------------------------- * Zeige Dokument im Document Viewer an *---------------------------------------------------------------------- CALL FUNCTION 'ARCHIVOBJECT_DISPLAY' EXPORTING archiv_doc_id = p_docid archiv_id = lv_archiv_id. IF sy-subrc <> 0. MESSAGE 'Dokument kann nicht angezeigt werden' TYPE 'E'. ENDIF. ELSE. MESSAGE 'Dokument-Id, Dokumenttyp oder Objekttyp fehlt' TYPE 'W'. ENDIF. WHEN 'SMICM'. CALL TRANSACTION 'SMICM'. WHEN 'SICF'. CALL TRANSACTION 'SICF'. WHEN 'STRUST'. CALL TRANSACTION 'STRUST'. WHEN 'SA38'. SET PARAMETER ID 'RID' FIELD 'RSPARAM'. CALL TRANSACTION 'SA38'. WHEN 'SE11'. SET PARAMETER ID 'DTB' FIELD 'SDOKCONT1'. CALL TRANSACTION 'SE11'. WHEN 'OAC0'. CALL TRANSACTION 'OAC0'. WHEN 'OAC2'. CALL TRANSACTION 'OAC2'. WHEN 'OAC3'. CALL TRANSACTION 'OAC3'. ENDCASE.
Mit dem Button „Dokument anzeigen“ wird der Funktionsbaustein ARCHIVOBJECT_DISPLAY aufgerufen, der das gespeicherte Dokument anzeigt.
Wenn man nun ein Dokument erfolgreich hochgeladen hat, kann man in der Verknüpfungstabelle (TOA01) und Inhaltstabelle (ZERP_SDOKCONT1) mit dem Data Browser (Transaktion SE16N) die Einträge erfolgreich überprüfen.
Du möchtest Dein ABAP-Wissen vertiefen? Hier erfährst Du die besten ABAP-Tricks beim Entwickeln.
Hier erhältst Du den perfekten Einstieg in ABAP.
Ermittlung der Dokumente via ArchiveLink
Wie im vorherigen Abschnitt gesehen, kann man den Funktionsbaustein ARCHIVOBJECT_DISPLAY nutzen, um sich Dokumente via ArchiveLink anzeigen zu lassen. Man kann also den ABAP-Report Z_DOK_ARCHIVELINK auch dafür nutzen, Dokumente via ArchiveLink anzeigen zu lassen, wenn man die Dokumenten-ID, den Objekttyp und die Dokumentart kennt.
Eine im SAP-Standard zur Verfügung stehende Transaktion ist die ArchiveLink-Administration für abgelegte Dokumente im Transaktionscode OAAD. Sobald man auf den Button „Technische Suche“ klickt, kann man ebenfalls nach den abgelegten Dokumenten suchen und sich diese anzeigen lassen.
Abgelegte Dokumente als XSTRING zurückgeben
Die via ArchiveLink abgelegten Dokumente sollen häufig in einem externen System verarbeitet werden. Hierzu müssen die Dokumente ausgelesen und als XSTRING zurückgegeben werden.
Mit dem folgenden ABAP-Report kann man sich die abgelegten Dokumente als XSTRING ausgeben lassen. Hierfür muss man folgende Informationen haben
- Dokumentart
- Objekt-ID
- Business Objekt
Das Content-Repository und der Dokumenttyp kann man durch Selektion auf die Tabelle TOAOM (Transaktion OAC3) ermitteln. Das ist generell eine Voraussetzung für eine Dokumentenablage via ArchiveLink.
*&---------------------------------------------------------------------* *& Report Z_DOK_AL_XSTRING *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT z_dok_al_xstring. *---------------------------------------------------------------------- * Datendeklaration *---------------------------------------------------------------------- DATA: lv_archiv_id TYPE saearchivi, lv_doc_type TYPE saedoktyp, lt_bin_data TYPE STANDARD TABLE OF tbl1024 WITH DEFAULT KEY, lv_length TYPE i VALUE 0, lv_xstring TYPE xstring. PARAMETERS: p_arobj TYPE toa01-ar_object, p_objid TYPE saeobjid, p_sapobj TYPE toa01-sap_object. IF p_arobj IS NOT INITIAL AND p_objid IS NOT INITIAL AND p_sapobj IS NOT INITIAL. *---------------------------------------------------------------------- * Prüfe Customizing (OAC3) *---------------------------------------------------------------------- CLEAR lv_archiv_id. CLEAR lv_doc_type. SELECT SINGLE archiv_id doc_type FROM toaom INTO (lv_archiv_id, lv_doc_type) WHERE sap_object = p_sapobj AND ar_object = p_arobj. IF lv_archiv_id IS NOT INITIAL AND lv_doc_type IS NOT INITIAL. CLEAR: lt_bin_data. *---------------------------------------------------------------------- * Binärdaten aus dem Archiv-Objekt lesen *---------------------------------------------------------------------- CALL FUNCTION 'SCMS_AO_TABLE_GET' EXPORTING arc_id = lv_archiv_id doc_id = p_objid IMPORTING length = lv_length TABLES data = lt_bin_data EXCEPTIONS error_http = 1 error_archiv = 2 error_kernel = 3 error_config = 4 OTHERS = 5. IF sy-subrc = 0. *---------------------------------------------------------------------- * Binär in xstring konvertieren *---------------------------------------------------------------------- CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING input_length = lv_length IMPORTING buffer = lv_xstring TABLES binary_tab = lt_bin_data EXCEPTIONS failed = 1 OTHERS = 2. *---------------------------------------------------------------------- * Rückgabewert = Datei als XSTRING --> lv_xstring *---------------------------------------------------------------------- MESSAGE 'XSTRING erfolgreich ausgelesen' TYPE 'S'. ELSE. MESSAGE 'Fehler beim Lesen aus dem Archiv-Objekt' TYPE 'E'. ENDIF. ELSE. MESSAGE 'Bitte Customizing prüfen (OAC3)' TYPE 'E'. ENDIF. ELSE. " Eingabefelder fehlen MESSAGE 'Bitte alle Felder füllen' TYPE 'W'. ENDIF.
In diesem Artikel wird erläutert, wie man ein Dynpro programmiert, der ein Dokument als XSTRING in ein PDF konvertiert und anzeigt.
Hinweis: Als Datenelement im ABAP Dictionary kann man den Datentyp RAWSTRING verwenden. XSTRING wird als Datentyp in SAP nicht akzeptiert.
Du möchtest Dein ABAP-Wissen vertiefen? Hier erfährst Du die besten ABAP-Tricks beim Entwickeln.
Hier erhältst Du den perfekten Einstieg in ABAP.
Über den Autor
Mein Name ist Andreas Geiger und ich bin ein erfahrener Senior SAP Berater. Mit mehr als 10 Jahren Berufserfahrung habe ich mehrere SAP-Projekte erfolgreich abgeschlossen und umfangreiche Kenntnisse in verschiedenen Bereichen wie SAP FI, SAP MM und ABAP erworben. Nun möchte ich mein Wissen mit Dir teilen, um Dir einen Mehrwert zu bieten und Dich bei Deiner täglichen Arbeit mit dem SAP-System zu unterstützen.
ERP UP unterstützen
Wenn Du mit ERP UP zufrieden bist, kannst Du mich gerne unterstützen. Dabei gibt es unzählige Möglichkeiten, wie Du mich einfach und schnell unterstützen kannst. Wie Du genau ERP UP unterstützen kannst, erfährst Du hier. Vielen Dank.