Dass man per Submit einen Report ausführen und die Listenausgabe mit dem Funktionsbaustein CONVERT_ABAPSPOOLJOB_2_PDF in das PDF-Format konvertieren kann, ist ja allgemein bekannt. Es gibt hierbei allerdings einige Fallstricke, die man beachten sollte. Daher hier einmal ein Versuch einer möglichst vollständigen Anleitung:
Grundidee
Über Submit soll aus einem beliebigen Programm ein Report aufgerufen werden, dessen Ergebnis eine Spool-Liste ist. Diese Spool-Liste soll wiederum als PDF weiterverarbeitet, z.B. per E-Mail versandt werden.
Ja, es gibt SIFbA und Smartforms etc., aber in manchen Fällen kann das dennoch sinnvoll sein. Ich habe dies zum Beispiel eingesetzt, um an Mitarbeiter ohne eigenen SAP-Zugang Kontoauszüge, welche mit SAP-Standardtransaktionen erzeugt werden, zu versenden - in dem Fall deutlich einfacher als ein Formular aufzubauen und die Logik nachzuprogrammieren.
Druckparameter
Bevor der Report aufgerufen wird, müssen zunächst die richtigen Druckparameter gesetzt werden. Der Funktionsbaustein GET_PRINT_PARAMETERS kann hier verwendet werden um entweder tatsächlich das Dialogfenster zur Abfrage der Druckeinstellungen aufzurufen oder die Vorlagewerte - je Benutzer - zu ziehen.
Code: Alles auswählen.
CALL FUNCTION 'GET_PRINT_PARAMETERS'
EXPORTING
archive_mode = '1'
IMPORTING
out_parameters = gs_print_parameters
valid = gv_prparam_valid
EXCEPTIONS
OTHERS = 4.
IF sy-subrc NE 0.
" ...
ENDIF.
Der Parameter ARCHIVE_MODE bestimmt, ob gedruckt oder archiviert wird - oder beides. Wir möchten hier nur drucken, daher eine 1. Die Paramter sind hier tatsächlich sehr gut dokumentiert.
Im obigen Aufruf würde das Dialofenster Druckeinstellungen aufgerufen. Möchte man das nicht, ist der Parameter NO_DIALOG auf "X" oder ABAP_TRUE zu setzen. Es gibt dann nur die Default-Druckparameter.
Ferner kann man auch über den Parameter USER die Standard-Druckparameter eines bestimmten Benutzers abrufen, falls nötig.
Insgesamt lohnt es sich, sich bei Problemen mit dem Ergebnis ein wenig mit dem Funktionsbaustein und seinen Parametern oder ganz allgemein den Druckparametern auseinanderzusetzen. Vieles kann man hier im Vorfeld steuern.
Parameter kann man danach natürlich noch fest vorgeben. PRNEW erzwingt das Anlegen eines neuen Spoolauftrages (macht SUBMIT ... TO SAP-SPOOL aber auch automatisch); PRIMM legt fest, dass wir nicht sofort drucken, sondern die Ausgabe im Spool halten wollen. PRCOP gibt die Anzahl der Kopien an, LINSZ legt die Spaltenbreite fest.
Code: Alles auswählen.
gs_print_parameters-prnew = 'X'.
gs_print_parameters-primm = ''.
gs_print_parameters-linsz = '200'.
gs_print_parameters-prcop = '1'.
Reportaufruf
Nun können wir den Report aufrufen. Wichtig ist, dass wir mit TO SAP-SPOOL die Ausgabe in einen neuen Spool-Auftrag erwirken. Hierbei werden auch die Druckparameter übergeben, die oben gesetzt wurden. Das Pop-Up zur Eingabe der Druckeinstellungen möchten wir dementsprechend nicht (noch einmal) rufen (WITHOUT SPOOL DYNPRO) - und wir möchten nach der Ausführung im aufrufenden Report weitermachen (AND RETURN).
Code: Alles auswählen.
SUBMIT 'Z_IRGENDEIN_REPORT'
TO SAP-SPOOL
SPOOL PARAMETERS gs_print_parameters
WITHOUT SPOOL DYNPRO
AND RETURN.
Hier könnte übrigens mit LINE-SIZE und LINE-COUNT ebenfalls die Spaltenbreite und Spaltenanzahl pro Seite angegeben werden.
Spoolauftragsnummer abrufen
Um später die Spool-Liste zu konvertieren, benötigen wir nun die Nummer des Spool-Auftrags. Hierzu gibt es im Internet verschiedene Anleitungen, die teilweise darauf setzen, aus der Tabelle der Spoolaufträge den Auftrag mit der höchsten Nummer zum aktuellen Benutzer auszugeben oder über die Druckparameter einen Beschreibungstext mitzugeben, anhand dessen dann - ebenfalls über die Spool-Tabelle - der Auftrag identifiziert wird (auf SY-SPONO zuzugreifen klappt leider nicht).
Ich bin in der SAP-Community noch auf die Lösung gestoßen, einfach den Parameter "SPI" auszulesen. Hier steht immer die Nummer des zuletzt erzeugten Spoolauftrags.
Diese Lösung hat sich nach meiner Erfahrung bewährt und ist mit einer Zeile Code schön kurz, sodass ich inzwischen diesen Weg bevorzuge.
Konvertierung
Die Konvertierung in das PDF-Format erfolgt dann, wie bereits beschrieben, über den Funktionsbaustein CONVERT_ABAPSPOOLJOB_2_PDF. Dieser hat allerdings auch seine Besonderheiten.
Code: Alles auswählen.
CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
EXPORTING
src_spoolid = CONV rspoid( lv_spool_no )
no_background = abap_true
no_dialog = abap_true
pdf_destination = abap_true
get_size_from_format = abap_true
IMPORTING
pdf_bytecount = lv_pdf_size
bin_file = lv_pdf_xstring
EXCEPTIONS
err_no_abap_spooljob = 1
err_no_spooljob = 2
err_no_permission = 3
err_conv_not_possible = 4
OTHERS = 5.
PDF_DESTINATION sollte hierbei auf "X" gesetzt sein, da dann die Ausgabe als XString erfolgt. Ansonsten wird ein PDF-Dokument als Spool-Auftrag angelegt.
Sollte der Spool-Auftrag mehr als 99 Seiten haben, wird die Konvertierung im Hintergrundjob ausgeführt. Der Funktionsbaustein läuft dann durch und wird mit einem Returncode 0 beendet, es wird allerdings kein PDF-Dokument zurückgegeben. Dieses wird auch wieder in den Spool geschrieben.
Wenn man warten kann und das entsprechend so programmieren möchte, kann man die Fertigstellung abwarten (WHILE-Schleife etc.) und dann über RSPO_RETURN_ABAP_SPOOLJOB_RAW das Ergebnis abrufen (siehe
hier). Kann oder möchte man das nicht, kann dieses Verhalten über den Parameter NO_BACKGROUND auch einfach abgeschaltet werden. Es dauert dann nur manchmal ein wenig länger, bis die Konvertierung durch ist...
Man sollte dann auch gleichzeitig den Parameter NO_DIALOG setzen, welcher nämlich steuert, ob in o.g. Fall ein Pop-Up als Hinweis auf die Hintergrundverarbeitung erscheint.
Hiernach erhält man ein (hoffentlich schönes) PDF im XString-Format, das man als E-Mail-Anhang versenden, herunterladen oder sonst wie verarbeiten kann.