SAPscript Formulare in PDF umwandeln
SAPscript Formulare in PDF umwandeln? Klingt eher nach einer Aufgabe von Adobe Forms, oder? PDF und Adobe Forms gehören zusammen wie Pech und Schwefel. Wenn Sie ein Formular in Adobe Forms ausgeben ist klar, dass dieses ein PDF sein wird. Das ist insbesondere nützlich, wenn Sie Dokumente elektronisch, z.B. per Mail an Kunden übertragen möchten. Doch nicht immer ist ein Umstieg auf Adobe Forms problemlos möglich. Was können Sie also tun, wenn sie noch auf der alten SAPscript-Technologie festhängen? Ist ein ausgegebenes SAPscript-Formular auch ein PDF? Wie können Sie sonst z.B. Rechnungen per Mail verschicken, wenn sie noch nicht auf Adobe Forms umgestiegen sind? Dieser Artikel soll Ihnen einen Überblick darüber geben, wie Sie SAPscript Formulare in PDF umwandeln können.
Die zentralen Funktionsbausteine für SAPscript Formulare
Doch zunächst möchte ich eine kleine Einführung in die beiden wichtigsten Funktionsbausteine geben, die zur Generierung eines SAPscript-Formulars und anschließender Generierung eines PDFs nötig sind:
OPEN_FORM:
CALL FUNCTION 'OPEN_FORM'
EXPORTING
FORM = SPACE
LANGUAGE = SY-LANGU
DEVICE = 'PRINTER'
DIALOG = 'X'
OPTIONS = SPACE
APPLICATION = 'TX'
ARCHIVE_INDEX = SPACE
ARCHIVE_PARAMS = SPACE
IMPORTING
LANGUAGE =
RESULT =
NEW_ARCHIVE_PARAMS =
Dieser Funktionsbaustein initiiert die SAPscript Generierung. Über ihn kann die Verarbeitung des Formulars gesteuert werden. Wir werden ihn uns später zu Nutze machen, um das PDF zu generieren.
CLOSE_FORM:
CALL FUNCTION 'CLOSE_FORM'
IMPORTING
RESULT =
TABLES
OTFDATA =
Am Ende des SAPscript Aufbaus muss im Druckprogramm dieser Funktionsbaustein aufgerufen werden. Er schließt die SAPscript-Generierung ab und leitet die Weiterverarbeitung, z.B. Druckausgabe oder Mail Versand ein. Über den TABLES-Parameter “OTFDATA” kann das Formular in einem textuellen Ausgabeformat abgegriffen werden. Wir werden dies ausnutzen um aus diesem Format ein PDF zu erstellen. Wichtig: Dieser Parameter wird nur befüllt, wenn zuvor ‘OPEN_FORM’ mit dem Parameter OPTIONS-TDGETOTF = ‘X’ aufgerufen wurde. Durch das Setzen dieses Flags wird jegliche Weiterverarbeitung des Formulars unterbunden. D.h. es wird weder gedruckt, noch eine Mail versendet, noch wird eine Druckvorschau generiert. Das muss in dem Fall alles manuell nachgezogen werden. CLOSE_FORM konzentriert sich dann also ausschließlich darauf die OTF-Daten zurückzuliefern und das Formular abzuschließen.
OTF? Ist das nicht ein Format von OpenOffice?
Ja, das gibt es, in diesem Fall hat es allerdings nichts mit dem OpenTextFormat zu tun. “OTF” steht für “OutputTextFormat”. Es stellt eine Art “Zwischensprache” dar, die sich zwischen dem SAPscript-Formular und der Ausgabe einordnet. Der OTF-Inhalt wird in einer internen Tabelle abgelegt und enthält Befehle, die die Ausgabe des Formulars steuern. Diese können von weiterverarbeitenden Stellen für die Ausgabe interpretiert werden. Deshalb macht es Sinn, dass der Funktionsbaustein CLOSE_FORM dieses zurückliefern kann.
Wie oben beschrieben enthält dieser Parameter nur Werte vom Baustein CLOSE_FORM, wenn zuvor im Parameter OPTIONS des OPEN-FORMS-Bausteins das Flag TDGETOTF gesetzt wurde.
Der Funktionsbaustein CONVERT_OTF
Doch wie können wir nun aus OTF eine PDF erzeugen? Das geht ganz einfach mithilfe des Funktionsbausteins CONVERT_OTF (Quelle: SE80.co.uk):
CALL FUNCTION 'CONVERT_OTF'
EXPORTING
format = 'ASCII'
max_linewidth = 132
archive_index = SPACE
copynumber = 0
IMPORTING
bin_filesize =
bin_file =
TABLES
otf =
lines =
CONVERT_OTF ist ein nützlicher Funktionsbaustein, mit dem eine OTF-Tabelle in verschiedene Ausgabeformate umgewandelt werden kann. Das Ausgabeformat wird über den Parameter “FORMAT” gesteuert. Der Baustein unterstützt u.a. ‘ASCII’ für die Ausgabe als reinen Text und ‘PDF’ für die Ausgabe als PDF. Folglich müssen wir nun einfach unsere OTF-Tabelle, die wir von CLOSE_FORM erhalten haben, an diesen Baustein übergeben, ‘PDF’ als Format eintragen und über den Parameter bin_file das Ergebnis abgreifen.
Schließlich enthält bin_file das fertige PDF in binärer Darstellung (Typ XSTRING). Sie können diesen Parameter nun für die Weiterverarbeitung nutzen, sei es als Anhang einer Mail oder um ein PDF abzuspeichern
SAPscript Formulare in PDF umwandeln: Codebeispiel
Zu guter Letzt möchte ich nochmal das oben Erklärte in Form eines kleinen Codebeispiels zusammenfassen, das Sie nutzen können, um Ihre SAPscript Formulare in PDF umzuwandeln. Sollten Sie weitere Fragen bei der Umsetzung haben, können Sie gerne Ihren Kommentar unter diesem Beitrag hinterlassen.
Schritt 1: Flag tdgetotf setzen und an OPEN_FORM übergeben
DATA ls_options TYPE itcpo.
ls_options-tdgetotf = 'X'.
CALL FUNCTION 'OPEN_FORM'
EXPORTING
form = 'Z_RECHNUNGSFORMULAR'
language = sy-langu
options = ls_options.
Schritt 2: CLOSE_FORM und OTF-Daten abgreifen
DATA lt_otfdata TYPE TABLE OF itcoo WITH HEADER LINE.
CALL FUNCTION 'CLOSE_FORM'
TABLES
otfdata = lt_otfdata[].
Schritt 3: OTF-Daten in PDF-Daten konvertieren
DATA: lv_bin_pdf_data TYPE xstring,
lt_pdf TYPE TABLE OF tline. "wird von CONVERT_OTF benötigt
CALL FUNCTION 'CONVERT_OTF'
EXPORTING
format = 'PDF'
IMPORTING
bin_file = lv_bin_pdf_data
TABLES
otf = lt_otfdata[]
lines = lt_pdf.
Update 28.03.2019:
Wenn Sie die erzeugte PDF als Mail versenden möchten bietet sich der Einsatz der SAP-BCS-Klassen an. Sie können sich dafür an folgendem Codebeispiel orientieren:
DATA: lo_bcs TYPE REF TO cl_bcs,
lo_document TYPE REF TO cl_document_bcs .
" Initialisierung
lo_bcs = cl_bcs=>create_persistent( ).
lo_document = cl_document_bcs=>create_document(
i_type = 'RAW'
i_subject = 'Testmail' ).
lo_bcs->set_document( lo_document ).
DATA: lt_content TYPE solix_tab,
lv_subject TYPE sood-objdes.
" Anhaengen des PDF-Strings aus Schritt 3
IF ( lo_document IS NOT INITIAL ).
lt_content = cl_document_bcs=>xstring_to_solix(
ip_xstring = lv_bin_pdf_data).
lo_document->add_attachment(
i_attachment_type = 'PDF'
i_attachment_subject = 'Testmail mit PDF-Anhang'
i_att_content_hex = lt_content ).
ENDIF.
" Hinzufuegen des Empfaengers
lo_bcs->add_recipient(
i_recipient = cl_cam_address_bcs=>create_internet_address(
'xxx@xxx.de' )
).
" Initialisieren und Hinzufuegen des Absenders
DATA: lo_sender TYPE REF TO cl_sapuser_bcs.
TRY.
lo_sender = cl_sapuser_bcs=>create( sy-uname ).
CATCH cx_address_bcs.
ENDTRY.
TRY.
lo_bcs->set_sender( i_sender = lo_sender ).
CATCH cx_send_req_bcs.
ENDTRY.
" Senden der E-Mail
TRY.
DATA lv_update_process TYPE sy-subrc.
lo_bcs->send(
EXPORTING
i_with_error_screen = 'X' ).
CALL FUNCTION 'TH_IN_UPDATE_TASK'
IMPORTING
in_update_task = lv_update_process.
IF lv_update_process EQ 0.
COMMIT WORK.
ENDIF.
CATCH cx_bcs .
ENDTRY.
5 Kommentare zu "SAPscript Formulare in PDF umwandeln"
Hallo,
vielen Dank für Ihre anschauliche Dokumentation.
Mit welchem Baustein versenden Sie das PDF im Binärformat? Könnten Sie diesen Schritt noch kurz erläutern? Danke!
Hallo Chris,
ich habe den Beitrag um ein entsprechendes Codebeispiel erweitert. Hoffentlich kann ich Ihnen damit weiterhelfen.
Vielen Dank für den Impuls. Sollten Sie Fragen dazu haben, freue ich mich auf Ihren Kommentar.
Viele Grüße
Patrick Steffens
Hallo Chris,
ich finde Ihr Coding sehr interessant, frage mich nur, wie die die Bin-Datei dann auf dem Server speichern kann.
lg
Gaby Iwan
Hallo Frau Iwan,
ich nehme an, dass Sie mich ansprechen wollten? 😉
Dazu können Sie sich an der Anleitung unter folgendem Link orientieren: http://www.saphub.com/files/download-file-sap-application-server/
Soweit ich das sehe, genügt der folgende Code-Ausschnitt (angelehnt an obigen Code):
DATA: gv_file TYPE rlgrap-filename.
gv_file = ‘output.pdf’.
OPEN DATASET gv_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
TRANSFER lv_bin_pdf_data TO gv_file.
CLOSE DATASET gv_file.
Probieren Sie es gerne schonmal aus und teilen Sie Ihre Erfahrungen mit mir. Ich werde es mir selbst im Laufe der Woche nochmal anschauen und dann ggf. das Tutorial erweitern.
Viele Grüße
Patrick Steffens
Hallo Herr Steffens,
Vielen Dank für die gute Doku.
Wenn ich die OTF-Daten im END_FORM abgreifen möchte,
dann bekomme ich die Fehlermeldung
‘OTF Ende-Kommando // fehlt in OTF-Daten’
Wie komme ich da weiter?
Viele Grüße
Friedhelm