ABAP Selection Screens : PARAMETERS, SELECT-OPTIONS

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

Les Selection Screens fournissent une interface utilisateur standardisée pour la saisie de critères de sélection dans les reports ABAP. Avec PARAMETERS et SELECT-OPTIONS, des masques de saisie flexibles peuvent être créés.

Éléments de base

ÉlémentDescription
PARAMETERSSaisie de valeur unique
SELECT-OPTIONSSaisie de plage (de-à, sélection multiple)
SELECTION-SCREENContrôle de mise en page

Exemples

1. Paramètres simples

REPORT zselection_demo.
" Paramètres individuels
PARAMETERS: p_bukrs TYPE bukrs, " Société
p_gjahr TYPE gjahr DEFAULT sy-datum(4)," Année avec défaut
p_name TYPE string. " Texte libre
" Paramètre avec aide à la recherche (automatique depuis le domaine)
PARAMETERS: p_matnr TYPE matnr.
" Champ obligatoire
PARAMETERS: p_kunnr TYPE kunnr OBLIGATORY.
START-OF-SELECTION.
WRITE: / 'Société :', p_bukrs,
/ 'Année :', p_gjahr,
/ 'Nom :', p_name,
/ 'Client :', p_kunnr.

2. SELECT-OPTIONS pour les plages

" Sélection de plage
SELECT-OPTIONS: s_kunnr FOR kna1-kunnr, " Numéro client
s_erdat FOR vbak-erdat, " Date
s_matnr FOR mara-matnr. " Article
START-OF-SELECTION.
" SELECT avec SELECT-OPTIONS
SELECT * FROM kna1
WHERE kunnr IN @s_kunnr
INTO TABLE @DATA(lt_customers).
" Ou avec plusieurs conditions
SELECT * FROM vbak
WHERE kunnr IN @s_kunnr
AND erdat IN @s_erdat
INTO TABLE @DATA(lt_orders).
WRITE: / 'Clients trouvés :', lines( lt_customers ).

3. Checkbox et boutons radio

" Checkbox
PARAMETERS: p_test AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_detail AS CHECKBOX.
" Boutons radio (groupe)
PARAMETERS: p_opt1 RADIOBUTTON GROUP grp1 DEFAULT 'X',
p_opt2 RADIOBUTTON GROUP grp1,
p_opt3 RADIOBUTTON GROUP grp1.
START-OF-SELECTION.
IF p_test = abap_true.
WRITE: / 'Mode test actif'.
ENDIF.
CASE abap_true.
WHEN p_opt1.
WRITE: / 'Option 1 sélectionnée'.
WHEN p_opt2.
WRITE: / 'Option 2 sélectionnée'.
WHEN p_opt3.
WRITE: / 'Option 3 sélectionnée'.
ENDCASE.

4. Liste déroulante (Listbox)

" Listbox avec valeurs fixes
PARAMETERS: p_status TYPE char1 AS LISTBOX
VISIBLE LENGTH 20
DEFAULT 'A'.
" Les valeurs sont définies lors de INITIALIZATION
INITIALIZATION.
DATA: lt_values TYPE vrm_values.
lt_values = VALUE #(
( key = 'A' text = 'Actif' )
( key = 'I' text = 'Inactif' )
( key = 'B' text = 'Bloqué' )
).
CALL FUNCTION 'VRM_SET_VALUES"
EXPORTING
id = 'P_STATUS"
values = lt_values.

5. Blocs SELECTION-SCREEN

" Bloc avec cadre
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-b01.
PARAMETERS: p_bukrs TYPE bukrs OBLIGATORY,
p_gjahr TYPE gjahr OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
" Autre bloc
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-b02.
SELECT-OPTIONS: s_kunnr FOR kna1-kunnr,
s_name FOR kna1-name1.
SELECTION-SCREEN END OF BLOCK b2.
" Bloc pour les options
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-b03.
PARAMETERS: p_test AS CHECKBOX,
p_alv AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b3.

6. Éléments sur une ligne

" Plusieurs éléments côte à côte
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) TEXT-001. " 'Date de :"
PARAMETERS: p_from TYPE sy-datum.
SELECTION-SCREEN COMMENT 30(10) TEXT-002. " 'Date à :"
PARAMETERS: p_to TYPE sy-datum DEFAULT sy-datum.
SELECTION-SCREEN END OF LINE.
" Encore une ligne
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(15) TEXT-003.
PARAMETERS: p_check AS CHECKBOX.
SELECTION-SCREEN COMMENT 20(20) TEXT-004.
SELECTION-SCREEN END OF LINE.

7. Textes dynamiques

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE gv_title.
PARAMETERS: p_value TYPE i.
SELECTION-SCREEN END OF BLOCK b1.
DATA: gv_title TYPE string.
INITIALIZATION.
gv_title = 'Paramètres d''entrée'.
" Définir dynamiquement le libellé du champ
%_p_value_%_app_%-text = 'Quantité'.

8. Onglets (Tabstrips)

" Définir le tabstrip
SELECTION-SCREEN BEGIN OF TABBED BLOCK tab FOR 15 LINES.
SELECTION-SCREEN TAB (20) tab1 USER-COMMAND ucomm1 DEFAULT SCREEN 100.
SELECTION-SCREEN TAB (20) tab2 USER-COMMAND ucomm2 DEFAULT SCREEN 200.
SELECTION-SCREEN TAB (20) tab3 USER-COMMAND ucomm3 DEFAULT SCREEN 300.
SELECTION-SCREEN END OF BLOCK tab.
" Subscreen 100
SELECTION-SCREEN BEGIN OF SCREEN 100.
PARAMETERS: p_par1 TYPE string.
SELECTION-SCREEN END OF SCREEN 100.
" Subscreen 200
SELECTION-SCREEN BEGIN OF SCREEN 200.
PARAMETERS: p_par2 TYPE i.
SELECTION-SCREEN END OF SCREEN 200.
" Subscreen 300
SELECTION-SCREEN BEGIN OF SCREEN 300.
SELECT-OPTIONS: s_range FOR mara-matnr.
SELECTION-SCREEN END OF SCREEN 300.
INITIALIZATION.
tab1 = 'Général'.
tab2 = 'Détails'.
tab3 = 'Sélection'.

9. Événements Selection Screen

PARAMETERS: p_kunnr TYPE kunnr,
p_name TYPE name1_gp.
" Avant l'affichage de l'écran de sélection
INITIALIZATION.
p_kunnr = '0000001000'. " Valeur par défaut
" Lors du changement de valeur d'un champ
AT SELECTION-SCREEN ON p_kunnr.
" Vérification du champ client
SELECT SINGLE kunnr FROM kna1
WHERE kunnr = @p_kunnr
INTO @DATA(lv_kunnr).
IF sy-subrc <> 0.
MESSAGE e001(zmsg) WITH p_kunnr.
" 'Le client & n'existe pas"
ENDIF.
" Lors du changement de valeur avec reprise de valeur
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_name.
" Aide F4 personnalisée
DATA: lt_return TYPE TABLE OF ddshretval.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST"
EXPORTING
retfield = 'NAME"
value_org = 'S"
TABLES
value_tab = lt_names
return_tab = lt_return.
IF lt_return IS NOT INITIAL.
p_name = lt_return[ 1 ]-fieldval.
ENDIF.
" Sur F1 (Aide)
AT SELECTION-SCREEN ON HELP-REQUEST FOR p_kunnr.
MESSAGE 'Entrez un numéro de client valide' TYPE 'I'.
" À la fin de la saisie (avant START-OF-SELECTION)
AT SELECTION-SCREEN.
" Validation croisée
IF p_kunnr IS INITIAL AND p_name IS INITIAL.
MESSAGE e002(zmsg).
" 'Indiquer au moins un critère de recherche"
ENDIF.
START-OF-SELECTION.
" Logique principale

10. Modifier SELECT-OPTIONS

SELECT-OPTIONS: s_kunnr FOR kna1-kunnr.
INITIALIZATION.
" Valeurs par défaut pour SELECT-OPTIONS
s_kunnr = VALUE #(
( sign = 'I' option = 'BT' low = '0000001000' high = '0000001999' )
).
AT SELECTION-SCREEN OUTPUT.
" Restreindre SELECT-OPTION à "égal uniquement"
LOOP AT SCREEN.
IF screen-name CS 'S_KUNNR'.
screen-required = '1'. " Champ obligatoire
ENDIF.
MODIFY SCREEN.
ENDLOOP.

11. Afficher/Masquer des champs

PARAMETERS: p_mode TYPE char1 AS LISTBOX VISIBLE LENGTH 10.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS: p_field1 TYPE string MODIF ID gr1,
p_field2 TYPE string MODIF ID gr2.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
" Groupe 1 seulement pour Mode = 'A"
IF screen-group1 = 'GR1'.
IF p_mode = 'A'.
screen-active = '1'.
ELSE.
screen-active = '0'.
ENDIF.
ENDIF.
" Groupe 2 seulement pour Mode = 'B"
IF screen-group1 = 'GR2'.
IF p_mode = 'B'.
screen-active = '1'.
ELSE.
screen-active = '0'.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
AT SELECTION-SCREEN ON p_mode.
" Reconstruire l'écran après changement de mode

12. Champs en lecture seule

PARAMETERS: p_ref TYPE string,
p_calc TYPE p DECIMALS 2 MODIF ID ro1. " Lecture seule
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-group1 = 'RO1'.
screen-input = '0'. " Pas de saisie possible
screen-intensified = '1'. " Mis en évidence
ENDIF.
MODIFY SCREEN.
ENDLOOP.
AT SELECTION-SCREEN ON p_ref.
" Calcul lors du changement
p_calc = strlen( p_ref ).

13. Bouton-poussoir dans l’écran de sélection

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS: p_input TYPE string.
SELECTION-SCREEN END OF BLOCK b1.
" Boutons-poussoirs
SELECTION-SCREEN PUSHBUTTON /1(20) btn1 USER-COMMAND cmd1.
SELECTION-SCREEN PUSHBUTTON 25(20) btn2 USER-COMMAND cmd2.
INITIALIZATION.
btn1 = 'Valider'.
btn2 = 'Réinitialiser'.
AT SELECTION-SCREEN.
CASE sy-ucomm.
WHEN 'CMD1'.
" Validation
IF p_input IS INITIAL.
MESSAGE 'Saisie requise' TYPE 'S' DISPLAY LIKE 'E'.
ELSE.
MESSAGE 'Saisie OK' TYPE 'S'.
ENDIF.
WHEN 'CMD2'.
" Réinitialiser
CLEAR p_input.
ENDCASE.

14. Sauvegarder et charger des variantes

" Charger une variante de manière programmatique
PARAMETERS: p_var TYPE raldb_vari.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_var.
" Sélection de variantes
CALL FUNCTION 'RS_VARIANT_CATALOG"
EXPORTING
report = sy-repid
new_title = 'Sélectionner une variante"
IMPORTING
variant = p_var.
AT SELECTION-SCREEN.
IF sy-ucomm = 'LOAD_VAR' AND p_var IS NOT INITIAL.
" Charger la variante
CALL FUNCTION 'RS_SUPPORT_SELECTIONS"
EXPORTING
report = sy-repid
variant = p_var.
ENDIF.

15. Exemple complet

REPORT zcomplete_selection.
" Textes
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-b01.
PARAMETERS: p_bukrs TYPE bukrs OBLIGATORY.
SELECT-OPTIONS: s_gjahr FOR bkpf-gjahr DEFAULT sy-datum(4).
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-b02.
SELECT-OPTIONS: s_kunnr FOR bsid-kunnr,
s_lifnr FOR bsik-lifnr.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-b03.
PARAMETERS: p_alv AS CHECKBOX DEFAULT 'X',
p_detail AS CHECKBOX,
p_test AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b3.
" Boutons-poussoirs
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
" Données globales
DATA: gt_data TYPE TABLE OF bsid.
INITIALIZATION.
" Textes des touches de fonction
sscrfields-functxt_01 = 'Documentation'.
sscrfields-functxt_02 = 'Tout effacer'.
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'FC01'.
" Afficher la documentation
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT"
EXPORTING
titel = 'Aide"
textline1 = 'Ce programme crée un rapport."
textline2 = 'Sélectionnez vos critères.'.
WHEN 'FC02'.
" Effacer tous les champs
CLEAR: s_kunnr[], s_lifnr[].
ENDCASE.
AT SELECTION-SCREEN ON p_bukrs.
" Valider la société
SELECT SINGLE bukrs FROM t001
WHERE bukrs = @p_bukrs
INTO @DATA(lv_bukrs).
IF sy-subrc <> 0.
MESSAGE e010(zmsg) WITH p_bukrs.
ENDIF.
START-OF-SELECTION.
" Charger les données
IF p_test = abap_true.
WRITE: / 'Mode test - aucune donnée chargée'.
RETURN.
ENDIF.
SELECT * FROM bsid
WHERE bukrs = @p_bukrs
AND gjahr IN @s_gjahr
AND kunnr IN @s_kunnr
INTO TABLE @gt_data.
WRITE: / 'Enregistrements chargés :', lines( gt_data ).
END-OF-SELECTION.
" ALV ou liste classique
IF p_alv = abap_true.
" Afficher ALV
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = gt_data
).
lo_alv->display( ).
CATCH cx_salv_msg.
ENDTRY.
ELSE.
" Sortie classique
LOOP AT gt_data INTO DATA(ls_data).
WRITE: / ls_data-bukrs, ls_data-kunnr, ls_data-dmbtr.
ENDLOOP.
ENDIF.

Événements de report

ÉvénementMoment
INITIALIZATIONAvant l’affichage de l’écran de sélection
AT SELECTION-SCREEN OUTPUTAvant chaque PBO
AT SELECTION-SCREEN ON fieldAprès changement de champ
AT SELECTION-SCREEN ON VALUE-REQUESTSur F4
AT SELECTION-SCREEN ON HELP-REQUESTSur F1
AT SELECTION-SCREENÀ la fin de la saisie
START-OF-SELECTIONAprès l’écran de sélection
END-OF-SELECTIONAprès le traitement des données

Notes importantes / Bonnes pratiques

  • Utiliser OBLIGATORY pour les champs obligatoires.
  • Utiliser DEFAULT pour un pré-remplissage pertinent.
  • Blocs avec FRAME pour un regroupement clair.
  • Validation dans AT SELECTION-SCREEN ON field.
  • MODIF ID pour afficher/masquer dynamiquement.
  • SELECT-OPTIONS pour une sélection de plage flexible.
  • Personnaliser l’aide F4 avec VALUE-REQUEST.
  • Éléments de texte (TEXT-xxx) pour la traductibilité.
  • Variantes pour des paramètres réutilisables.
  • Combiner avec ALV pour une sortie professionnelle.