Sentencia APPEND en ABAP: Añadir filas a tablas internas

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

La sentencia APPEND se utiliza en ABAP para añadir una o más filas nuevas siempre al final físico de una tabla interna. Incrementa el número de filas de la tabla.

Diferencia importante con INSERT

  • APPEND: Añade siempre al final. Principalmente para tablas estándar.
  • INSERT: Puede insertar en una posición de índice específica (en tablas estándar con INDEX) o inserta ordenado según clave o hash (en tablas Sorted/Hashed con INTO TABLE).

Sintaxis

Hay tres variantes principales:

  1. Añadir una fila desde un área de trabajo (<wa>):
    APPEND <wa> TO <tabla_interna> [ASSIGNING <field_symbol> | REFERENCE INTO <data_reference>].
    " El adicional [SORTED BY <componente>] es obsoleto y no debe usarse.
  2. Añadir una fila inicial:
    APPEND INITIAL LINE TO <tabla_interna> [ASSIGNING <field_symbol> | REFERENCE INTO <data_reference>].
  3. Añadir múltiples filas de otra tabla (<tabla_fuente>):
    APPEND LINES OF <tabla_fuente> [FROM <indice1>] [TO <indice2>] TO <tabla_interna>
    [KEEPING DUPLICATES | DELETING DUPLICATES]. " Relevante para Sorted/Hashed

Componentes

  • <wa>: Un área de trabajo (estructura) que debe ser compatible con el tipo de fila de <tabla_interna>. Su contenido se copia a la nueva fila.
  • INITIAL LINE: Añade una fila donde todos los componentes tienen su valor inicial según el tipo (p.ej. 0 para números, espacios para tipo C, cadena vacía para tipo STRING).
  • LINES OF <tabla_fuente>: Copia filas de la <tabla_fuente> y las añade al final de <tabla_interna>. Opcionalmente con FROM <indice1> y TO <indice2> se puede restringir el rango de filas a copiar de la tabla fuente.
  • TO <tabla_interna>: La tabla destino a la que se añade.
  • ASSIGNING <field_symbol> / REFERENCE INTO <data_reference>: (Solo con APPEND <wa> / INITIAL LINE) Muy útil. Establece un field-symbol o referencia de datos que apunta directamente a la fila recién añadida. Esto evita un READ TABLE posterior si quieres editar la nueva fila directamente.
  • KEEPING DUPLICATES / DELETING DUPLICATES: (Solo con APPEND LINES OF) Estos adicionales afectan el comportamiento cuando intentas añadir filas a una tabla ordenada o hash (lo cual es generalmente problemático, ver abajo). Se refieren a la unicidad de la clave de tabla. Para tablas estándar no tienen efecto en duplicados de contenido.

Funcionamiento / Comportamiento según tipo de tabla

El comportamiento y la permisibilidad de APPEND dependen fuertemente del tipo de tabla interna:

1. Tablas estándar (STANDARD TABLE)

  • APPEND añade la(s) fila(s) siempre al final físico de la tabla. El orden de las filas existentes no cambia.
  • Este es el caso de uso típico y recomendado para APPEND.
  • El campo del sistema sy-tabix contiene tras la operación el índice de la (última) fila añadida. sy-subrc normalmente es 0.

2. Tablas ordenadas (SORTED TABLE)

  • APPEND <wa> o APPEND INITIAL LINE está fundamentalmente prohibido aquí, ya que añadir al final violaría el orden de clasificación garantizado de la tabla. Un intento provoca un error en tiempo de ejecución (dump).
  • Excepción: APPEND LINES OF puede funcionar bajo ciertas circunstancias, si las filas a añadir casualmente no violan el orden de clasificación o si los duplicados se manejan según la clave (con KEEPING/DELETING DUPLICATES). Sin embargo, no es la forma correcta de añadir datos a tablas ordenadas.
  • Sentencia correcta para tablas ordenadas: INSERT <wa> INTO TABLE <tabla>.

3. Tablas hash (HASHED TABLE)

  • APPEND <wa> o APPEND INITIAL LINE está estrictamente prohibido aquí. La posición de una fila en una tabla hash se determina por el valor hash de la clave única, no por el orden de inserción. Un intento de APPEND provoca un error en tiempo de ejecución.
  • Excepción: APPEND LINES OF puede usarse teóricamente, pero provoca un error en tiempo de ejecución en cada violación de la clave única (a menos que la fuente ya contenía duplicados y se usó DELETING DUPLICATES, lo cual principalmente limpia la fuente).
  • Sentencia correcta para tablas hash: INSERT <wa> INTO TABLE <tabla>.

Campos del sistema

  • sy-subrc: Con APPEND en tablas estándar normalmente 0. Con APPEND LINES OF en Sorted/Hashed puede establecerse a 4 si se manejaron duplicados según los adicionales, pero normalmente las violaciones de clave aquí resultan en errores en tiempo de ejecución.
  • sy-tabix: Tras APPEND en una tabla estándar contiene sy-tabix el índice de fila de la (última) fila recién añadida.

Ejemplos (enfoque en tablas estándar)

TYPES: BEGIN OF ty_component,
comp_id TYPE i,
comp_text TYPE string,
END OF ty_component.
DATA: gt_components TYPE STANDARD TABLE OF ty_component WITH EMPTY KEY,
gs_component TYPE ty_component.
FIELD-SYMBOLS: <fs_component> LIKE LINE OF gt_components.
" 1. Añadir área de trabajo
gs_component = VALUE #( comp_id = 10 comp_text = 'Componente A' ).
APPEND gs_component TO gt_components.
gs_component = VALUE #( comp_id = 20 comp_text = 'Componente B' ).
APPEND gs_component TO gt_components.
WRITE: / 'Tras APPEND <wa>: ', lines( gt_components ), 'filas.'.
" 2. Añadir fila inicial y editar directamente con ASSIGNING
APPEND INITIAL LINE TO gt_components ASSIGNING <fs_component>.
IF <fs_component> IS ASSIGNED.
<fs_component>-comp_id = 30.
<fs_component>-comp_text = 'Componente C (inicial)'.
WRITE: / 'Última fila (ASSIGNING):', <fs_component>-comp_text.
ELSE.
WRITE: / 'Error en APPEND ASSIGNING'.
ENDIF.
" 3. Añadir filas de otra tabla
DATA gt_source LIKE gt_components.
APPEND VALUE #( comp_id = 40 comp_text = 'Componente D' ) TO gt_source.
APPEND VALUE #( comp_id = 50 comp_text = 'Componente E' ) TO gt_source.
APPEND LINES OF gt_source TO gt_components.
WRITE: / 'Tras APPEND LINES OF: ', lines( gt_components ), 'filas.'.
" Mostrar toda la tabla
cl_demo_output=>display( gt_components ).

Notas importantes / Mejores prácticas

  • Usa APPEND para añadir filas rápida y fácilmente al final de tablas estándar.
  • Para tablas ordenadas y hash usa INSERT ... INTO TABLE ... para asegurar la consistencia de la tabla y evitar errores en tiempo de ejecución.
  • El adicional ASSIGNING <field_symbol> (o REFERENCE INTO) con APPEND <wa> / INITIAL LINE es muy eficiente si quieres editar la fila recién añadida directamente después.
  • Para recorrer todas las filas de una tabla, usa LOOP AT.
  • Para ordenar una tabla tras llenarla, usa SORT.