ABAP Smart Forms : Développement de formulaires et sortie impression

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

Les Smart Forms sont l’outil standard pour le développement de formulaires dans SAP. Ils permettent la création de sorties d’impression professionnelles comme les factures, commandes et bons de livraison.

Architecture Smart Forms

ComposantTransactionDescription
FormSMARTFORMSLayout du formulaire
StyleSMARTSTYLESModèles de formatage
Text ModuleSO10Textes réutilisables
GraphiquesSE78Logos et images

Structure du formulaire

ÉlémentDescription
Global DefinitionsTypes, données, initialisation
Form InterfaceParamètres Import/Export
PagesPages avec en-tête/pied de page
WindowsZones de sortie
NodesTexte, tableau, graphique, etc.

Exemples de base

Appeler un Smart Form

DATA: lv_fm_name TYPE rs38l_fnam,
ls_output TYPE ssfcompop,
ls_control TYPE ssfctrlop,
ls_job_info TYPE ssfcrescl.
" Déterminer le nom du module fonctionnel
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 non trouvé' TYPE 'E'.
RETURN.
ENDIF.
" Options de sortie
ls_output-tdnewid = abap_true. " Nouveau job spool
ls_output-tddest = 'LP01'. " Imprimante
" Options de contrôle
ls_control-no_dialog = abap_true. " Pas de dialogue d'impression
ls_control-preview = abap_true. " Aperçu avant impression
" Appeler le Smart Form
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: / 'Formulaire créé avec succès'.
WRITE: / 'ID Spool :', ls_job_info-spoolids[ 1 ].
ENDIF.

Générer et sauvegarder un PDF

DATA: lt_pdf_lines TYPE TABLE OF tline,
lv_pdf_size TYPE i,
lv_pdf_xstring TYPE xstring.
" Sortie en PDF
ls_output-tdgetotf = abap_true. " Retourner les données OTF
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.
" Convertir OTF en PDF
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.
" Convertir les lignes PDF en XSTRING
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.
" Sauvegarder le PDF localement
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.

Envoyer un PDF par email

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.
" Convertir XSTRING en SOLIX
lt_solix = cl_bcs_convert=>xstring_to_solix( lv_pdf_xstring ).
lv_size = xstrlen( lv_pdf_xstring ).
TRY.
" Créer la demande d'envoi
lo_send_request = cl_bcs=>create_persistent( ).
" Créer le document avec pièce jointe
lo_document = cl_document_bcs=>create_document(
i_type = 'RAW"
i_text = VALUE #( ( line = 'Veuillez trouver la facture en pièce jointe.' ) )
i_subject = 'Facture' ).
" Joindre le PDF
lo_document->add_attachment(
i_attachment_type = 'PDF"
i_attachment_subject = 'Facture.pdf"
i_attachment_size = lv_size
i_att_content_hex = lt_solix ).
lo_send_request->set_document( lo_document ).
" Destinataire
lo_recipient = cl_cam_address_bcs=>create_internet_address(
i_address_string = '[email protected]' ).
lo_send_request->add_recipient( lo_recipient ).
" Envoyer
lo_send_request->send( ).
COMMIT WORK.
CATCH cx_bcs INTO DATA(lx_bcs).
MESSAGE lx_bcs->get_text( ) TYPE 'E'.
ENDTRY.

Afficher l’aperçu avant impression

" Activer l'aperçu avant impression
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 'Aperçu annulé' TYPE 'S'.
ENDIF.

Imprimer plusieurs exemplaires

" Imprimer 3 copies
ls_output-tdcopies = 3.
ls_output-tdimmed = abap_true. " Impression immédiate
" Original et copie avec textes différents
DO 2 TIMES.
IF sy-index = 1.
ls_header-doc_type = 'ORIGINAL'.
ELSE.
ls_header-doc_type = 'COPIE'.
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.

Sortie de tableau dynamique

" Dans le Smart Form - Global Definitions
" Définir la table IT_ITEMS
" Dans ABAP - Transmettre les données
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.
" Télécharger le graphique dans SE78 (BMAP ou OTF)
" Dans le Smart Form : Créer un noeud Graphic
" Alternativement : Transmettre le graphique dynamiquement
DATA: lv_bmp TYPE xstring.
" Lire le graphique depuis la base de données
SELECT SINGLE content FROM stxbitmaps
INTO lv_bmp
WHERE tdobject = 'GRAPHICS"
AND tdname = 'LOGO"
AND tdid = 'BMAP'.
" Transmettre au Smart Form
CALL FUNCTION lv_fm_name
EXPORTING
iv_logo = lv_bmp
...

Générer un code-barres

" Dans le Smart Form :
" 1. Créer un champ de code-barres dans la Window
" 2. Sélectionner le type de code-barres (ex. CODE128, EAN13)
" Dans ABAP - Transmettre la valeur du code-barres
DATA: lv_barcode TYPE char40.
lv_barcode = |{ ls_order-order_id ALPHA = IN }|.
CALL FUNCTION lv_fm_name
EXPORTING
iv_barcode = lv_barcode
...

Gestion du spool

DATA: lv_spoolid TYPE rspoid.
" ID Spool après impression du formulaire
lv_spoolid = ls_job_info-spoolids[ 1 ].
" Supprimer le job spool
CALL FUNCTION 'RSPO_DELETE_SPOOL_REQUEST"
EXPORTING
rqident = lv_spoolid
EXCEPTIONS
no_such_job = 1
OTHERS = 2.
" Convertir spool en PDF
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.

Variantes de formulaire

" Différents layouts basés sur une condition
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.

Formulaires dépendants de la langue

" Maintenir le Smart Form dans différentes langues
" Transaction SMARTFORMS -> Traduction
" Définir la langue lors de l'appel
ls_control-langu = 'E'. " Anglais
" Ou depuis les données utilisateur
ls_control-langu = sy-langu.
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_control
...

Impression en arrière-plan (sans dialogue)

" Pour les jobs batch et l'impression de masse
ls_control-no_dialog = abap_true.
ls_control-device = 'PRINTER'.
ls_output-tddest = 'LP01'. " Imprimante
ls_output-tdimmed = abap_true. " Imprimer immédiatement
ls_output-tddelete = abap_true. " Supprimer spool après impression
ls_output-tdnewid = abap_true. " Nouveau job spool
" Impression de masse
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.
" Paramètres d'archivage
ls_archive-archiv_mode = '2'. " Imprimer et archiver
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
...

Gestion des erreurs

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 'Formulaire créé avec succès' TYPE 'S'.
WHEN 1.
lv_error_msg = 'Erreur de formatage dans le formulaire'.
MESSAGE lv_error_msg TYPE 'E'.
WHEN 2.
lv_error_msg = 'Erreur interne lors du traitement du formulaire'.
MESSAGE lv_error_msg TYPE 'E'.
WHEN 3.
lv_error_msg = 'Erreur lors de l''envoi/impression'.
MESSAGE lv_error_msg TYPE 'E'.
WHEN 4.
MESSAGE 'Annulé par l''utilisateur' TYPE 'S'.
WHEN OTHERS.
MESSAGE 'Erreur inconnue' TYPE 'E'.
ENDCASE.

Smart Styles

" Référencer le style dans le Smart Form
" Transaction SMARTSTYLES
" Exemple de définition de style :
" - Paragraph Format : P1 (Standard), H1 (Titre)
" - Character Format : B (Gras), I (Italique)
" - Tab Positions pour les colonnes

Structure du formulaire dans Smart Form Builder

Form
├── Global Definitions
│ ├── Form Interface (Import/Export)
│ ├── Global Data
│ └── Initialization
├── Pages
│ └── FIRST (Première page)
│ ├── HEADER (Zone d'en-tête)
│ ├── MAIN (Fenêtre principale)
│ └── FOOTER (Zone de pied de page)
└── Windows
├── HEADER
│ ├── Logo (Graphic)
│ └── Adresse (Text)
├── MAIN
│ ├── Titre (Text)
│ └── Positions (Table)
└── FOOTER
└── Pied de page (Text)

Bonnes pratiques

  1. Réutilisation : Modules de texte pour les textes récurrents
  2. Styles : Gestion centralisée des styles pour un layout cohérent
  3. Performance : Préparer les données avant l’appel, pas dans le Form
  4. Tests : Tester différentes imprimantes et constellations de données
  5. Gestion des erreurs : Intercepter toutes les exceptions
  6. Langues : Utiliser des textes traduisibles

Transactions importantes

TransactionDescription
SMARTFORMSForm Builder
SMARTSTYLESÉditeur de styles
SE78Gestion des graphiques
SO10Blocs de texte
SP01Gestion du spool
NACEContrôle des sorties

Sujets connexes