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 conINDEX) o inserta ordenado según clave o hash (en tablas Sorted/Hashed conINTO TABLE).
Sintaxis
Hay tres variantes principales:
- 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. - Añadir una fila inicial:
APPEND INITIAL LINE TO <tabla_interna> [ASSIGNING <field_symbol> | REFERENCE INTO <data_reference>].
- 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 conFROM <indice1>yTO <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 conAPPEND <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 unREAD TABLEposterior si quieres editar la nueva fila directamente.KEEPING DUPLICATES/DELETING DUPLICATES: (Solo conAPPEND 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)
APPENDañ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-tabixcontiene tras la operación el índice de la (última) fila añadida.sy-subrcnormalmente es0.
2. Tablas ordenadas (SORTED TABLE)
APPEND <wa>oAPPEND INITIAL LINEestá 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 OFpuede 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 (conKEEPING/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>oAPPEND INITIAL LINEestá 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 deAPPENDprovoca un error en tiempo de ejecución.- Excepción:
APPEND LINES OFpuede 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: ConAPPENDen tablas estándar normalmente0. ConAPPEND LINES OFen Sorted/Hashed puede establecerse a4si se manejaron duplicados según los adicionales, pero normalmente las violaciones de clave aquí resultan en errores en tiempo de ejecución.sy-tabix: TrasAPPENDen una tabla estándar contienesy-tabixel í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 trabajogs_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 ASSIGNINGAPPEND 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 tablaDATA 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 tablacl_demo_output=>display( gt_components ).Notas importantes / Mejores prácticas
- Usa
APPENDpara 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>(oREFERENCE INTO) conAPPEND <wa>/INITIAL LINEes 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.