La sentencia TRANSLATE en ABAP sirve para manipular el contenido de un objeto de datos de tipo caracter (como STRING, C, N, D, T) caracter por caracter. Tiene dos funciones principales:
- Conversion de mayusculas/minusculas: Convierte todo el texto a mayusculas o minusculas.
- Reemplazo de caracteres: Reemplaza ciertos caracteres por otros segun una regla de reemplazo definida (clausula
USING).
Es importante notar que TRANSLATE modifica directamente la variable especificada (el cambio se realiza “in place”).
Sintaxis
Hay dos formas basicas:
-
Cambiar mayusculas/minusculas:
TRANSLATE <variable> TO UPPER CASE.TRANSLATE <variable> TO LOWER CASE. -
Reemplazar caracteres mediante regla:
TRANSLATE <variable> USING <regla>.
Componentes:
<variable>: La variable de tipo caracter cuyo contenido sera modificado.TO UPPER CASE: Convierte todas las minusculas (incluyendo las especificas del idioma como a, o, u) en la<variable>a las mayusculas correspondientes (A, O, U). Digitos y caracteres especiales permanecen sin cambios.TO LOWER CASE: Convierte todas las mayusculas (incluyendo A, O, U) en la<variable>a las minusculas correspondientes (a, o, u). Digitos y caracteres especiales permanecen sin cambios.USING <regla>: Realiza un reemplazo caracter por caracter.<regla>es un objeto de datos de tipo caracter (literal o variable) que contiene las reglas de reemplazo en pares:- La regla se interpreta como
XYAB...: Reemplaza caracterXporY, reemplaza caracterAporB, y asi sucesivamente. - La longitud de
<regla>debe ser par. - La
<variable>se recorre caracter por caracter. Para cada caracter se verifica si aparece en una posicion impar (1, 3, 5, …) en la<regla>. - Si el caracter se encuentra en la primera posicion impar coincidente
2n-1en<regla>, se reemplaza en<variable>por el caracter en la posicion par2nen<regla>. - Si un caracter de
<variable>no aparece en una posicion impar en<regla>, permanece sin cambios.
- La regla se interpreta como
Alternativas modernas (Preferidas!)
Aunque TRANSLATE es funcional, en ABAP moderno a menudo hay alternativas preferidas que son mas flexibles y devuelven un nuevo valor en lugar de cambiar la variable original:
- Mayusculas/Minusculas: Las funciones integradas
to_upper( texto )yto_lower( texto ). - Reemplazo de caracteres: La funcion integrada
replace( val = ... sub = ... with = ... ). Esta funcion es mas potente ya que puede reemplazar cadenas completas (substrings) y no solo caracteres individuales, y tambien ofrece opciones para expresiones regulares.
Ejemplos
1. Convertir a mayusculas
DATA text_mixed TYPE string VALUE 'Una Prueba con Mayusculas y minusculas.'.WRITE: / 'Original:', text_mixed.
TRANSLATE text_mixed TO UPPER CASE.WRITE: / 'Upper Case:', text_mixed.
" Alternativa moderna:DATA(upper_result) = to_upper( 'Una Prueba con Mayusculas y minusculas.' ).WRITE: / 'Upper (Funcion):', upper_result.Salida:
Original: Una Prueba con Mayusculas y minusculas.Upper Case: UNA PRUEBA CON MAYUSCULAS Y MINUSCULAS.Upper (Funcion): UNA PRUEBA CON MAYUSCULAS Y MINUSCULAS.2. Convertir a minusculas
DATA text_caps TYPE c LENGTH 30 VALUE 'SOLO MAYUSCULAS'.WRITE: / 'Original:', text_caps.
TRANSLATE text_caps TO LOWER CASE.WRITE: / 'Lower Case:', text_caps.
" Alternativa moderna:DATA(lower_result) = to_lower( 'SOLO MAYUSCULAS' ).WRITE: / 'Lower (Funcion):', lower_result.Salida:
Original: SOLO MAYUSCULASLower Case: solo mayusculasLower (Funcion): solo mayusculas3. Reemplazar caracteres con USING (eliminar acentos)
DATA accent_text TYPE string VALUE 'Espana con acento'.DATA rule TYPE c LENGTH 12 VALUE 'aAeEiIoOuUnN'. " a->A, e->E, etc.
WRITE: / 'Original:', accent_text.TRANSLATE accent_text USING rule.WRITE: / 'Modificado:', accent_text.
" Alternativa moderna (ejemplo para a):DATA(no_accent) = replace( val = 'Espana' sub = 'a' with = 'A' occ = 0 ).WRITE: / 'Con replace:', no_accent.(Se puede ver que replace es mas flexible y puede reemplazar por multiples caracteres).
4. Reemplazar caracteres con USING (mapeo 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: / 'Codigo Original:', code.TRANSLATE code USING map_rule.WRITE: / 'Codigo Mapeado:', code.Salida:
Codigo Original: A1B2CCodigo Mapeado: 11223(A se convierte en 1, 1 no se encuentra en la regla (solo en posicion par), B se convierte en 2, 2 no se encuentra, C se convierte en 3).
Notas importantes / Mejores practicas
TRANSLATEcambia la variable directamente. Si se necesita el valor original, debe guardarse antes.TRANSLATE ... USINGes un reemplazo puro caracter-a-caracter. No puede buscar cadenas de caracteres ni agregar/eliminar caracteres (solo reemplazar por otros).- Para reemplazos mas complejos (palabras completas, patrones via Regex) o cuando se debe preservar el valor original, las funciones modernas
to_upper(),to_lower()y especialmentereplace()son normalmente la mejor opcion. TRANSLATEsin embargo puede seguir siendo util para conversiones de mayusculas/minusculas simples y eficientes o reemplazos multiples 1-a-1 de caracteres.