ABAP Smart Forms: Formularentwicklung und Druckausgabe

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Smart Forms sind das Standard-Werkzeug für die Formularentwicklung in SAP. Sie ermöglichen die Erstellung professioneller Druckausgaben wie Rechnungen, Bestellungen und Lieferscheine.

Smart Forms Architektur

KomponenteTransaktionBeschreibung
FormSMARTFORMSFormularlayout
StyleSMARTSTYLESFormatvorlagen
Text ModuleSO10Wiederverwendbare Texte
GrafikenSE78Logos und Bilder

Formularstruktur

ElementBeschreibung
Global DefinitionsTypen, Daten, Initialisierung
Form InterfaceImport/Export Parameter
PagesSeiten mit Header/Footer
WindowsAusgabebereiche
NodesText, Tabelle, Grafik, etc.

Grundlegende Beispiele

Smart Form aufrufen

DATA: lv_fm_name TYPE rs38l_fnam,
ls_output TYPE ssfcompop,
ls_control TYPE ssfctrlop,
ls_job_info TYPE ssfcrescl.
" Funktionsbaustein-Name ermitteln
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZSF_INVOICE'
IMPORTING
fm_name = lv_fm_name
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE 'Smart Form nicht gefunden' TYPE 'E'.
RETURN.
ENDIF.
" Ausgabeoptionen
ls_output-tdnewid = abap_true. " Neuer Spool-Auftrag
ls_output-tddest = 'LP01'. " Drucker
" Steuerungsoptionen
ls_control-no_dialog = abap_true. " Kein Druckdialog
ls_control-preview = abap_true. " Druckvorschau
" Smart Form aufrufen
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_control
output_options = ls_output
is_header = ls_invoice_header
IMPORTING
job_output_info = ls_job_info
TABLES
it_items = lt_invoice_items
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
IF sy-subrc = 0.
WRITE: / 'Formular erfolgreich erstellt'.
WRITE: / 'Spool-ID:', ls_job_info-spoolids[ 1 ].
ENDIF.

PDF generieren und speichern

DATA: lt_pdf_lines TYPE TABLE OF tline,
lv_pdf_size TYPE i,
lv_pdf_xstring TYPE xstring.
" Ausgabe als PDF
ls_output-tdgetotf = abap_true. " OTF-Daten zurückgeben
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_control
output_options = ls_output
is_header = ls_invoice_header
IMPORTING
job_output_info = ls_job_info
TABLES
it_items = lt_invoice_items.
" OTF in PDF konvertieren
CALL FUNCTION 'CONVERT_OTF'
EXPORTING
format = 'PDF'
IMPORTING
bin_filesize = lv_pdf_size
TABLES
otf = ls_job_info-otfdata
lines = lt_pdf_lines
EXCEPTIONS
err_max_linewidth = 1
err_format = 2
err_conv_not_possible = 3
OTHERS = 4.
" PDF-Zeilen zu XSTRING konvertieren
CALL FUNCTION 'CONVERT_OTF_2_PDF'
EXPORTING
use_otf_mc_cmd = abap_true
IMPORTING
bin_file = lv_pdf_xstring
TABLES
otf = ls_job_info-otfdata
EXCEPTIONS
OTHERS = 1.
" PDF lokal speichern
DATA: lv_filename TYPE string VALUE 'C:\temp\invoice.pdf'.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
bin_filesize = lv_pdf_size
filename = lv_filename
filetype = 'BIN'
CHANGING
data_tab = lt_pdf_lines.

PDF per E-Mail versenden

DATA: lo_send_request TYPE REF TO cl_bcs,
lo_document TYPE REF TO cl_document_bcs,
lo_recipient TYPE REF TO if_recipient_bcs,
lt_solix TYPE solix_tab,
lv_size TYPE sood-objlen.
" XSTRING in SOLIX konvertieren
lt_solix = cl_bcs_convert=>xstring_to_solix( lv_pdf_xstring ).
lv_size = xstrlen( lv_pdf_xstring ).
TRY.
" Send Request erstellen
lo_send_request = cl_bcs=>create_persistent( ).
" Dokument mit Anhang erstellen
lo_document = cl_document_bcs=>create_document(
i_type = 'RAW'
i_text = VALUE #( ( line = 'Anbei die Rechnung als PDF.' ) )
i_subject = 'Rechnung' ).
" PDF anhängen
lo_document->add_attachment(
i_attachment_type = 'PDF'
i_attachment_subject = 'Rechnung.pdf'
i_attachment_size = lv_size
i_att_content_hex = lt_solix ).
lo_send_request->set_document( lo_document ).
" Empfänger
lo_recipient = cl_cam_address_bcs=>create_internet_address(
i_address_string = 'kunde@example.com' ).
lo_send_request->add_recipient( lo_recipient ).
" Senden
lo_send_request->send( ).
COMMIT WORK.
CATCH cx_bcs INTO DATA(lx_bcs).
MESSAGE lx_bcs->get_text( ) TYPE 'E'.
ENDTRY.

Druckvorschau anzeigen

" Druckvorschau aktivieren
ls_control-preview = abap_true.
ls_control-no_dialog = abap_true.
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_control
output_options = ls_output
is_header = ls_invoice_header
TABLES
it_items = lt_invoice_items
EXCEPTIONS
user_canceled = 4
OTHERS = 5.
IF sy-subrc = 4.
MESSAGE 'Vorschau abgebrochen' TYPE 'S'.
ENDIF.

Mehrere Exemplare drucken

" 3 Kopien drucken
ls_output-tdcopies = 3.
ls_output-tdimmed = abap_true. " Sofortdruck
" Original und Kopie mit verschiedenen Texten
DO 2 TIMES.
IF sy-index = 1.
ls_header-doc_type = 'ORIGINAL'.
ELSE.
ls_header-doc_type = 'KOPIE'.
ENDIF.
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_control
output_options = ls_output
is_header = ls_header
TABLES
it_items = lt_items.
ENDDO.

Dynamische Tabellenausgabe

" Im Smart Form - Global Definitions
" Tabelle IT_ITEMS definieren
" Im ABAP - Daten übergeben
DATA: lt_items TYPE TABLE OF zsf_item.
lt_items = VALUE #(
( posnr = '10' matnr = 'MAT001' menge = 5 preis = '100.00' )
( posnr = '20' matnr = 'MAT002' menge = 3 preis = '250.00' )
( posnr = '30' matnr = 'MAT003' menge = 1 preis = '500.00' )
).
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_control
output_options = ls_output
TABLES
it_items = lt_items.

Grafik/Logo einbinden

" Grafik in SE78 hochladen (BMAP oder OTF)
" Im Smart Form: Graphic Node erstellen
" Alternativ: Grafik dynamisch übergeben
DATA: lv_bmp TYPE xstring.
" Grafik aus Datenbank lesen
SELECT SINGLE content FROM stxbitmaps
INTO lv_bmp
WHERE tdobject = 'GRAPHICS'
AND tdname = 'LOGO'
AND tdid = 'BMAP'.
" An Smart Form übergeben
CALL FUNCTION lv_fm_name
EXPORTING
iv_logo = lv_bmp
...

Barcode generieren

" Im Smart Form:
" 1. Barcode-Feld im Window erstellen
" 2. Barcode-Typ auswählen (z.B. CODE128, EAN13)
" Im ABAP - Barcode-Wert übergeben
DATA: lv_barcode TYPE char40.
lv_barcode = |{ ls_order-order_id ALPHA = IN }|.
CALL FUNCTION lv_fm_name
EXPORTING
iv_barcode = lv_barcode
...

Spool-Verwaltung

DATA: lv_spoolid TYPE rspoid.
" Spool-ID nach Formulardruck
lv_spoolid = ls_job_info-spoolids[ 1 ].
" Spool-Auftrag löschen
CALL FUNCTION 'RSPO_DELETE_SPOOL_REQUEST'
EXPORTING
rqident = lv_spoolid
EXCEPTIONS
no_such_job = 1
OTHERS = 2.
" Spool in PDF konvertieren
DATA: lt_pdf TYPE TABLE OF tline.
CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
EXPORTING
src_spoolid = lv_spoolid
no_dialog = abap_true
TABLES
pdf = lt_pdf
EXCEPTIONS
err_no_abap_spooljob = 1
OTHERS = 2.

Formularvarianten

" Verschiedene Layouts basierend auf Bedingung
DATA: lv_form_name TYPE tdsfname.
CASE ls_order-order_type.
WHEN 'STANDARD'.
lv_form_name = 'ZSF_ORDER_STANDARD'.
WHEN 'EXPRESS'.
lv_form_name = 'ZSF_ORDER_EXPRESS'.
WHEN OTHERS.
lv_form_name = 'ZSF_ORDER_DEFAULT'.
ENDCASE.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = lv_form_name
IMPORTING
fm_name = lv_fm_name.

Sprachabhängige Formulare

" Smart Form in verschiedenen Sprachen pflegen
" Transaktion SMARTFORMS -> Übersetzung
" Sprache beim Aufruf setzen
ls_control-langu = 'E'. " Englisch
" Oder aus Benutzerstamm
ls_control-langu = sy-langu.
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_control
...

Hintergrund-Druck (ohne Dialog)

" Für Batch-Jobs und Massendruck
ls_control-no_dialog = abap_true.
ls_control-device = 'PRINTER'.
ls_output-tddest = 'LP01'. " Drucker
ls_output-tdimmed = abap_true. " Sofort drucken
ls_output-tddelete = abap_true. " Spool nach Druck löschen
ls_output-tdnewid = abap_true. " Neuer Spool-Auftrag
" Massendruck
LOOP AT lt_orders INTO DATA(ls_order).
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_control
output_options = ls_output
is_order = ls_order.
ENDLOOP.
COMMIT WORK.
DATA: ls_archive TYPE arc_params.
" Archivierungsparameter
ls_archive-archiv_mode = '2'. " Drucken und Archivieren
ls_archive-ar_object = 'ZORDER'.
ls_archive-ar_date = sy-datum.
ls_archive-mandant = sy-mandt.
ls_archive-doc_type = 'PDF'.
ls_output-tdarmod = ls_archive-archiv_mode.
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_control
output_options = ls_output
archive_index = ls_archive
...

Fehlerbehandlung

DATA: lv_error_msg TYPE string.
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_control
output_options = ls_output
is_header = ls_header
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
CASE sy-subrc.
WHEN 0.
MESSAGE 'Formular erfolgreich erstellt' TYPE 'S'.
WHEN 1.
lv_error_msg = 'Formatierungsfehler im Formular'.
MESSAGE lv_error_msg TYPE 'E'.
WHEN 2.
lv_error_msg = 'Interner Fehler bei Formularverarbeitung'.
MESSAGE lv_error_msg TYPE 'E'.
WHEN 3.
lv_error_msg = 'Fehler beim Senden/Drucken'.
MESSAGE lv_error_msg TYPE 'E'.
WHEN 4.
MESSAGE 'Vom Benutzer abgebrochen' TYPE 'S'.
WHEN OTHERS.
MESSAGE 'Unbekannter Fehler' TYPE 'E'.
ENDCASE.

Smart Styles

" Style im Smart Form referenzieren
" Transaktion SMARTSTYLES
" Beispiel Style-Definition:
" - Paragraph Format: P1 (Standard), H1 (Überschrift)
" - Character Format: B (Bold), I (Italic)
" - Tab Positions für Spalten

Formular-Struktur im Smart Form Builder

Form
├── Global Definitions
│ ├── Form Interface (Import/Export)
│ ├── Global Data
│ └── Initialization
├── Pages
│ └── FIRST (Erste Seite)
│ ├── HEADER (Kopfbereich)
│ ├── MAIN (Hauptfenster)
│ └── FOOTER (Fußbereich)
└── Windows
├── HEADER
│ ├── Logo (Graphic)
│ └── Adresse (Text)
├── MAIN
│ ├── Titel (Text)
│ └── Positionen (Table)
└── FOOTER
└── Fußzeile (Text)

Best Practices

  1. Wiederverwendung: Text-Module für wiederkehrende Texte
  2. Styles: Zentrale Style-Verwaltung für konsistentes Layout
  3. Performance: Daten vor Aufruf aufbereiten, nicht im Form
  4. Testing: Verschiedene Drucker und Datenkonstellationen testen
  5. Fehlerbehandlung: Alle Exceptions abfangen
  6. Sprachen: Übersetzbare Texte verwenden

Wichtige Transaktionen

TransaktionBeschreibung
SMARTFORMSForm Builder
SMARTSTYLESStyle Editor
SE78Grafikverwaltung
SO10Textbausteine
SP01Spool-Verwaltung
NACEAusgabesteuerung

Verwandte Themen