Generische Objektdienste: Anhänge über RFC anlegen
Generische Objektdienste (GOS) können in vielen SAP Anwendungen genutzt werden. Sie bieten diverse Optionen um Business Objekte zu bearbeiten. Unter anderem können damit Anhänge zu Business Objekten hinzugefügt werden. Dieser Beitrag zeigt, wie auch über RFC Bausteine Anhänge zu Objekten hinzugefügt werden können.
Sie erhalten die Komplettlösung – Ihr Projekt machen wir zu unserem Projekt. Mit professionellem Projektmanagement sicheren wir den Projekterfolg.
Gerne spreche ich mit Ihnen über Ihre Ausgangslage und zeige Lösungsmöglichkeiten auf. Auf Wunsch unterbreite ich Ihnen im Anschluss ein unverbindliches Angebot.
Kontaktieren Sie mich: Telefon 0211.9462 8572-16 oder per E-Mail info@erlebe-software.de
Ingo Biermann, Fachbereichsleiter
Generische Objektdienste in der SAP GUI
In allen Anwendungen, in denen Generische Objektdienste zur Verfügung stehen, erfolgt die Anlage von Anhängen über die Oberfläche. Es gibt aber auch Fälle, in denen die Dokumente automatisiert angehängt werden sollen oder der Benutzer kein Zugriff auf das SAP System hat.
Anlage in den Generischen Objektdiensten über einen Funktionsbaustein mit RFC Unterstützung
Voraussetzungen zum Anlegen einer Datei
Folgende Daten werden benötigt:
- Object-ID: Das Objekt im SAP, dem der Anhang zugeordnet werden soll. Dies könnte z.B. ein Angebot im Bereich des Vertriebs sein.
- SAP-Object: Objekttyp von SAP. Für ein Angebot wäre dies Beispielsweise “BUS2031”.
- Dateiname: Der Dateiname mit Endung, damit die Datei korrekt angelegt und später auch wieder geöffnet werden kann
- Dateilänge: Die Länge der Datei im Binärformat.
- Datei: Die Datei im Binärformat.
Der Funktionsbaustein zum Einfügen
Für das Einfügen der Daten wird der Funktionsbaustein SO_OBJECT_INSERT genutzt. Dieser wird wie folgt implementiert:
CALL FUNCTION ‘SO_OBJECT_INSERT’ EXPORTING folder_id = ls_fol_id object_type = ‘EXT’ object_hd_change = ls_obj_data IMPORTING object_id = ls_obj_id TABLES objhead = lt_objhead objcont = lt_content EXCEPTIONS active_user_not_exist = 35 folder_not_exist = 6 object_type_not_exist = 17 owner_not_exist = 22 parameter_error = 23 OTHERS = 1000. |
Die Parameter des Funktionsbausteins
Die Folder ID kann über den Funktionsbaustein SO_FOLDER_ROOT_ID_GET ausgelesen werden. Bei diesem Baustein wird zwischen verschiedenen Regionen unterschieden. Diese Regionen sind im Wertebereich der Domäne SO_FOL_RG zu finden. Der Ordner beschreibt, wo die Datei abgelegt wird.
Über Object Type wird angegeben, um was für eine Art es sich bei diesem Anhang handelt. Die Werte dazu finden sich in der Tabelle TSOTD.
Der Parameter Object HD Change enthält Informationen über die Datei wie beispielsweise der Dateiname, die Endung und auch die Dateilänge.
Bei den Tabellen wird der Inhalt der Datei als Stream dem Parameter “objcont” übergeben. Hierbei kann es nötigt sein, dass der Filestream der Datei noch angepasst werden muss. Dazu können die folgenden Funktionsbausteine verwendet werden:
- SCMS_BINARY_TO_XSTRING (Binär zu XString um die Zeilenlänge im nächsten Schritt kürzen zu können)
- SCMS_XSTRING_TO_BINARY (Kürzen der Zeilenlänge und Konvertierung zu Binärstream)
- SO_CONVERT_CONTENTS_BIN (Weitere Verarbeitung des Binärstreams)
Die Tabelle für den Parameter “objhead” beinhaltet Kopfdaten der Anlage und kann wie folgt befüllt werden:
CONCATENATE ‘&SO_FILENAME=’ iv_filename INTO ls_objhead. APPEND ls_objhead TO lt_objhead. ls_objhead = ‘&SO_FORMAT=BIN’ . APPEND ls_objhead TO lt_objhead. |
Verknüpfung zwischen Datei und Objekt
Durch den Baustein wird die Objekt-ID des neu angelegten Objekts zurückgegeben. Über diese muss noch eine Verbindung zwischen dem angelegten Objekt und dem Beleg erstellt werden:
ls_folmem_k–foltp = ls_fol_id–objtp. ls_folmem_k–folyr = ls_fol_id–objyr. ls_folmem_k–folno = ls_fol_id–objno. ls_folmem_k–doctp = ls_obj_id–objtp. ls_folmem_k–docyr = ls_obj_id–objyr. ls_folmem_k–docno = ls_obj_id–objno. lv_ep_note = ls_folmem_k. ls_note–objtype = ‘MESSAGE’. ls_note–objkey = lv_ep_note. CALL FUNCTION ‘BINARY_RELATION_CREATE_COMMIT’ EXPORTING obj_rolea = ls_object obj_roleb = ls_note relationtype = ‘ATTA’ EXCEPTIONS OTHERS = 1. |
Für “ls_object” werden die Objekt-ID und das SAP-Objekt benötigt:
ls_object–objkey = object_id. ls_object–objtype = sap_object. |
Nun ist der Anhang angelegt und die Verbindung besteht.
Neben der Anlage von einfachen Anlagen können auch Business Dokumente sowie Dokumente im ArchivLink angelegt werden.
Nutzen Sie Generische Objektdienste? Kennen Sie noch besondere Anwendungsfälle bei denen die Anlage von Anhängen über RFC nötig ist? Ich freue mich auf Ihre Kommentare.
Für weitere Fragen zum Thema stehe ich ihnen gerne zur Verfügung.
2 Kommentare zu "Generische Objektdienste: Anhänge über RFC anlegen"
Hallo Herr Biermann,
wir wollen GOS-Objekte in ein anderes SAP-System übertragen (Zusammenführung von Stammdaten).
Innerhalb des gleichen Systems klappt es, die GOS können an andere Stammdaten angehängt werden.
Aber per rfc über die Systemgrenze klappt es komischerweise nur manchmal. Ab und zu Kurzdump mit “Feld hat falsche Länge bei ‘Remote Function Call'”.
Hilft es, wenn man Binärdaten in XSTRING wandelt und beim Empfänger wieder zurück? Oder hat das damit nichts zu tun?
Freundliche Grüße
Hans Rösch
Hallo, habe es gefunden! Freundliche Grüße Hans Rösch