Mit dox42 kann man einfach Bilder oder ganze Dokumente wie PDF oder Word eingebunden werden. Dies ist natürlich auch aus SAP möglich, wenngleich dafür ein paar extra Schritte zu setzen sind.
dox42 tut sich leicht, wenn das Objekt via Link erreichbar ist. Dann muss lediglich das Feld mit dem Link auf den entsprechenden Typ gesetzt werden. Den Link kann man über die Datamap aus SAP an dox42 übertragen.
Aber wie bekommt man ein Image oder ein Dokument im SAP Backend in einen für dox42 erreichbaren Cache?
Link am Server Cache
Wenn das Dokument nicht als Link erreichbar ist, kann man sich mit der Klasse CL_HTTP_RESPONSE und CL_HTTP_SERVER helfen. Damit kann man ein Dokument am ICM Server Clipboard ablegen. Ich würde das aber nicht als generelle Lösung empfehlen, nur als möglicher Workaround. Es sollte darauf geachtet werden, dass diese Dokumente auch nur wirklich für ganz kurze Zeit am im ICM Server Cache liegen. Die Expire-Zeit kann mit Methode server_cache_expire_rel angegeben werden.
Dokumentation des ICM Server Clipboard und er beiden Klassen: help.sap.com
Dokumente als base64 an dox42 übertragen
Eine weitere Möglichkeit ist, die Dokumente in SAP in base64 zu kodieren und den kompletten Inhalt über die Datamap zu übertragen.
In ABAP kann man die binären Daten z.B. mit dem Funktionsbaustein SCMS_BASE64_ENCODE_STR konvertiert werden. Auch die Klasse CL_HTTP_UTILITY kann dafür verwendet werden. In neueren Systemen steht auch die Klasse CL_WEB_HTTP_UTILITY zur Verfügung.
Aus Clean Core Sicht sollte CL_WEB_HTTP_UTILITY verwendet werden. Die Klasse ist Released und kann somit in S/4 Public oder S/4 Private verwendet werden. CL_HTTP_UTILITY wurde als Classic API definiert, ist daher ebenfalls Clean Core.
Beispiel: Demodaten aus GOS lesen
Damit wir ein nachvollziehbares Beispiel haben, verwende ich ein GOS Dokument eines Businesspartners. Das erste GOS Dokument des Partners mit der Nr. 2152 wird wie folgt gelesen:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
DATA lv_doc_id TYPE sofolenti1-doc_id. DATA wa_doc_data TYPE sofolenti1. DATA int_cont_bin TYPE TABLE OF solisti1. DATA int_cont_solix TYPE TABLE OF solix. DATA lv_doc_size TYPE i. DATA lv_xstring TYPE xstring. DATA lv_base64 TYPE string. " get gos attachments for partner 0000002152 cl_binary_relation=>read_links_of_binrels( EXPORTING is_object = VALUE #( instid = '0000002152' typeid = 'BUS1006' catid = 'BO' ) it_relation_options = VALUE #( ( low = 'ATTA' sign = 'I' option = 'EQ' ) ) IMPORTING et_links = DATA(lt_links) ). " for test only - get the first attachment lv_doc_id = lt_links[ 1 ]-instid_b. CALL FUNCTION 'SO_DOCUMENT_READ_API1' EXPORTING document_id = lv_doc_id IMPORTING document_data = wa_doc_data TABLES contents_hex = int_cont_solix " object_content = int_cont_bin EXCEPTIONS document_id_not_exist = 1 operation_no_authorization = 2 x_error = 3 OTHERS = 4. " convert the solix content to xstring CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING input_length = CONV i( wa_doc_data-doc_size ) IMPORTING buffer = lv_xstring TABLES binary_tab = int_cont_solix EXCEPTIONS failed = 1 OTHERS = 2. |
Jetzt haben wir in int_cont_solix das Dokument. Nachfolgend die 3 Möglichkeiten um den Inhalt nach base64 zu konvertieren.
base64 mit CL_WEB_HTTP_UTILITY
Je nachdem ob das Dokument als xstring oder string vorliegt ist die Methode encode_x_base64 oder encode_base64 zu verwenden. Nachfolgend das Beispiel wenn das Dokument als xstring – wie im obigen GOS Demo – vorliegt:
|
1 2 3 4 5 6 7 8 |
... cl_web_http_utility=>encode_x_base64( EXPORTING unencoded = lv_xstring RECEIVING encoded = lv_base64 ). ... |
Falls es jemand interessiert, diese Klasse verwendet selbst die nachfolgende ältere Klasse CL_HTTP_UTILITY.
base64 mit CL_HTTP_UTILITY
Wenn die erstgenannte Klasse noch nicht da ist, kann auch die Klasse CL_HTTP_UTILITY verwendet werden. Coding ist quasi ident wir zuvor:
|
1 2 3 4 5 6 7 8 |
... cl_http_utility=>encode_x_base64( EXPORTING unencoded = lv_xstring " Decoded XString RECEIVING encoded = lv_base64 ). ... |
base64 mit SCMS_BASE64_ENCODE_STR
Den Funktionsbaustein gibt es schon viele Jahre und wird vielfach eingesetzt. Im Prinzip muss anstatt der Klasse lediglich der Funktionsbaustein verwendet werden:
|
1 2 3 4 5 6 7 |
... CALL FUNCTION 'SCMS_BASE64_ENCODE_STR' EXPORTING input = lv_xstring IMPORTING output = lv_base64. ... |
Decode in dox42
Zumindest aktuell müssen base64 Dokumente dann in der dox42 Datamap wieder in ein Array konvertiert werden. Dies kann z.B. mit einem Dynamischen Feld erfolgen:

Im obigen Beispiel gibt es in der Datamap die Datenquelle SAP1. In der Datenquelle wird eine Image im Feld IMAGE_BASE_64 übermittelt. Durch dieses VB Coding steht nun das Feld ImageLocalFromBase64 als Feld mit den Image Daten im Template zur Verfügung.
Ausschnitt aus dem Template:

Ausschnitt aus dem generierten dox42 Dokument:

Zusammenfassung
- Übertragung von Bildern oder Dokumente via Link oder base64
- 3 ABAP Möglichkeiten zum Konvertieren in base64
- Konvertieren des base64 Inhalts mit FromBase64String
