La instrucción CONCATENATE sirve para unir el contenido de dos o más objetos de datos de tipo carácter (variables, literales) en una única cadena de caracteres y almacenar el resultado en una variable destino.
Sintaxis
CONCATENATE <fuente1> <fuente2> ... <fuenteN> INTO <variable_destino> [SEPARATED BY <separador>] [RESPECTING BLANKS]. " [CONDENSING]. " Obsoleto, ¡no usar!<fuente1> <fuente2> ... <fuenteN>: Estos son los objetos de datos (variables, constantes o literales) cuyos contenidos se concatenarán uno tras otro. Normalmente deberían ser de tipoSTRING,C,N,DoT. Otros tipos (p.ej. numéricos) generalmente se convierten a su representación de cadena antes de concatenar.INTO <variable_destino>: Esta es la variable que recibirá el resultado de la concatenación. El contenido anterior de esta variable se sobrescribe.- Idealmente
<variable_destino>es de tipoSTRING, ya que la longitud se ajusta dinámicamente. - Si
<variable_destino>es de tipoC(cadena de longitud fija) y el resultado de la concatenación es más largo que la longitud definida de la variable destino, el resultado se truncará por la derecha.
- Idealmente
SEPARATED BY <separador>(Opcional): Aquí se puede especificar un separador (p.ej. un espaciospace, una coma',', un guión'-') que se insertará entre los elementos fuente individuales.<separador>es también un objeto de datos de tipo carácter.RESPECTING BLANKS(Opcional): Este agregado influye en cómo se tratan los espacios finales de campos fuente de longitud fija (tipoC,N,D,T).- Sin
RESPECTING BLANKS(comportamiento por defecto): Los espacios finales en campos de longitud fija se eliminan antes de concatenar. - Con
RESPECTING BLANKS: Los espacios finales en campos de longitud fija se conservan. - Importante: Para campos fuente de tipo
STRING, los espacios finales siempre se respetan, independientemente de este agregado. Por lo tanto,RESPECTING BLANKSes principalmente relevante cuando se quiere conservar explícitamente la longitud original de campos tipo C incluyendo sus espacios (y el destino quizás también es tipo C).
- Sin
Alternativas modernas (¡Preferidas!)
En ABAP moderno (desde la versión 7.40 en adelante) hay alternativas mucho más flexibles y a menudo más legibles que CONCATENATE:
- String Templates (Literales con
|...|): Permiten incrustar directamente variables y expresiones en una cadena.DATA(lv_name) = 'Mundo'.DATA(lv_greeting) = |Hola { lv_name }! Son las { sy-timlo }.|. - Operador de concatenación (
&&): Conecta dos cadenas directamente.DATA(lv_part1) = 'Parte 1'.DATA(lv_part2) = 'Parte 2'.DATA(lv_combined) = lv_part1 && ' y ' && lv_part2.
¡Se recomienda encarecidamente usar String Templates o el operador && para nuevos desarrollos! Sin embargo, CONCATENATE es importante para la comprensión y el mantenimiento de código antiguo.
Ejemplos de CONCATENATE
1. Concatenación simple
DATA: firstname TYPE string VALUE 'Ana', lastname TYPE string VALUE 'García', fullname TYPE string.
CONCATENATE firstname lastname INTO fullname.WRITE: / fullname. " Salida: AnaGarcía2. Concatenación con separador
DATA: city TYPE string VALUE 'Madrid', zip_code TYPE string VALUE '28001', address TYPE string.
" Separar con espacioCONCATENATE zip_code city INTO address SEPARATED BY space.WRITE: / address. " Salida: 28001 Madrid
" Separar con coma y espacioCONCATENATE city zip_code INTO address SEPARATED BY ', '.WRITE: / address. " Salida: Madrid, 280013. Concatenación de diferentes tipos de datos
DATA: item_count TYPE i VALUE 5, item_desc TYPE string VALUE 'Manzanas', output_str TYPE string.
CONCATENATE item_count item_desc 'disponibles' INTO output_str SEPARATED BY space.WRITE: / output_str. " Salida: 5 Manzanas disponibles(El número 5 se convierte automáticamente a cadena '5').
4. Manejo de espacios en Tipo C (con y sin RESPECTING BLANKS)
DATA: field_c1 TYPE c LENGTH 10 VALUE 'Texto Uno', " Tiene 1 espacio al final field_c2 TYPE c LENGTH 10 VALUE 'Dos'. " Tiene 6 espacios al final target_str TYPE string.
" Por defecto: Los espacios finales de field_c1 y field_c2 se eliminanCONCATENATE field_c1 field_c2 INTO target_str SEPARATED BY '|'.WRITE: / target_str. " Salida: Texto Uno|Dos
" Con RESPECTING BLANKS: Los espacios finales se conservanCONCATENATE field_c1 field_c2 INTO target_str SEPARATED BY '|' RESPECTING BLANKS.WRITE: / target_str. " Salida: Texto Uno |Dos |5. Comparación con String Template
" Equivalente al Ejemplo 2address = |{ zip_code } { city }|.WRITE: / address. " Salida: 28001 Madrid
" Equivalente al Ejemplo 3output_str = |{ item_count } { item_desc } disponibles|.WRITE: / output_str. " Salida: 5 Manzanas disponiblesNotas importantes / Mejores prácticas
CONCATENATEes el método clásico para concatenación de strings en ABAP.- Sea consciente del comportamiento por defecto respecto a los espacios finales en campos de longitud fija (como tipo C).
- Use idealmente
STRINGcomo tipo destino para evitar truncamiento. - Prefiera String Templates (
|...|) o el operador de concatenación (&&) para código nuevo, ya que son generalmente más legibles, flexibles y menos propensos a errores.