ABAP CONCATENATE: Concatenar cadenas – Sintaxis y alternativas

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

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 tipo STRING, C, N, D o T. 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 tipo STRING, ya que la longitud se ajusta dinámicamente.
    • Si <variable_destino> es de tipo C (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.
  • SEPARATED BY <separador> (Opcional): Aquí se puede especificar un separador (p.ej. un espacio space, 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 (tipo C, 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 BLANKS es 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).

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:

  1. 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 }.|.
  2. 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ía

2. Concatenación con separador

DATA: city TYPE string VALUE 'Madrid',
zip_code TYPE string VALUE '28001',
address TYPE string.
" Separar con espacio
CONCATENATE zip_code city INTO address SEPARATED BY space.
WRITE: / address. " Salida: 28001 Madrid
" Separar con coma y espacio
CONCATENATE city zip_code INTO address SEPARATED BY ', '.
WRITE: / address. " Salida: Madrid, 28001

3. 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 eliminan
CONCATENATE field_c1 field_c2 INTO target_str SEPARATED BY '|'.
WRITE: / target_str. " Salida: Texto Uno|Dos
" Con RESPECTING BLANKS: Los espacios finales se conservan
CONCATENATE 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 2
address = |{ zip_code } { city }|.
WRITE: / address. " Salida: 28001 Madrid
" Equivalente al Ejemplo 3
output_str = |{ item_count } { item_desc } disponibles|.
WRITE: / output_str. " Salida: 5 Manzanas disponibles

Notas importantes / Mejores prácticas

  • CONCATENATE es 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 STRING como 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.