Modifier des chaines en ABAP : Comprendre TRANSLATE, mais utiliser les fonctions modernes

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

L’instruction TRANSLATE en ABAP sert a manipuler caractere par caractere le contenu d’un objet de donnees de type caractere (comme STRING, C, N, D, T). Elle a deux fonctions principales :

  1. Conversion majuscules/minuscules : Convertit tout le texte en majuscules ou minuscules.
  2. Remplacement de caracteres : Remplace certains caracteres par d’autres selon une regle de remplacement definie (ajout USING).

Important : TRANSLATE modifie directement la variable specifiee (la modification se fait “in place”).

Syntaxe

Il existe deux formes de base :

  1. Changer la casse :

    TRANSLATE <variable> TO UPPER CASE.
    TRANSLATE <variable> TO LOWER CASE.
  2. Remplacer des caracteres avec une regle :

    TRANSLATE <variable> USING <regle>.

Composants :

  • <variable> : La variable de type caractere dont le contenu doit etre modifie.
  • TO UPPER CASE : Convertit toutes les minuscules (y compris les caracteres specifiques a la langue comme e, a, u, ss en allemand) dans la <variable> en majuscules correspondantes. Les chiffres et caracteres speciaux restent inchanges.
  • TO LOWER CASE : Convertit toutes les majuscules dans la <variable> en minuscules correspondantes. Les chiffres et caracteres speciaux restent inchanges.
  • USING <regle> : Effectue un remplacement caractere par caractere. <regle> est un objet de donnees de type caractere (litteral ou variable) qui contient les regles de remplacement par paires :
    • La regle est interpretee comme XYAB... : Remplace le caractere X par Y, remplace le caractere A par B, et ainsi de suite.
    • La longueur de <regle> doit etre paire.
    • La <variable> est parcourue caractere par caractere. Pour chaque caractere, on verifie s’il apparait a une position impaire (1, 3, 5, …) dans la <regle>.
    • Si le caractere est trouve a la premiere position impaire correspondante 2n-1 dans <regle>, il est remplace dans <variable> par le caractere a la position paire 2n dans <regle>.
    • Si un caractere de <variable> n’apparait pas a une position impaire dans <regle>, il reste inchange.

Alternatives modernes (Preferees !)

Bien que TRANSLATE soit fonctionnel, il existe en ABAP moderne des alternatives souvent preferees qui sont plus flexibles et retournent une nouvelle valeur au lieu de modifier la variable originale :

  • Majuscules/Minuscules : Les fonctions integrees to_upper( text ) et to_lower( text ).
  • Remplacement de caracteres : La fonction integree replace( val = ... sub = ... with = ... ). Cette fonction est plus puissante car elle peut aussi remplacer des chaines entieres (sous-chaines) et pas seulement des caracteres individuels, et offre aussi des options pour les expressions regulieres.

Exemples

1. Convertir en majuscules

DATA text_mixed TYPE string VALUE 'Un Test avec Majuscules et minuscules.'.
WRITE: / 'Original:', text_mixed.
TRANSLATE text_mixed TO UPPER CASE.
WRITE: / 'Majuscules:', text_mixed.
" Alternative moderne :
DATA(upper_result) = to_upper( 'Un Test avec Majuscules et minuscules.' ).
WRITE: / 'Upper (Fonction):', upper_result.

Sortie :

Original: Un Test avec Majuscules et minuscules.
Majuscules: UN TEST AVEC MAJUSCULES ET MINUSCULES.
Upper (Fonction): UN TEST AVEC MAJUSCULES ET MINUSCULES.

2. Convertir en minuscules

DATA text_caps TYPE c LENGTH 30 VALUE 'UNIQUEMENT MAJUSCULES'.
WRITE: / 'Original:', text_caps.
TRANSLATE text_caps TO LOWER CASE.
WRITE: / 'Minuscules:', text_caps.
" Alternative moderne :
DATA(lower_result) = to_lower( 'UNIQUEMENT MAJUSCULES' ).
WRITE: / 'Lower (Fonction):', lower_result.

Sortie :

Original: UNIQUEMENT MAJUSCULES
Minuscules: uniquement majuscules
Lower (Fonction): uniquement majuscules

3. Remplacer des caracteres avec USING (Supprimer les accents)

DATA accent_text TYPE string VALUE 'Cafe resume naive'.
DATA rule TYPE c LENGTH 12 VALUE 'eéaàuùoôiî'. " e->e, a->a, u->u, etc.
WRITE: / 'Original:', accent_text.
TRANSLATE accent_text USING rule.
WRITE: / 'Sans accents:', accent_text.
" Alternative moderne (Exemple pour e) :
DATA(no_accent) = replace( val = 'Cafe resume' sub = 'e' with = 'e' occ = 0 ).
WRITE: / 'Avec replace:', no_accent.

4. Remplacer des caracteres avec USING (Mapping de caracteres)

DATA code TYPE c LENGTH 5 VALUE 'A1B2C'.
DATA map_rule TYPE c LENGTH 10 VALUE 'ABCDE12345'. " A->1, B->2, C->3, D->4, E->5
WRITE: / 'Code Original:', code.
TRANSLATE code USING map_rule.
WRITE: / 'Code Mappe:', code.

Sortie :

Code Original: A1B2C
Code Mappe: 11223

(A devient 1, 1 n’est pas trouve dans la regle (seulement en position paire), B devient 2, 2 non trouve, C devient 3).

Remarques importantes / Bonnes pratiques

  • TRANSLATE modifie la variable directement. Si la valeur originale est necessaire, elle doit etre sauvegardee au prealable.
  • TRANSLATE ... USING est un remplacement pur caractere-vers-caractere. Il ne peut pas chercher des chaines de caracteres ni ajouter/supprimer des caracteres (seulement les remplacer par d’autres).
  • Pour des remplacements plus complexes (mots entiers, motifs via regex) ou quand la valeur originale doit etre preservee, les fonctions modernes to_upper(), to_lower() et surtout replace() sont generalement le meilleur choix.
  • TRANSLATE peut cependant toujours etre utile pour des conversions de casse simples et performantes ou des remplacements multiples 1-vers-1 de caracteres.