ABAP SELECT-OPTIONS : Définir des critères de sélection complexes

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

L’instruction SELECT-OPTIONS est un mot-clé ABAP spécial que vous utilisez exclusivement dans la partie déclaration des programmes exécutables (REPORT), des groupes de fonctions ou des pools de modules. Elle sert à définir des critères de sélection complexes sur l’écran de sélection standard (Dynpro 1000) d’un programme.

Contrairement aux simples PARAMETERS qui ne créent qu’un seul champ de saisie, SELECT-OPTIONS permet à l’utilisateur de saisir à l’exécution :

  • Des valeurs individuelles
  • Des intervalles (plages de-à)
  • Plusieurs valeurs individuelles et intervalles (via le bouton de sélection multiple)
  • Des exclusions de valeurs ou d’intervalles
  • Des comparaisons de motifs (ex. ‘ABC*’)

Les options de sélection définies sont typiquement utilisées dans la clause WHERE des instructions SELECT pour filtrer les requêtes de base de données de manière dynamique et flexible.

Syntaxe

SELECT-OPTIONS <selcrit> FOR <champ>
[DEFAULT <valeur> [TO <valeur2>] [OPTION <op>] [SIGN <sg>]] " Valeurs par défaut
[OBLIGATORY] " Saisie obligatoire
[NO-EXTENSION] " Pas de sélection multiple (une seule ligne)
[NO INTERVALS] " Pas de saisie d'intervalle (seulement valeurs uniques/motifs)
[LOWER CASE] " Autoriser/conserver les minuscules
[MEMORY ID <pid>] " ID mémoire SAP pour pré-remplissage
[VISIBLE LENGTH <vlen>] " Longueur visible des champs à l'écran
[MODIF ID <mid>]. " Groupe de modification pour adaptation dynamique de l'écran
" [MATCHCODE OBJECT ...] " Obsolète pour aide F4, mieux via référence Dictionary dans FOR
" [NO DATABASE SELECTION] " Généralement pour usage interne SAP
  • <selcrit> : Le nom du critère de sélection (ex. s_kunnr, so_matnr). Sous ce nom, une table Ranges est créée en interne.
  • FOR <champ> : Très important ! Spécifie l’objet de données auquel le critère se réfère et dont il hérite le type de données. C’est souvent un champ de table de base de données (ex. mara-matnr) ou une variable locale (my_variable). Le type détermine les propriétés des champs LOW et HIGH de la table Ranges et influence les vérifications de saisie ainsi que l’aide F4.

Fonctionnement (Que se passe-t-il en arrière-plan ?)

L’instruction SELECT-OPTIONS <selcrit> FOR ... déclare implicitement une table interne nommée <selcrit>. Cette table a une structure fixe (structure Ranges) avec quatre colonnes :

  1. SIGN (Character 1) : Contient ‘I’ pour Inclusif (Include) ou ‘E’ pour Exclusif (Exclude).
  2. OPTION (Character 2) : Contient l’opérateur de comparaison. Les valeurs courantes sont :
    • EQ : Equals (Égal)
    • NE : Not Equal (Différent)
    • BT : Between (Entre)
    • NB : Not Between (Pas entre)
    • CP : Contains Pattern (Contient un motif, ex. A*)
    • NP : Not contains Pattern (Ne contient pas le motif)
    • GT : Greater Than (Supérieur à)
    • GE : Greater Equal (Supérieur ou égal)
    • LT : Less Than (Inférieur à)
    • LE : Less Equal (Inférieur ou égal)
  3. LOW : La limite inférieure ou la valeur unique. Le type de données est hérité du champ dans la clause FOR.
  4. HIGH : La limite supérieure (pertinente uniquement pour OPTION = BT ou NB). Même type de données que LOW.

Sur l’écran de sélection, l’utilisateur saisit des valeurs que le système inscrit ensuite dans cette table interne <selcrit> lors de l’exécution du report.

Compléments (Options) importants expliqués

  • DEFAULT <valeur> [TO <valeur2>] ... : Pré-remplit le critère à l’écran avec une ou plusieurs valeurs par défaut.
  • OBLIGATORY : Rend la saisie d’au moins une valeur dans ce critère obligatoire. Le programme ne peut pas être lancé sans saisie.
  • NO-EXTENSION : Masque le bouton “Sélection multiple” (à droite des champs de saisie). L’utilisateur ne peut saisir que la ligne directement visible (une valeur ou un intervalle).
  • NO INTERVALS : Masque le champ “Jusqu’à” (champ HIGH). L’utilisateur ne peut saisir que des valeurs uniques (EQ, NE, GT, etc.) ou des motifs (CP, NP), pas de plages (BT, NB).
  • LOWER CASE : Permet la saisie de lettres minuscules et empêche la conversion automatique en majuscules.

Utilisation dans ABAP SQL (Requêtes de base de données)

La table Ranges <selcrit> remplie par l’utilisateur est utilisée dans la clause WHERE d’une instruction SELECT avec l’opérateur IN pour filtrer la sélection de base de données :

SELECT carrid, connid, fldate
FROM spfli
WHERE carrid IN @s_carrid " s_carrid est le SELECT-OPTIONS
AND connid IN @s_connid " s_connid est un autre SELECT-OPTIONS
INTO TABLE @DATA(lt_flights).

La base de données ne sélectionne alors que les lignes dont les valeurs de champ satisfont les conditions définies dans la table Ranges.

Distinction avec PARAMETERS

  • PARAMETERS : Définit un unique champ de saisie pour exactement une valeur sur l’écran de sélection.
  • SELECT-OPTIONS : Définit des possibilités de saisie plus complexes (plages, valeurs multiples, exclusions, motifs) et crée pour cela une table interne.

Exemples

1. Select-Option standard pour numéro d’article

REPORT z_demo_selopt.
TABLES: mara. " Pour la clause FOR (ou déclarer une variable locale)
SELECT-OPTIONS s_matnr FOR mara-matnr.
START-OF-SELECTION.
SELECT matnr, mtart, matkl
FROM mara
WHERE matnr IN @s_matnr " Filtrer par numéros d'articles
INTO TABLE @DATA(lt_mara).
cl_demo_output=>display( lt_mara ).

(Crée sur l’écran de sélection des champs pour Material de/à et le bouton de sélection multiple)

2. Plage de dates avec valeur par défaut (aujourd’hui) et saisie obligatoire

SELECT-OPTIONS s_date FOR sy-datum OBLIGATORY DEFAULT sy-datum.

(Crée un champ de date de/à, pré-rempli avec la date du jour et qui doit être renseigné)

3. Uniquement des compagnies aériennes individuelles (pas de plages, pas de sélection multiple)

SELECT-OPTIONS s_carrid FOR spfli-carrid NO INTERVALS NO-EXTENSION.

(Crée seulement un champ de saisie unique pour l’ID de la compagnie aérienne, sans champ “jusqu’à” et sans bouton de sélection multiple)

Notes importantes / Bonnes pratiques

  • SELECT-OPTIONS sont définis dans la partie déclaration des programmes qui doivent avoir un écran de sélection.
  • La clause FOR est cruciale pour le type, les vérifications et l’aide F4. Elle doit référencer un champ du dictionnaire ou une variable avec le type approprié.
  • La table Ranges générée est utilisée avec l’opérateur IN dans la clause WHERE.
  • Utilisez PARAMETERS pour des valeurs de saisie simples et SELECT-OPTIONS pour des critères de sélection plus complexes.