ABAP CONDENSE: Eliminar espacios – ¡Pero cuidado con los espacios finales!

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

La instrucción CONDENSE sirve para eliminar espacios superfluos de un objeto de datos de tipo carácter (generalmente de tipo C - cadena de longitud fija). Modifica el contenido de la variable especificada directamente en el lugar (“in place”).

Concretamente, CONDENSE realiza las siguientes acciones en su comportamiento por defecto:

  1. Elimina todos los espacios iniciales.
  2. Reemplaza secuencias de múltiples espacios internos (espacios entre caracteres visibles) por exactamente un solo espacio.

Importante: ¡Por defecto, CONDENSE no elimina espacios finales al final de la cadena!

Sintaxis

CONDENSE <variable> [NO-GAPS].
  • <variable>: El nombre de la variable de tipo carácter (generalmente tipo C) cuyo contenido se condensará.
  • [NO-GAPS] (Opcional): Un agregado que cambia el comportamiento: Cuando se especifica NO-GAPS, todos los espacios (iniciales, internos y finales) se eliminan completamente de la variable.

Funcionamiento en detalle

Sin NO-GAPS (CONDENSE <variable>.)

  • " Hola Mundo " se convierte en "Hola Mundo " (si <variable> es p.ej. C(30). Los espacios finales hasta la longitud del campo permanecen.)
  • " " se convierte en " " (solo espacios, se rellena a la izquierda con espacios hasta la longitud del campo)
  • " ABC " se convierte en "ABC "
  • "A B C" se convierte en "A B C "

Con NO-GAPS (CONDENSE <variable> NO-GAPS.)

  • " Hola Mundo " se convierte en "HolaMundo " (resto rellenado con espacios)
  • " " se convierte en " " (campo vacío)
  • " ABC " se convierte en "ABC "
  • "A B C" se convierte en "ABC "

Aplicabilidad (Tipo C vs. STRING)

Tipo C (Cadena de longitud fija): Este es el caso de uso principal para CONDENSE. Los campos tipo C a menudo se rellenan con espacios a la derecha después de asignaciones o pueden contener espacios iniciales/múltiples internos por procesamiento. Tipo STRING (Cadena de longitud variable): CONDENSE también puede aplicarse a strings.

  • El CONDENSE estándar elimina espacios iniciales y reduce múltiples espacios internos a uno. Los espacios finales que son parte del valor del string se conservan.
  • CONDENSE ... NO-GAPS elimina todos los espacios del string.
  • Para strings a menudo hay alternativas más específicas y modernas como SHIFT ... DELETING LEADING/TRAILING space., REPLACE o String Templates/funciones que ofrecen más control.

Ejemplos

1. CONDENSE estándar con Tipo C

DATA text_c TYPE c LENGTH 40 VALUE ' Primera Parte segunda Parte '.
WRITE: / 'Tipo C Antes :', |'{ text_c }'|.
CONDENSE text_c.
WRITE: / 'Tipo C Después:', |'{ text_c }'|.

Salida:

Tipo C Antes : '{ Primera Parte segunda Parte }'
Tipo C Después: '{Primera Parte segunda Parte }'

(Espacios iniciales eliminados, internos reducidos a 1, espacios finales permanecen hasta longitud 40).

2. CONDENSE con NO-GAPS en Tipo C

DATA text_c_ng TYPE c LENGTH 40 VALUE ' Primera Parte segunda Parte '.
WRITE: / 'Tipo C NG Antes :', |'{ text_c_ng }'|.
CONDENSE text_c_ng NO-GAPS.
WRITE: / 'Tipo C NG Después:', |'{ text_c_ng }'|.

Salida:

Tipo C NG Antes : '{ Primera Parte segunda Parte }'
Tipo C NG Después: '{PrimeraPartesegundaParte }'

(Todos los espacios eliminados, el resto está alineado a la izquierda).

3. CONDENSE con Tipo STRING

DATA text_s TYPE string VALUE ` String con mucho espacio `.
WRITE: / 'String Antes :', |'{ text_s }'|.
CONDENSE text_s.
WRITE: / 'String Después:', |'{ text_s }'|. " Iniciales eliminados, internos reducidos, finales permanecen
DATA text_s_ng TYPE string VALUE ` String con mucho espacio `.
CONDENSE text_s_ng NO-GAPS.
WRITE: / 'String NG Desp:', |'{ text_s_ng }'|. " Todos los espacios eliminados

Salida:

String Antes : '{ String con mucho espacio }'
String Después: '{String con mucho espacio }'
String NG Desp: '{Stringconmuchoespacio}'

Notas importantes / Mejores prácticas

  • CONDENSE modifica la variable pasada directamente. Guarde el valor original previamente si aún lo necesita.
  • El error más común es asumir que CONDENSE elimina espacios finales. Esto es incorrecto en el comportamiento estándar. Solo CONDENSE ... NO-GAPS elimina todos los espacios.
  • Para eliminar solo espacios finales en strings se usa SHIFT <str> RIGHT DELETING TRAILING space. o para tipo C p.ej. la asignación a un string y de vuelta o módulos de función especiales.
  • CONDENSE es útil para limpiar campos de entrada o datos de fuentes externas que podrían contener espacios no deseados.
  • Para manipulaciones de string complejas, a menudo las funciones de string modernas u operadores son la mejor opción que CONDENSE.