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.

Unser E-Book zum Thema SAPscript

E-Book: SAPscript

Wann lohnt sich der Umstieg und wie gelingt dieser? Unser SAPscript E-Book beantwortet alle Ihre Fragen!

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.

SAPscript Formulare in PDF

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

Umstieg auf S/4HANA: Was hat das mit Ihren Formularen zu tun?

Der Umstieg auf S/4HANA birgt im Bereich der Formulare viele Chancen, wie auch Risiken. Mit S/4HANA kommen zwei Neuheiten in den Formularbereich.

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.

Patrick Steffens

Patrick Steffens

Mein Name ist Patrick Steffens und ich bin technikbegeisterter SAP-Formularexperte bei der Mindsquare. Ich bin spezialisiert auf Formularthemen wie ZUGFeRD und der Entwicklung in SAPScript, Smartforms und Adobe Forms sowie der Migration alter auf neue Technologien. Durch die ABAP-Zertifizierung TAW12 und der ERP Zertifizierung TERP10 bringe ich darüber hinaus ein breites Wissen über ABAP, ABAP OO und verschiedenen SAP Komponenten wie SD und MM mit, das ich Ihnen gerne zur Verfügung stelle.

Sie haben Fragen? Kontaktieren Sie mich!



Das könnte Sie auch interessieren

Die älteste Formulartechnologie von SAP nutzt globale Variablen bzw. DDIC-Strukturen zur Datenübertragung vom Rahmenprogramm zum Formular. Diese erste Generation von Formulartechnologien zeichnet sich durch eine sehr gute Performanz und Zuverlässigkeit […]

weiterlesen

Belege in SAP können über das externe Senden als PDF per E-Mail an Partner versendet werden. Dabei soll die E-Mail in den meisten Fällen einen Betreff und auch einen Text […]

weiterlesen

SAPscript wurde 1980 entwickelt und ist unter den drei SAP-Formulartechnologien die Älteste. Zu den Anfängen wurde entsprechend jedes Formular, welches als Produkt vieler Geschäftsprozesse entsteht, mit SAPscript erzeugt. Mit dem […]

weiterlesen

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!

Antworten
Patrick Steffens - 28. März 2019 | 07:58

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

Antworten

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

Antworten
Patrick Steffens - 29. Juli 2019 | 21:54

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

Antworten

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

Antworten

Schreiben Sie einen Kommentar

Bitte füllen Sie alle mit * gekennzeichneten Felder aus. Ihre E-Mail Adresse wird nicht veröffentlicht.





Kontaktieren Sie uns!
Julia Buecker
Julia Bücker Kundenservice