Documentation du Programme ABAP ZADA_PROG_UNIT_05 #
Vue d’ensemble #
Ce programme est un guide pédagogique sur les structures conditionnelles en ABAP. Il présente les deux principales méthodes pour gérer les conditions : CASE/ENDCASE et IF/ENDIF, avec des exemples pratiques basés sur les mois et les saisons.
Structure du Programme #
| Fichier | Rôle | Contenu |
|---|---|---|
| ZADA_PROG_UNIT_05.txt | Programme principal | Appelle 2 routines conditionnelles |
| ZADA_PROG_UNIT_05_TOP.txt | Déclarations globales | Vide (non utilisé) |
| ZADA_PROG_UNIT_05_SCR.txt | Écran de sélection | Vide (non utilisé) |
| ZADA_PROG_UNIT_05_F01.txt | Sous-programmes | 2 FORM routines pédagogiques |
CASE/ENDCASE - Structure de Choix #
Principe #
CASE permet de tester une variable contre plusieurs valeurs possibles. C’est idéal quand on a une seule variable avec plusieurs valeurs discrètes à tester.
Syntaxe de Base #
CASE variable.
WHEN valeur1.
" Code si variable = valeur1
WHEN valeur2.
" Code si variable = valeur2
WHEN OTHERS.
" Code si aucune condition n'est remplie
ENDCASE.
Exemple : Détermination de Saison #
FORM case_endcase.
" Ne fonctionne que sur une variable.
" Ne pas oublier WHEN OTHERS.
DATA: lv_month TYPE i.
" Extraction du mois depuis la date système (AAAAMMJJ)
lv_month = sy-datum+4(2).
CASE lv_month.
WHEN 12 OR 1 OR 2.
WRITE:/'C''est l''hiver'.
WHEN 3 OR 4 OR 5.
WRITE:/'C''est le printemps'.
WHEN 6 OR 7 OR 8.
WRITE:/'C''est l''été'.
WHEN 9 OR 10 OR 11.
WRITE:/'C''est l''automne'.
WHEN OTHERS.
WRITE:/'Y a plus de saison!'.
ENDCASE.
ENDFORM.
Décomposition du Code #
Extraction du Mois #
lv_month = sy-datum+4(2).
Explication :
sy-datum: variable système contenant la date du jour (format AAAAMMJJ)+4(2): OFFSET - commence à la position 4, prend 2 caractères- Si
sy-datum = '20251212'→lv_month = 12
Structure CASE #
WHEN 12 OR 1 OR 2.
Signification :
- Si
lv_monthvaut 12 OU 1 OU 2 - L’opérateur
ORpermet de tester plusieurs valeurs pour une même action - Évite d’écrire :
WHEN 12. ... WHEN 1. ... WHEN 2.
Caractéristiques Importantes #
Règle 1 : Une Seule Variable #
" CORRECT - Une seule variable
CASE lv_month.
WHEN 12.
...
ENDCASE.
" IMPOSSIBLE - CASE ne peut pas tester plusieurs variables
CASE lv_month AND lv_year. " ERREUR SYNTAXE
...
ENDCASE.
Règle 2 : WHEN OTHERS Obligatoire (Bonne Pratique) #
CASE lv_value.
WHEN 1.
WRITE: 'Un'.
WHEN 2.
WRITE: 'Deux'.
WHEN OTHERS. " IMPORTANT : Gérer les cas non prévus
WRITE: 'Autre valeur'.
ENDCASE.
Pourquoi WHEN OTHERS ?
- Gère les valeurs imprévues
- Évite les bugs silencieux
- Rend le code plus robuste
- Bonne pratique professionnelle
Utilisation de OR #
" Plusieurs valeurs déclenchant la même action
WHEN 12 OR 1 OR 2.
WRITE: 'Hiver'.
" Équivalent (mais plus verbeux) :
WHEN 12.
WRITE: 'Hiver'.
WHEN 1.
WRITE: 'Hiver'.
WHEN 2.
WRITE: 'Hiver'.
IF/ENDIF - Structure Conditionnelle #
Principe #
IF permet de tester des conditions complexes avec des opérateurs de comparaison et des opérateurs logiques. Plus flexible que CASE.
Syntaxe de Base #
IF condition1.
" Code si condition1 est vraie
ELSEIF condition2.
" Code si condition1 fausse ET condition2 vraie
ELSEIF condition3.
" Code si condition1 et 2 fausses ET condition3 vraie
ELSE.
" Code si toutes les conditions sont fausses
ENDIF.
Exemple : Identification de Mois #
FORM if_endif.
DATA lv_month TYPE i.
lv_month = sy-datum+4(2).
IF lv_month = 1.
WRITE:/'C''est le mois de janvier'.
ELSEIF lv_month = 2.
WRITE:/'C''est le mois de février'.
ELSEIF lv_month = 3.
WRITE:/'C''est le mois de mars'.
ELSEIF lv_month = 4.
WRITE:/'C''est le mois d''avril'.
ELSEIF lv_month = 5.
WRITE:/'C''est le mois de mai'.
ELSE.
WRITE:/'Autre mois de l''année'.
ENDIF.
ENDFORM.
Variantes de IF #
IF Simple #
IF lv_age >= 18.
WRITE: 'Majeur'.
ENDIF.
IF…ELSE #
IF lv_age >= 18.
WRITE: 'Majeur'.
ELSE.
WRITE: 'Mineur'.
ENDIF.
IF…ELSEIF…ELSE (Multi-conditions) #
IF lv_note >= 16.
WRITE: 'Très bien'.
ELSEIF lv_note >= 14.
WRITE: 'Bien'.
ELSEIF lv_note >= 12.
WRITE: 'Assez bien'.
ELSEIF lv_note >= 10.
WRITE: 'Passable'.
ELSE.
WRITE: 'Insuffisant'.
ENDIF.
IF avec Conditions Multiples #
Opérateur AND (ET logique) #
IF lv_age >= 18 AND lv_permis = 'X'.
WRITE: 'Peut conduire'.
ENDIF.
Signification : Les deux conditions doivent être vraies.
Opérateur OR (OU logique) #
IF lv_month = 12 OR lv_month = 1 OR lv_month = 2.
WRITE: 'Hiver'.
ENDIF.
Signification : Au moins une condition doit être vraie.
Combinaison AND/OR avec Parenthèses #
IF ( lv_age >= 18 AND lv_permis = 'X' ) OR lv_taxi = 'X'.
WRITE: 'Peut conduire'.
ENDIF.
Signification :
- (Majeur ET a le permis) OU (est chauffeur de taxi)
- Les parenthèses définissent la priorité
Comparaison CASE vs IF #
Tableau Comparatif #
| Critère | CASE/ENDCASE | IF/ENDIF |
|---|---|---|
| Variables testées | Une seule | Une ou plusieurs |
| Type de test | Égalité uniquement | Tous les opérateurs (=, <, >, <=, >=, <>) |
| Complexité | Conditions simples | Conditions complexes |
| Lisibilité | Excellente pour valeurs discrètes | Moyenne pour nombreuses conditions |
| Flexibilité | Limitée | Très flexible |
| Performance | Légèrement plus rapide | Standard |
| Usage typique | Switch entre valeurs fixes | Comparaisons, intervalles, logique complexe |
Quand Utiliser CASE ? #
SOLUTION avec IF :
IF lv_age >= 18 AND lv_country = 'FR'.
WRITE: 'Majeur français'.
ENDIF.
Opérateurs Spéciaux ABAP #
IS INITIAL #
Teste si une variable est vide (valeur initiale).
DATA: lv_name TYPE string.
IF lv_name IS INITIAL.
WRITE: 'Nom non renseigné'.
ELSE.
WRITE: 'Nom:', lv_name.
ENDIF.
Valeurs initiales selon le type :
STRING/C→''(vide)I/N→0P→0.00D→'00000000'XFELD→''
IS NOT INITIAL #
Inverse de IS INITIAL.
IF lv_email IS NOT INITIAL.
WRITE: 'Email fourni:', lv_email.
ENDIF.
CA (Contains Any) #
Teste si une chaîne contient au moins un des caractères spécifiés.
DATA lv_email TYPE string VALUE 'test@example.com'.
IF lv_email CA '@'.
WRITE: 'Email valide (contient @)'.
ENDIF.
CO (Contains Only) #
Teste si une chaîne contient uniquement les caractères spécifiés.
DATA lv_code TYPE string VALUE '12345'.
IF lv_code CO '0123456789'.
WRITE: 'Code numérique uniquement'.
ENDIF.
CP (Contains Pattern) #
Teste si une chaîne correspond à un motif (avec jokers * et +).
DATA lv_file TYPE string VALUE 'document.pdf'.
IF lv_file CP '*.pdf'.
WRITE: 'Fichier PDF détecté'.
ENDIF.
Jokers :
*: zéro ou plusieurs caractères+: exactement un caractère
Programme Principal #
REPORT ZADA_PROG_UNIT_05.
INCLUDE ZADA_PROG_UNIT_05_TOP. " Vide
INCLUDE ZADA_PROG_UNIT_05_SCR. " Vide
INCLUDE ZADA_PROG_UNIT_05_F01. " 2 FORM routines
START-OF-SELECTION.
PERFORM case_endcase. " Exemple CASE : saisons
PERFORM if_endif. " Exemple IF : mois
Résumé des Concepts Clés #
CASE/ENDCASE #
- Une seule variable
- Valeurs discrètes
- Utiliser OR pour regrouper valeurs
- Toujours mettre WHEN OTHERS
- Impossible pour <, >, <=, >=
- Impossible pour plusieurs variables
IF/ENDIF #
- Une ou plusieurs variables
- Tous opérateurs de comparaison
- Logique complexe (AND, OR, NOT)
- Conditions imbriquées
- Plus flexible que CASE
Opérateurs #
- Comparaison :
=,<>,<,>,<=,>= - Logiques :
AND,OR,NOT - Spéciaux :
IS INITIAL,CA,CO,CP
Bonnes Pratiques #
- Toujours prévoir le cas par défaut
- Utiliser des parenthèses pour clarifier
- Choisir la structure appropriée (CASE vs IF)
- Éviter les imbrications excessives
- Noms de variables explicites
- Commenter les conditions complexes
Exercices Pratiques #
Exercice 1 : Catégorie d’Âge #
Créer une routine qui détermine la catégorie d’âge :
- 0-12 : Enfant
- 13-17 : Adolescent
- 18-64 : Adulte
- 65+ : Senior
Solution
FORM age_category.
DATA: lv_age TYPE i,
lv_category TYPE string.
lv_age = 25.
IF lv_age <= 12.
lv_category = 'Enfant'.
ELSEIF lv_age >= 13 AND lv_age <= 17.
lv_category = 'Adolescent'.
ELSEIF lv_age >= 18 AND lv_age <= 64.
lv_category = 'Adulte'.
ELSE.
lv_category = 'Senior'.
ENDIF.
WRITE: / 'Âge:', lv_age, '→', lv_category.
ENDFORM.
Exercice 2 : Jour de la Semaine #
Utiliser CASE pour afficher le nom du jour selon un numéro (1=Lundi, 7=Dimanche).
Solution
FORM day_of_week.
DATA: lv_day_number TYPE i,
lv_day_name TYPE string.
lv_day_number = 3.
CASE lv_day_number.
WHEN 1.
lv_day_name = 'Lundi'.
WHEN 2.
lv_day_name = 'Mardi'.
WHEN 3.
lv_day_name = 'Mercredi'.
WHEN 4.
lv_day_name = 'Jeudi'.
WHEN 5.
lv_day_name = 'Vendredi'.
WHEN 6.
lv_day_name = 'Samedi'.
WHEN 7.
lv_day_name = 'Dimanche'.
WHEN OTHERS.
lv_day_name = 'Jour invalide'.
ENDCASE.
WRITE: / 'Jour', lv_day_number, '=', lv_day_name.
ENDFORM.
Exercice 3 : Éligibilité au Crédit #
Un client est éligible au crédit si :
- Revenus > 2000€ ET âge >= 18 ET pas d’incidents de paiement
- OU client VIP
Solution
FORM credit_eligibility.
DATA: lv_income TYPE p DECIMALS 2,
lv_age TYPE i,
lv_incidents TYPE i,
lv_vip TYPE xfeld,
lv_eligible TYPE abap_bool.
lv_income = '2500.00'.
lv_age = 30.
lv_incidents = 0.
lv_vip = ''.
IF ( lv_income > 2000 AND lv_age >= 18 AND lv_incidents = 0 )
OR lv_vip = 'X'.
lv_eligible = abap_true.
ELSE.
lv_eligible = abap_false.
ENDIF.
IF lv_eligible = abap_true.
WRITE: / 'Client éligible au crédit'.
ELSE.
WRITE: / 'Client non éligible'.
ENDIF.
ENDFORM.
Opérateurs de Comparaison #
Tableau des Opérateurs #
| Opérateur | Signification | Exemple | Résultat si… |
|---|---|---|---|
| = ou EQ | Égal à | lv_age = 18 |
lv_age vaut exactement 18 |
| <> ou NE | Différent de | lv_status <> 'X' |
lv_status n’est pas ‘X’ |
| < ou LT | Inférieur à | lv_price < 100 |
lv_price est strictement inférieur à 100 |
| > ou GT | Supérieur à | lv_stock > 0 |
lv_stock est strictement supérieur à 0 |
| <= ou LE | Inférieur ou égal | lv_age <= 65 |
lv_age est 65 ou moins |
| >= ou GE | Supérieur ou égal | lv_note >= 10 |
lv_note est 10 ou plus |
Syntaxe Alternative #
ABAP accepte deux syntaxes :
" Syntaxe symbolique (recommandée)
IF lv_age >= 18.
...
ENDIF.
" Syntaxe textuelle (ancienne)
IF lv_age GE 18.
...
ENDIF.
Recommandation : Utiliser la syntaxe symbolique (=, <>, <, >, <=, >=) car plus universelle et lisible.
Exemples d’Utilisation #
" Égalité
IF lv_country = 'FR'.
WRITE: 'France'.
ENDIF.
" Différence
IF lv_status <> 'DELETED'.
WRITE: 'Enregistrement actif'.
ENDIF.
" Comparaison numérique
IF lv_quantity > 100.
WRITE: 'Stock important'.
ENDIF.
" Intervalle
IF lv_price >= 10 AND lv_price <= 50.
WRITE: 'Prix modéré'.
ENDIF.
Opérateurs Logiques #
AND (ET Logique) #
Syntaxe : condition1 AND condition2
Signification : Les deux conditions doivent être vraies.
Table de vérité :
| Condition 1 | Condition 2 | Résultat |
|---|---|---|
| Vrai | Vrai | Vrai |
| Vrai | Faux | Faux |
| Faux | Vrai | Faux |
| Faux | Faux | Faux |
Exemple :
IF lv_age >= 18 AND lv_permis = 'X'.
WRITE: 'Peut conduire'.
ENDIF.
OR (OU Logique) #
Syntaxe : condition1 OR condition2
Signification : Au moins une condition doit être vraie.
Table de vérité :
| Condition 1 | Condition 2 | Résultat |
|---|---|---|
| Vrai | Vrai | Vrai |
| Vrai | Faux | Vrai |
| Faux | Vrai | Vrai |
| Faux | Faux | Faux |
Exemple :
IF lv_urgent = 'X' OR lv_vip = 'X'.
WRITE: 'Traitement prioritaire'.
ENDIF.
NOT (NON Logique) #
Syntaxe : NOT condition
Signification : Inverse le résultat de la condition.
Table de vérité :
| Condition | Résultat |
|---|---|
| Vrai | Faux |
| Faux | Vrai |
Exemple :
IF NOT lv_blocked = 'X'.
WRITE: 'Client non bloqué'.
ENDIF.
" Équivalent à :
IF lv_blocked <> 'X'.
WRITE: 'Client non bloqué'.
ENDIF.
Combinaisons avec Parenthèses #
Les parenthèses définissent l’ordre d’évaluation.
" Sans parenthèses (évaluation de gauche à droite)
IF lv_a = 1 OR lv_b = 2 AND lv_c = 3.
" Ambigu !
ENDIF.
" Avec parenthèses (clair)
IF lv_a = 1 OR ( lv_b = 2 AND lv_c = 3 ).
" (b=2 ET c=3) OU (a=1)
ENDIF.
IF ( lv_a = 1 OR lv_b = 2 ) AND lv_c = 3.
" (a=1 OU b=2) ET (c=3)
ENDIF.
Règle : Toujours utiliser des parenthèses pour clarifier les conditions complexes.
Exemples Pratiques #
" Remise pour clients VIP OU commandes > 1000€
IF lv_vip = 'X' OR lv_order_amount > 1000.
lv_discount = '10'.
ENDIF.
" Livraison gratuite si commande > 50€ ET client actif
IF lv_order_amount >= 50 AND lv_customer_active = 'X'.
lv_shipping_cost = 0.
ENDIF.
" Validation : adulte avec permis OU chauffeur professionnel
IF ( lv_age >= 18 AND lv_license = 'X' ) OR lv_professional = 'X'.
WRITE: 'Autorisé à conduire'.
ENDIF.
Bonnes Pratiques #
Choisir la Structure Appropriée #
| Situation | Structure Recommandée | Pourquoi |
|---|---|---|
| Test d’une variable sur valeurs fixes | CASE | Plus lisible |
| Comparaisons (<, >, <=, >=) | IF | CASE limité à l’égalité |
| Plusieurs variables | IF | CASE ne teste qu’une variable |
| Logique complexe (AND/OR/NOT) | IF | Plus flexible |
| 2-3 conditions simples | IF | Plus simple |
| 5+ valeurs discrètes | CASE | Plus organisé |
Toujours Prévoir le Cas par Défaut #
AVEC gestion du défaut :
CASE lv_status.
WHEN 'A'.
WRITE: 'Actif'.
WHEN 'I'.
WRITE: 'Inactif'.
WHEN OTHERS. " IMPORTANT
WRITE: 'Statut inconnu'.
ENDCASE.
IF lv_age < 18.
WRITE: 'Mineur'.
ELSEIF lv_age >= 18 AND lv_age < 65.
WRITE: 'Adulte'.
ELSE. " IMPORTANT
WRITE: 'Senior'.
ENDIF.
SANS gestion du défaut (risqué) :
CASE lv_status.
WHEN 'A'.
WRITE: 'Actif'.
WHEN 'I'.
WRITE: 'Inactif'.
" Pas de WHEN OTHERS : si autre valeur, rien ne se passe
ENDCASE.
Éviter les Imbrications Excessives #
MAUVAIS (trop imbriqué) :
IF lv_a = 1.
IF lv_b = 2.
IF lv_c = 3.
IF lv_d = 4.
WRITE: 'Résultat'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
BON (conditions combinées) :
IF lv_a = 1 AND lv_b = 2 AND lv_c = 3 AND lv_d = 4.
WRITE: 'Résultat'.
ENDIF.
BON (sortie anticipée) :
IF lv_a <> 1.
RETURN.
ENDIF.
IF lv_b <> 2.
RETURN.
ENDIF.
WRITE: 'Traitement'.
Utiliser des Noms de Variables Explicites #
MAUVAIS :
IF x = 1.
y = 2.
ENDIF.
BON :
IF lv_order_status = 'PENDING'.
lv_priority_level = 'HIGH'.
ENDIF.
Commenter les Conditions Complexes #
" Remise applicable si :
" - Client VIP OU commande > 1000€
" - ET compte actif
" - ET pas de retard de paiement
IF ( lv_vip = 'X' OR lv_amount > 1000 )
AND lv_account_active = 'X'
AND lv_payment_delay = 0.
lv_discount = '15'.
ENDIF.
Exemples Avancés #
Calcul de Remise Selon Montant #
DATA: lv_order_amount TYPE p DECIMALS 2,
lv_discount TYPE p DECIMALS 2.
lv_order_amount = '1500.00'.
" Remises progressives
IF lv_order_amount >= 2000.
lv_discount = 20. " 20%
ELSEIF lv_order_amount >= 1000.
lv_discount = 15. " 15%
ELSEIF lv_order_amount >= 500.
lv_discount = 10. " 10%
ELSEIF lv_order_amount >= 100.
lv_discount = 5. " 5%
ELSE.
lv_discount = 0. " Pas de remise
ENDIF.
WRITE: / 'Montant:', lv_order_amount,
/ 'Remise:', lv_discount, '%'.
Validation de Formulaire #
DATA: lv_name TYPE string,
lv_email TYPE string,
lv_age TYPE i,
lv_country TYPE char2,
lv_valid TYPE abap_bool.
lv_valid = abap_true.
" Validation nom
IF lv_name IS INITIAL.
WRITE: / 'Erreur : Nom obligatoire'.
lv_valid = abap_false.
ENDIF.
" Validation email
IF lv_email IS INITIAL OR NOT lv_email CA '@'.
WRITE: / 'Erreur : Email invalide'.
lv_valid = abap_false.
ENDIF.
" Validation âge
IF lv_age < 18.
WRITE: / 'Erreur : Âge minimum 18 ans'.
lv_valid = abap_false.
ENDIF.
" Validation pays
CASE lv_country.
WHEN 'FR' OR 'DE' OR 'ES' OR 'IT' OR 'BE'.
" Pays accepté
WHEN OTHERS.
WRITE: / 'Erreur : Pays non supporté'.
lv_valid = abap_false.
ENDCASE.
IF lv_valid = abap_true.
WRITE: / 'Formulaire valide !'.
ELSE.
WRITE: / 'Formulaire invalide, corriger les erreurs'.
ENDIF.
Système de Notation #
DATA: lv_score TYPE i,
lv_grade TYPE char1.
lv_score = 85.
IF lv_score >= 90.
lv_grade = 'A'.
ELSEIF lv_score >= 80.
lv_grade = 'B'.
ELSEIF lv_score >= 70.
lv_grade = 'C'.
ELSEIF lv_score >= 60.
lv_grade = 'D'.
ELSE.
lv_grade = 'F'.
ENDIF.
WRITE: / 'Score:', lv_score, '→ Note:', lv_grade.
Gestion de Priorité Multi-Critères #
DATA: lv_vip TYPE xfeld,
lv_urgent TYPE xfeld,
lv_amount TYPE p DECIMALS 2,
lv_priority TYPE string.
" Détermination de la priorité
IF lv_vip = 'X' AND lv_urgent = 'X'.
lv_priority = 'CRITIQUE'.
ELSEIF lv_vip = 'X' OR ( lv_urgent = 'X' AND lv_amount > 5000 ).
lv_priority = 'HAUTE'.
ELSEIF lv_urgent = 'X' OR lv_amount > 1000.
lv_priority = 'MOYENNE'.
ELSE.
lv_priority = 'NORMALE'.
ENDIF.
WRITE: / 'Priorité de traitement:', lv_priority.
Conclusion #
Ce programme constitue une référence fondamentale sur les structures conditionnelles en ABAP :
- CASE/ENDCASE pour valeurs discrètes
- IF/ENDIF pour conditions complexes
- Tous les opérateurs de comparaison et logiques
- Bonnes pratiques et erreurs à éviter
- Exemples pratiques et exercices
Il sert de guide de référence pour tout développeur ABAP devant implémenter de la logique conditionnelle, avec des exemples concrets couvrant les cas d’usage les plus courants (validation, calcul, catégorisation, priorisation).Utiliser CASE quand :
- Test d’une seule variable
- Valeurs discrètes (1, 2, 3 ou ‘A’, ‘B’, ‘C’)
- Nombreuses valeurs possibles
- Besoin de clarté visuelle