1- Qué son las Tablas Internas?
Es un objeto que permite guardar en memoria una gran cantidad de registros de datos con la misma estructura.
Usos: Para almacenar temporalmente los datos de una base de datos; para estructurar y formatear datos para su salida del programa; para formatear datos para utilizarse por otros servicios.
2- Cómo se Declara una Tabla Interna?
DATA: BEGIN OF <tabla> OCCURS <n>,
<def.campo>,
END OF <tabla>.
n especifica la Cantidad de Líneas en memoria mas una Línea de Cabecera que contendrá el registro en proceso. Por lo general se utiliza n = 0 (cero) ya que ésto permite trabajar con tablas de gran cantidad de registros.
DATA: BEGIN OF ti_proveedores OCCURS 0,
nombre(30) TYPE c,
apellido(30) TYPE c,
END OF ti_proveedores.
Otra forma sería así:
DATA: BEGIN OF wa_proveedores,
nombre(30) TYPE c,
apellido(30) TYPE c,
END OF wa_proveedores.
DATA: ti_proveedores LIKE STANDARD TABLE OF wa_proveedores.
Y otra forma especial, donde no se declararía una Línea Adicional (área de trabajo) sería:
DATA: ti_vuelos LIKE STANDARD TABLE OF s_flight WITH HEADER LINE.
En este caso ti_vuelos tendrá la misma estructura que la Tabla del Sistema s_flight y la cabecera o área de trabajo sería la propia tabla interna.
Una forma de declarar un área de trabajo es utilizando la cláusula LIKE LINE OF.
DATA: wa_proveedores LIKE LINE OF ti_proveedores.
3- Llenado de una Tabla Interna
Con una sentencia APPEND wa_tabla TO ti_tabla se logra añadir un registro en la última posición de ti_tabla con los valores que se tengan en el área de trabajo wa_tabla.
Para llenar una tabla interna con el contenido de una Base de Datos se utiliza la sentencia SELECT.
4-Ordenamiento de una Tabla Interna
SORT ti_proveedores BY dni DESCENDING/ASCENDING.
Con esta sentencia se ordena la tabla ti_proveedores por el contenido del campo dni en forma Descendente o Ascendente.
5- Procesamiento de una Tabla Interna
LOOP AT ti_proveedores INTO wa_proveedores
WHERE NOT nombre IS INITIAL.
.....
.....
.....
ENDLOOP.
6- Lectura de una Tabla Interna
Para leer un registro de una tabla interna que cumpla con una condición específica se utiliza la sentencia READ TABLE.
READ TABLE ti_proveedores INTO wa_proveedores
WITH KEY nombre = 'Ariel'.
Para leer un registro en una posición determinada de una tabla interna se utiliza la cláusula INDEX.
READ TABLE ti_proveedores INTO wa_proveedores INDEX 5.
NOTA: El agregado de la cláusula BINARY SEARCH hace que la búsqueda sea más eficiente.
7- Modificando una Tabla Interna
MODIFY ti_proveedores FROM wa_proveedores INDEX 4.
En este caso el contenido del área de trabajo wa_proveedores será transferido a la ocurrencia 4 de la tabla ti_proveedores.
INSERT wa_proveedores INTO ti_proveedores INDEX 2.
En este caso el registro contenido en el área de trabajo wa_proveedores se ubicará en la posición 2 de la tabla interna ti_proveedores, desplazando al registro que podía estar en esa posición y a todos los posteriores.
DELETE ti_proveedores
WHERE dni = '20857492'.
En este caso se borrará el primer registro de la tabla interna ti_proveedores cuyo campo dni sea 20857492.
REFRESH ti_proveedores.
En este caso se inicializará toda la tabla interna ti_proveedores.
DESCRIBE TABLE ti_proveedores LINES v_lineas.
Esta sentencia dejará en la variable de tipo i la cantidad de entradas de la tabla interna ti_proveedores.
FREE ti_proveedores.
Esta sentencia libera el área ocupada por la tabla interna ti_proveedores.