Tablas internas: objeto de datos que permite guardar en memoria grandes cantidades de registros de datos con la misma estructura. Las utilizaremos si queremos guardar una colección de registros de datos de la misma estructura en memoria, sin necesidad de acceder continuamente a las bases de datos y poder realizar diversas operaciones con este conjunto de información.
Uso típico: almacenar temporalmente los datos de las bases de datos para un procesamiento futuro, estructurar y formatear datos que se mostrarán como salida del programa, formatear datos para ser usados por otros servicios.
Declaración:
DATA: BEGIN OF <tabla> OCCURS <n>,
<Def.Campo>,
...
END OF <tabla>
Así se define una tabla interna con N lineas en memoria más una linea de cabecera o área de trabajo, la cantidad de líneas que se especifican en OCCURS no limitan al tamaño de la tabla sino la cantidad de registros que se guardarán en memoria simultáneamente. Generalmente en el parámetro OCCURS se especifica la cantidad 0 lo que permite trabajar con tablas de gran cantidad de registros.
Ejemplos:
DATA: BEGIN OF ti_proveedores OCCURS 0,
nombre(30) TYPE c,
apellido(30) TYPE c,
dni(8) TYPE c,
END OF ti_proveedores.
La misma tabla interna de otra forma:
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.
Sin tener que declarar cabeceras:
DATA: ti_vuelos LIKE STANDARD TABLE OF ffly WITH HEADER LINE.
Llenado de una tabla interna:
APPEND TO: se añade un registro a la tabla interna en la última posición con los valores que tengamos en el área de trabajo.
Área de trabajo: cabecera de una tabla interna que tiene el contenido del registro de la tabla interna que está procesando.
Para llenar la tabla interna con el contenido de una base de datos lo hacemos con la sentencia SELECT.
SORT: sentencia utilizada para ordenar una tabla interna.
* Ordeno los proveedores de mayor a menor por dni
SORT ti_proveedores BY dni DESCENDING.
Para ordenar de menor a mayor se usa la cláusula ASCENDING.
Procesamiento de una tabla interna: para recorrer una tabla interna y procesar registro a registro utilizaremos la sentencia LOOP-ENDLOOP
Mediante LIKE LINE OF declaramos una estructura o un area de trabajo. Con formato identico a un registro cualquiera de la tabla origen.
Lectura de una tabla interna, sin necesidad de recorrerla usamos la sentencia READTABLE. Si se encuentra el registro buscado, el SY-SUBRC será 0, caso contrario será distinto de 0. Si se desea leer los datos que se encuentran en una posición particular de la tabla se utilizará la cláusula INDEX.
El agregado de la cláusula BINARY SEARCH en la sentencia READ TABLE hace que la búsqueda sea ampliamente más eficiente.
Modificar una tabla interna, utilizamos la sentencia MODIFY. Si intentamos modificar un registro de una tabla interna y el mismo no existe entonces el SY-SUBRC será distinto de cero.
Para insertar un registro utilizamos INSERT INTO.
Para borrar un registro DELETE.
Para borrar todo el contenido de una tabla interna utilizamos la sentencia REFRESH.
Para saber la cantidad de registros que tiene una tabla interna utilizamos la sentencia DESCRIBE TABLE. Con la claúsula LINES asignamos el valor devuelto por DESCRIBE TABLE a una variable.
Para inicializar el área de trabajo o cabecera de la tabla usamos la sentencia CLEAR nombredelareadetrabajo
Para liberar el espacio ocupado por la tabla en memoria utilizaremos la sentencia FREE nombredelatablainterna.
La sentencia REFRESH borrará el contenido de la tabla interna y no la tabla en si.