Analyse et test du code
Utilisation correcte des types de données et des conversions de types
Traitement des zones de caractères
Utilisation du Pushdown de code dans ABAP SQL
Amélioration de la performance des tables internes
Implémentation des contrôles des autorisations
Conception d'un code orienté objet efficace
Définition et utilisation des classes d'exception
Ajout de documentation au code ABAP

Utilisation des expressions dans ABAP SQL

Objective

After completing this lesson, you will be able to utilisez des expressions simples dans ABAP SQL.

Littéraux

Littéraux et constantes dans ABAP SQL

Les expressions les plus simples sont littérales. Tout comme ABAP lui-même, ABAP SQL connaît deux types de littéraux : les littéraux textuels, indiqués entre guillemets simples, et les littéraux numériques, qui peuvent être des nombres entiers positifs ou négatifs. Le type de littéraux dans ABAP SQL est le même que dans ABAP : les littéraux textuels sont de type C et les littéraux numériques sont de type I.

Dans l'exemple, le premier élément de la liste de zones est un littéral textuel, tandis que les deuxième et troisième éléments sont des littéraux numériques, l'un avec une valeur positive et l'autre avec une valeur négative.

Remarque

Les littéraux de chaîne, indiqués entre guillemets arrière, ne sont pas disponibles dans ABAP SQL.

Au lieu d'utiliser des littéraux directement, il est recommandé de définir des constantes et de les utiliser dans votre instruction ABAP SQL. Cela améliore la lisibilité et vous donne accès à plus de types que seulement C et I. Lorsque vous utilisez une constante dans une instruction ABAP SQL, le préfixe @ est obligatoire.

Dans l'exemple, le quatrième élément de la liste d'éléments est une constante de nom C_NUMBER de type I et de valeur 1234.

Essayer: Littéraux

  1. Créez une nouvelle classe globale qui implémente l'interface IF_OO_ADT_CLASSRUN.
  2. Copiez l'extrait de code suivant dans la partie implémentation de la méthode if_oo_adt_classrun~main( ) :
    Code Snippet
    123456789101112131415161718
    CONSTANTS c_number TYPE i VALUE 1234. SELECT FROM /dmo/carrier FIELDS 'Hello' AS Character, " Type c 1 AS Integer1, " Type i -1 AS Integer2, " Type i @c_number AS constant " Type i (same as constant) INTO TABLE @DATA(result). out->write( EXPORTING data = result name = 'RESULT' ).
  3. Sélectionnez CTRL + F3 pour activer la classe et F9 pour l'exécuter en tant qu'application de console.
  4. Analysez la sortie de la console.
  5. Déboguez l'exécution de la méthode if_oo_adt_classrun~main( ) et analysez le type des colonnes CHARACTER, INTEGER1 et INTEGER2 de la table interne RESULT.
  6. Ajoutez plus de littéraux à la liste FIELDS pour vous familiariser avec la syntaxe.

L'expression CAST

Contrairement à ABAP lui-même, ABAP SQL ne connaît pas les conversions de type implicites. L'expression CAST de CDS vous permet d'implémenter explicitement des conversions de types.

L'opérande pour une conversion de type ne peut pas seulement être un littéral ou une zone de la source de données. Tous les types d'autres expressions sont possibles comme les expressions arithmétiques, les fonctions prédéfinies et bien d'autres.

Vous pouvez indiquer la plupart des types de dictionnaire prédéfinis comme types cibles, par exemple INT4, CHAR, DEC, FLTP, DATS, etc. Dans ABAP SQL, il n'est pas possible d'utiliser des éléments de données du Dictionnaire ABAP comme types cibles.

Remarque

Il existe des restrictions concernant la combinaison du type de source et du type cible. Certaines combinaisons ne sont pas du tout prises en charge. D'autres fonctionnent uniquement avec des limitations et peuvent entraîner des erreurs d'exécution. Vous trouverez une matrice détaillée dans la documentation du langage ABAP.

Types prédéfinis dans le Dictionnaire ABAP

Lors de la définition de types dans le Dictionnaire ABAP, par exemple un élément de données, un ensemble spécifique de types prédéfinis est utilisé. Lorsqu'un tel type de Dictionnaire ABAP est utilisé pour saisir un objet de données dans ABAP, le type de Dictionnaire ABAP est mappé sur un type ABAP prédéfini spécifique. Le type de dictionnaire CHAR, par exemple, est mappé sur le type ABAP C, le type INT4 sur le type I, le type FLTP sur le type F, le type DEC sur P, etc.

Certains types de Dictionnaire ABAP n'ont pas de contrepartie directe dans ABAP. Le type de dictionnaire MANDT, par exemple, est techniquement identique au type CHAR(3), mais a une signification particulière lorsqu'il est utilisé pour les zones de table de base de données. Dans ABAP, lorsque cette signification particulière n'est pas requise, le type MANDT est mappé sur le type C LENGTH 3. De même, les types de Dictionnaire UNIT et CUKY sont mappés sur le type ABAP C et QUAN et CURR sur le type ABAP P.

La longueur des types de dictionnaire DEC, QUAN et CURR est indiquée comme nombre de chiffres. La longueur pour le type ABAP P est indiquée comme nombre d'octets. N octets correspondent à 2 *n - 1 chiffres.

Exemples d'expressions CAST

Dans cet exemple, le même littéral de texte est converti en différents types de cible compatibles. Soyez attentif aux faits suivants :

  • La conversion en types numériques (INT4, DEC, FLTP) entraîne des erreurs d'exécution si le littéral source contient des caractères non numériques.
  • La conversion au type DATS ne contrôle pas si les 8 chiffres forment une date valide.
  • Le type CHAR( 4 ) est un type compatible mais la conversion entraîne une perte d'informations.

Remarque

Le fait qu'une seule décimale soit affichée dans la colonne DEC_10_2 est un artefact de l'interface utilisateur.

Essayer : l'expression CAST

  1. Créez une nouvelle classe globale qui implémente l'interface IF_OO_ADT_CLASSRUN.
  2. Copiez l'extrait de code suivant dans la partie implémentation de la méthode if_oo_adt_classrun~main( ) :
    Code Snippet
    1234567891011121314151617181920
    SELECT FROM /dmo/carrier FIELDS '19891109' AS char_8, CAST( '19891109' AS CHAR( 4 ) ) AS char_4, CAST( '19891109' AS NUMC( 8 ) ) AS numc_8, CAST( '19891109' AS INT4 ) AS integer, CAST( '19891109' AS DEC( 10, 2 ) ) AS dec_10_2, CAST( '19891109' AS FLTP ) AS fltp, CAST( '19891109' AS DATS ) AS date INTO TABLE @DATA(result). out->write( EXPORTING data = result name = 'RESULT' ).
  3. Sélectionnez CTRL + F3 pour activer la classe et F9 pour l'exécuter en tant qu'application de console.
  4. Analysez la sortie de la console.
  5. Déboguez l'exécution de la méthode if_oo_adt_classrun~main( ) et analysez le type des différentes colonnes de la table interne RESULT.
  6. Ajoutez d'autres expressions CAST à la liste FIELDS pour vous familiariser avec la syntaxe.

Distinctions CASE

ABAP SQL propose des distinctions de cas que vous pouvez utiliser dans la liste des éléments d'une instruction SELECT et comme opérandes pour d'autres expressions.

Une distinction de cas renvoie exactement une valeur. Cette valeur dépend d'une série de conditions. Une distinction de cas commence toujours par le mot-clé CASE et se termine par le mot-clé END. Le reste dépend du type de distinction de cas.

Une Simple Case Distinction correspond à la structure de contrôle ABAP CASE … ENDCASE. Il compare la valeur d'un opérande à une série d'autres opérandes. Vous pouvez utiliser n'importe quelle expression SQL comme opérande, par exemple des zones de table, des littéraux, des constantes, des variables ABAP, des expressions SQL, etc.

Une distinction de cas complexe, également appelée cas recherché, correspond à la structure de contrôle ABAP IF … ENDIF avec ses parties facultatives ELSEIF et ELSE. Il évalue les conditions SQL après les mots-clés WHEN dans la séquence donnée. La première condition vraie détermine le résultat de l'expression CASE. Si aucune des conditions n'est vraie, le résultat est déterminé par l'option ELSE.

Cet exemple de cas simple utilise le contenu de la zone TITLE pour renvoyer un texte plus long comme zone TITLE_LONG. Lorsque TITLE contient la valeur "Mr.", la colonne TITLE_LONG contient la valeur "Mister". Si TITLE contient "Mrs.", la colonne TITLE_LONG contient "Manques". Pour toute autre valeur dans TITLE, TITLE_LONG contient des espaces.

Cet exemple de cas complexe utilise une série de conditions SQL pour déterminer une valeur pour une nouvelle colonne BOOKING_STATE.

Si la valeur de la colonne SEATS_OCCUPIED est inférieure à la valeur de la colonne SEATS_MAX, la nouvelle colonne renvoie un texte indiquant que plus de sièges sont disponibles. Si ce n'est pas le cas, la condition suivante est contrôlée, etc.

Essayer : distinctions CASE

  1. Créez une nouvelle classe globale qui implémente l'interface IF_OO_ADT_CLASSRUN.
  2. Copiez l'extrait de code suivant dans la partie implémentation de la méthode if_oo_adt_classrun~main( ) :
    Code Snippet
    123456789101112131415161718192021222324252627282930313233343536373839404142
    SELECT FROM /dmo/customer FIELDS customer_id, title, CASE title WHEN 'Mr.' THEN 'Mister' WHEN 'Mrs.' THEN 'Misses' ELSE ' ' END AS title_long WHERE country_code = 'AT' INTO TABLE @DATA(result_simple). out->write( EXPORTING data = result_simple name = 'RESULT_SIMPLE' ). ********************************************************************** SELECT FROM /DMO/flight FIELDS flight_date, seats_max, seats_occupied, CASE WHEN seats_occupied < seats_max THEN 'Seats Avaliable' WHEN seats_occupied = seats_max THEN 'Fully Booked' WHEN seats_occupied > seats_max THEN 'Overbooked!' ELSE 'This is impossible' END AS Booking_State WHERE carrier_id = 'LH' AND connection_id = '0400' INTO TABLE @DATA(result_complex). out->write( EXPORTING data = result_complex name = 'RESULT_COMPLEX' ).
  3. Sélectionnez CTRL + F3 pour activer la classe et F9 pour l'exécuter en tant qu'application de console.
  4. Analysez la sortie de la console.
  5. Jouez avec les expressions CASE pour vous familiariser avec la syntaxe.