SAP ABAP: rellenar tablas internas
En las tablas internas, el llenado incluye funciones como selección, inserción y anexión. Este capítulo se centra en las declaraciones INSERT y APPEND.
INSERTAR declaración
La instrucción INSERT se utiliza para insertar una sola línea o un grupo de líneas en una tabla interna.
A continuación se muestra la sintaxis para agregar una sola línea a una tabla interna:
INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.
En esta sintaxis, la instrucción INSERT inserta una nueva línea en la tabla interna internal_tab. Se puede insertar una nueva línea usando la expresión work_area_itab INTO antes del parámetro internal_tab. Cuando se usa la expresión work_area_itab INTO, la nueva línea se toma del área de trabajo work_area_itab y se inserta en la tabla internal_tab. Sin embargo, cuando la expresión work_area_itab INTO no se usa para insertar una línea, la línea se toma de la línea de encabezado de la tabla internal_tab.
Cuando se inserta una nueva línea en una tabla interna utilizando la cláusula INDEX, el número de índice de las líneas después de la línea insertada se incrementa en 1. Si una tabla interna contiene <index_num> - 1 líneas, la nueva línea se agrega final de la mesa. Cuando el sistema SAP agrega con éxito una línea a una tabla interna, la variable SY-SUBRC se establece en 0.
Ejemplo
A continuación se muestra un programa de muestra que utiliza la instrucción de inserción.
REPORT ZCUSLIST1.
DATA: BEGIN OF itable1 OCCURS 4,
F1 LIKE SY-INDEX,
END OF itable1.
DO 4 TIMES.
itable1-F1 = sy-index.
APPEND itable1.
ENDDO.
itable1-F1 = -96.
INSERT itable1 INDEX 2.
LOOP AT itable1.
Write / itable1-F1.
ENDLOOP.
LOOP AT itable1 Where F1 ≥ 3.
itable1-F1 = -78.
INSERT itable1.
ENDLOOP.
Skip.
LOOP AT itable1.
Write / itable1-F1.
ENDLOOP.
El código anterior produce la siguiente salida:
1
96-
2
3
4
1
96-
2
78-
3
78-
4
En el ejemplo anterior, el bucle DO agrega 4 filas que contienen los números del 1 al 4. Al componente de línea de encabezado itable1-F1 se le ha asignado un valor de -96. Insertar instrucción inserta la línea de encabezado como una nueva fila en el cuerpo antes de la fila 3. La fila 3 existente se convierte en la fila 4 después de la inserción. La instrucción LOOP AT recupera aquellas filas de la tabla interna que tienen un valor F1 mayor o igual a 3. Antes de cada fila, la instrucción Insert inserta una nueva fila desde la línea de encabezado de la misma. Antes de la inserción, el componente F1 se ha cambiado para contener -78.
Después de que se ejecuta cada instrucción de inserción, el sistema vuelve a indexar todas las filas debajo de la insertada. Esto introduce una sobrecarga cuando inserta filas cerca de la parte superior de una tabla interna grande. Si necesita insertar un bloque de filas en una tabla interna grande, prepare otra tabla con las filas que desee insertar y utilice insertar líneas en su lugar.
Al insertar una nueva fila dentro de itable1 dentro de un bucle en itable1, no afecta la tabla interna instantáneamente. De hecho, se hace efectivo en la siguiente pasada de bucle. Al insertar una fila después de la fila actual, la tabla se vuelve a indexar en ENDLOOP. El sy-tabix se incrementa y el siguiente ciclo procesa la fila apuntada por sy-tabix. Por ejemplo, si está en la segunda pasada de bucle e inserta un registro antes de la fila 3. Cuando se ejecuta endloop, la nueva fila se convierte en la fila 3 y la antigua fila 3 se convierte en la fila 4 y así sucesivamente. Sy-tabix se incrementa en 1 y el siguiente paso de bucle procesa el registro recién insertado.
Declaración de APPEND
La instrucción APPEND se usa para agregar una sola fila o línea a una tabla interna existente. Esta declaración copia una sola línea de un área de trabajo y la inserta después de la última línea existente en una tabla interna. El área de trabajo puede ser una línea de encabezado o cualquier otra cadena de campo con la misma estructura que una línea de una tabla interna. A continuación se muestra la sintaxis de la instrucción APPEND que se usa para agregar una sola línea en una tabla interna:
APPEND <record_for_itab> TO <internal_tab>.
En esta sintaxis, la expresión <record_for_itab> puede ser representada por el área de trabajo <work_area_itab>, que es convertible a un tipo de línea o por la cláusula INITIAL LINE. Si el usuario utiliza un área de trabajo <work_area_itab>, el sistema SAP agrega una nueva línea a la tabla interna <internal_tab> y la llena con el contenido del área de trabajo. La cláusula INITIAL LINE agrega una línea en blanco que contiene el valor inicial para cada campo de la estructura de la tabla. Después de cada instrucción APPEND, la variable SY-TABIX contiene el número de índice de la línea adjunta.
Agregar líneas a tablas estándar y ordenadas con una clave no única funciona independientemente de si las líneas con la misma clave ya existen en la tabla. En otras palabras, pueden producirse entradas duplicadas. Sin embargo, se produce un error en tiempo de ejecución si el usuario intenta agregar una entrada duplicada a una tabla ordenada con una clave única o si el usuario viola el orden de clasificación de una tabla ordenada añadiéndole las líneas.
Ejemplo
REPORT ZCUSLIST1.
DATA: BEGIN OF linv Occurs 0,
Name(20) TYPE C,
ID_Number TYPE I,
END OF linv.
DATA table1 LIKE TABLE OF linv.
linv-Name = 'Melissa'.
linv-ID_Number = 105467.
APPEND linv TO table1.
LOOP AT table1 INTO linv.
Write: / linv-name, linv-ID_Number.
ENDLOOP.
El código anterior produce la siguiente salida:
Melissa 105467