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 :
- Conversion majuscules/minuscules : Convertit tout le texte en majuscules ou minuscules.
- 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 :
-
Changer la casse :
TRANSLATE <variable> TO UPPER CASE.TRANSLATE <variable> TO LOWER CASE. -
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 caractereXparY, remplace le caractereAparB, 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-1dans<regle>, il est remplace dans<variable>par le caractere a la position paire2ndans<regle>. - Si un caractere de
<variable>n’apparait pas a une position impaire dans<regle>, il reste inchange.
- La regle est interpretee comme
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 )etto_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 MAJUSCULESMinuscules: uniquement majusculesLower (Fonction): uniquement majuscules3. 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: A1B2CCode 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
TRANSLATEmodifie la variable directement. Si la valeur originale est necessaire, elle doit etre sauvegardee au prealable.TRANSLATE ... USINGest 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 surtoutreplace()sont generalement le meilleur choix. TRANSLATEpeut cependant toujours etre utile pour des conversions de casse simples et performantes ou des remplacements multiples 1-vers-1 de caracteres.