✒️ABAP Las tablas internas
ABAP Las tablas internas
TABLAS INTERNAS
Si deseamos guardar una colección de registros de datos de la misma estructura en memoria sin necesidad de acceder a la base de datos y poder realizar operaciones diversas con este conjunto de información, utilizaremos las tablas internas.
Es un objeto de datos donde podemos guardar en memoria grandes cantidades de registros de datos con la misma estructura. El límite depende de la configuración en la instalación del sistema.
Como declarar tablas internas.
DATA: BEGIN OF <tabla> OCCURS <n>,
<Def.Campo>,
...
END OF <tabla>.
Definiremos una tabla interna con n líneas en memoria, más una línea de cabecera o área de trabajo.
La cantidad de líneas que especifiquemos en el OCCURS no limita el tamaño de la tabla, sino la cantidad de registros que se guardan en memoria simultáneamente. Esto hace necesario un especial cuidado al proponer el número de líneas ya que un OCCURS muy grande supone un gran gasto de recursos del sistema y un OCCURS pequeño un acceso muy lento, ya que necesita de un proceso de paginación. Por lo general se especifica un valor igual a 0 que permite trabajar con grandes cantidades de registros.
Uso típico de una tabla interna:
-Almacenar temporalmente datos de la base de datos para un procesamiento futuro.
-Estructurar y formatear datos que se mostrarán como salida del programa.
-Formaear datos para ser utilizados por otros servicios.
ej.
DATA: BEGIN OF ti_proveedores occurs 0,
nombre(30) type c,
apellido(30) type c,
dni(8) type c,
END OF ti_proveedores.
Otra manera:
DATA: BEGIN OF wa_proveedores,
nombre(30) type c,
apellido(30) type c,
dni(8) type c,
END OF wa_proveedores.
DATA: ti_proveeores LIKE STANDARD TABLE OF wa_proveedores.
Con la sentencia WITH HEADER LINE declaramos una tabla interna sin especificar aparte un área de trabajo o cabecera. ej.
DATA: ti_vuelos LIKE STANDARD sflight WITH HEADER LINE.-> la cabecera o área de trabajo es la misma tabla interna.
Llenado de una tabla interna.
APPEND TO: añade en la última posición de la tabla los valores que tengamos en el área de trabajo. ej.
CLEAR wa_proveedores.
wa_proveedores-nombre='Katerine'.
wa_proveedores-apellido='Espinosa'.
wa_proveedores-dni='13069108'.
APPEND wa_proveedores TO ti_proveedores.
Podemos llenar una tabla interna con el contenido de una tabla de base de datos. Siempre que la tabla interna tenga la misma estructura que la tabla de
base de datos. ej.
SELECT * FROM <tab> INTO TABLE <tabint>.
Ordenar una tabla interna.
Para clasificar una tabla interna utilizamos SORT. ej.
SORT <intab>.
Esta instrucción realiza una ordenación por la estructura de la tabla sin tener en cuenta los campos.Para ordenar por el campo(s) que necesitemos (sea del tipo que sea ):
SORT <intab> BY <campo1> ....<campo n>.
Si no se indica lo contrario la ordenación por defecto es ascendente.
SORT ... ASCENDING. o DESCENDING.
Ej: SORT ti_proveedores BY dni ASCENDING.
Procesamiento de una tabla interna.
Podemos recorrer una tabla interna con la instrucción LOOP ... ENDLOOP. ej.
LOOP AT <intab> ( WHERE <cond> ).
...
ENDLOOP.
En cada iteración coloca la línea de la tabla que se está procesando en la línea de cabecera. Podemos restringir el proceso de una tabla con una condición WHERE.
Si no existe ningún registro de la tabla que cumpla la condición especificada en la cláusula WHERE, la variable del sistema SY-SUBRC será distinta que 0. Dentro del LOOP la variable SY-TABIX contiene el índice de la entrada que está procesando en ese momento.
También es posible hacer un :
LOOP AT <intab> FROM <inicio> TO <fin>.
...
ENDLOOP.
Donde <inicio> y <fin> son índices de la tabla interna.
La sentencia loop...endloop en tablas internas con cabecera
No necesitan de ninguna variable adicional. Simplemente llamamos a nuestra interna mediante la sentencia loop...endloop. En ese mismo momento, todos los registros de cada línea se cargan sobre la cabecera de la propia tabla interna.
LOOP AT <tabla_interna>.
* Acción sobre <tabla_interna>
ENDLOOP.
La sentencia loop...endloop en tablas internas sin cabecera
Necesitan de una variable estructructura adicional donde se contenga el valor de cada registro de la tabla interna. Al hacer una llamada loop...endloop, el valor del registro por el que pasa se ha de traspasar a esta variable adicional.
LOOP AT <tabla_interna> into <estructura>.
* Acción sobre <estructura>
ENDLOOP.
Lectura de una tabla interna
READ TABLE: Podemos buscar un registro concreto en una tabla sin necesidad de recorrerla. ej.
READ TABLE ti_proveedores INTO wa_proveedores WITH KEY nombre='Katerine'.
El resultado de la búsqueda lo tendremos en SY-SUBRC.
Si SY-SUBRC = 0 la búsqueda ha sido positiva.
Si SY-SUBRC <> 0 no ha encontrado el registro solicitado.
Es posible una búsqueda aún más rápida con una búsqueda binaria. ej.
READ TABLE ti_proveedores INTO wa_proveedores WITH KEY nombre='Katerine' BINARY SEARCH.
Una lectura directa de un registro de la tabla la podemos realizar con: READ TABLE <intab> INDEX <num>. ej.
READ TABLE ti_proveedores INTO wa_proveedores INDEX 1.
Modificando una tabla interna
MODIFY: sentencia utilizada para modificar un registro de una tabla interna. Podemos sobreescribir el contenido de la entrada <i> con el contenido de la línea de cabecera. ej.
wa_proveedores-dni='457896'.
MODIFY ti_proveedores from wa_proveedores INDEX 1.
Dentro de un LOOP, la cláusula INDEX es opcional. Por defecto será el contenido de la variable SY-TABIX.
INSERT: inserta un registro en una posición determinada de una tabla interna con el contenido de la línea de cabecera. ej.
wa_proveedores-nombre='JULIAN'.
wa_proveedores-apellido='BOLAÑOS'.
wa_proveedores-dni='123456'.
INSERT wa_proveedores INTO ti_proveedores INDEX 2.
DELETE: sirve para borrar un registro de una tabla interna.ej.
DELETE ti_proveedores WHERE dni='123456'.
Para borrar todo el contenido de una tabla se utiliza la sentencia REFRESH. ej.
REFRESH ti_proveedores.
DESCRIBE TABLE: se utiliza para conocer cuantos registros posee una tabla interna. Se declara una variable tipo i donde se almacena el número de filas devuelto por la sentencia. ej.
DATA v_filas type i.
DESCRIBE TABLE ti_proveedores LINES v_filas.
Con la sentencia FREE liberamos el espacio en memoria que ocupa una tabla interna.
 
 
 
Sobre el autor
Publicación académica de Alberth Julian Bolanos Bravo, en su ámbito de estudios para la Carrera Consultor ABAP.
Alberth Julian Bolanos Bravo
Profesión: Analista de Sistemas Web - Colombia - Legajo: FC65L
✒️Autor de: 46 Publicaciones Académicas
🎓Egresado del módulo:
Certificación Académica de Alberth Bolanos