✒️ABAP Las tablas internas
ABAP Las tablas internas
Tablas Internas
Se utilizan 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.
Una tabla interna es un objeto de datos que permite guardar en memoria grandes cantidades de registros de datos con la misma estructura, la cantidad máxima esta relacionada con los límites especificados en la instalación del sistema.
El uso típico que se la da es:
*Almacenar temporalmente los datos de las bases de datos para procesamiento futuro.
*Para estructurar y formatear datos que se mostrarán como salida del programa.
*Para formatear datos para ser utilizados por otros servicios.
Como se declara:
DATA: BEGIN OF <tabla> OCCURS <n,
<Def.Campo>,
...
END OF <tabla>.
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 limita el tamaño de la tabla sino la cantidad de registros que se guardarán en memoria simultáneamente(por lo general se especifica en 0, lo que permite trabajar con tablas de gran cantidad de registros).
No se recomienda usar la palabra reservada WITH HEADER LINE
*Ejemplo 1
DATA: BEGIN OF ti_proveedores OCCURS 0,
nombre(30) TYPE c,
apellido(30) TYPE c,
END OF ti_proveedores.
*Ejemplo 2
DATA: BEGIN OF wa_proveedores,
nombre(30) TYPE c,
apellido(30) TYPE c,
END OF ws_proveedores.
DATA: ti_proveedores LIKE STANDARD TABLE OF wa_proveedores.
*Para llenar con datos una tabla interna se utiliza APPEND TO, con lo cual se añade un registro en la ultima posición con los valores que tengamos en el área de trabajo,ej:
*Añadir un registro a la tbl interna de proveedores
CLEAR wa_proveedores.
wa_proveedores-nombre = 'Ernesto'.
wa_proveedores-apellido = 'Villanueva'.
APPEND wa_proveedores TO ti_proveedores.
*Ordenamiento de la tabla interna
Para ordenar una tabla interna se utiliza SORT.
ej: SORT ti_proveedores BY nombre DESCENDING.
*Procesamiento de una tabla interna
Para recorrer una tabla interna y procesar registro a registro, se utilizara la sentencia LOOP-ENDLOOP.
ej:
LOOP AT ti_proveedores INTO wa_proveedores
WHERE NOT nombre IS INITIAL.
ENDLOOP.
Si no existe ningún registro que cumpla la condición especificada en la cláusula WHERE, el SY-SUBRC será distinto de cero.
*Lectura de una tabla interna
Para leer un registro en concreto de una tabla interna, sin necesidad de recorrerla, se utiliza la sentencia READ TABLE.
ej: READ TABLE ti_proveedores INTO wa_proveedores
WITH KEY nombre = 'Ariel'
Si se encuentra el registro buscado, el SY-SUBRC será cero.
Si se desea leer los datos que se encuentran en una posición particular de la tabla se utilizará la cláusula INDEX, ej:
READ TABLE ti_proveedores INTO wa_proveedores INDEX 1.
Utilizar la clausula BINARY SEARCH hace que la sentencia READ TABLE ejecute una búsqueda más eficiente, es indispensable que la tabla interna se encuentre ordenada por el campo o campos por los que se desea buscar sino la búsqueda binaria no funcionara y arrojará cualquier resultado.
READ TABLE solo lee la primera ocurrencia que encuentra, si hay más de una desestimará el resto de las ocurrencias.
En los casos en donde se sepa que puedan existir más de una ocurrencia en la misma tabla interna entonces debe utilizarse:
LOOP AT TI_USUARIOS WHERE .......
En lugar de utilizar READ TABLE
*Modificación de una tabla interna
Para modificar una tabla interna se utiliza la sentencia MODIFY, ej:
wa_proveedores-nombre = 'Luis'.
MODIFY ti_proveedores FROM wa_proveedores INDEX 1.
Si se intenta modificar un registro de una tbl interna que no existe, entonces el SY-SUBRC será distinto de cero.
->De esta forma solo se modifica el campo que especificamos a la derecha de TRANSPORTING.
MODIFY TI_USUARIOS INDEX idx FROM WA_USUARIOS
TRANSPORTING DNI.
*Para insertar un registro en una posición determinada de la tbl interna se utiliza la setencia INSERT, ej:
wa_proveedores-nombre = 'Patito'.
wa_proveedores-apellido = 'Juan'.
INSERT wa_proveedores INTO ti_proveedores INDEX 2.
*Para borrar el contenido de un registro de un tbl interna se utiliza la sentencia DELETE, ej:
DELETE ti_proveedores WHERE nombre = 'Luis'.
*Para borrar todo el contenido de una tbl interna, se utiliza la sentencia REFRESH, ej:
REFRESH ti_proveedores.
Borrara el contenido de la tabla interna y no la tabla en si.
*Para saber la cantidad de registros en una tabla interna, ej:
DATA: v_lineas TYPE i.
DESCRIBE TABLE ti_proveedores LINES v_lineas.
*Inicializar área de trabajo o cabecera: CLEAR <área_de_trabajo>.
*Liberar el espacio de una tbl interna en memoria: FREE <tbl_interna>.
*Las tablas internas no tienen campos claves por lo tanto una tabla interna es una acumulación de registros sin importar el contenido de los mismos.
En caso de querer insertar en una tabla interna un registro ya existe en la misma en la misma posición en la que este se encuentra no se producira un error ni el SY-SUBRC será distinto de cero sino que el registro se insertará en la posición deseada y el registro ya existente se desplazará abajo de este.
 
 
 
Sobre el autor
Publicación académica de Luis Miguel Vallecillo Chinchilla, en su ámbito de estudios para la Carrera Consultor ABAP.
Luis Miguel Vallecillo Chinchilla
Profesión: Analista Programador - Honduras - Legajo: UG43S
✒️Autor de: 13 Publicaciones Académicas
🎓Cursando Actualmente: Consultor ABAP Nivel Inicial
Disponibilidad Laboral: PartTime
Presentación:
Soy ingeniero en sistemas, con conocimiento en java,.net,php, sap-pi, manejadores de base de datos, servidores de aplicaciones, actualmente laborando en el sector financiero como analista-programador.
Certificación Académica de Luis Vallecillo