✒️ABAP / Las tablas internas Por Yeny Yanes Bautista
ABAP Las tablas internas

Las tablas internas
1. Que son las tablas internas?
Son un objeto de datos que permite guardar en memoria grandes cantidades de registros de datos con la misma estructura. Una tabla interna puede almacenar entre 0 a n registros de datos.
Se utilizan las tablas internas cuando se necesita guardar una colección de registros de datos de la misma estructura en memoria, sin necesidad de acceder continuamente a la tablas bases de datos y poder realizar diversas operaciones con este conjunto de información.
Los usos típicos que se le da a una tabla interna son los siguientes:
*Para almacenar temporalmente los datos de las tablas bases de datos para un procesamiento futuro: Es decir se seleccionan los datos de las tablas bases de datos, luego se procesan esos registros en el programa y por último se vuelven a impactar los cambios en las tablas de la base de datos.
*Para estructurar y formatear datos que se mostrarán como salida del programa: Utilizamos tablas internas para realizar la salida de los datos, la cual puede consistir en un listado de salida por la pantalla o un archivo que se genera en el servidor o localmente en el equipo que lo ejecute.
*Para formatear datos para ser utilizados por otros servicios: Almacenar registros de datos con determinado formato, los cuales serviran como entrada para que otros servicios del sistema SAP los puedan procesar.
2. Como se declara una tabla interna?
Para poder trabajar con una tabla interna se necesita una estructura, tambien llamada área de trabajo o cabecera de la tabla interna, la cual tendrá el mismo formato que la tabla interna y que nos va a permitir:
- Leer el contenido de un registro de la tabla interna
- Recorrer cada registro de la tabla interna
- Agregar registros a una tabla interna
- Modificar el contenido de un registro de la tabla interna
<<Una estructura o área de trabajo o cabecera de una tabla interna solo puede almacenar 1 registro de datos>>
Declarar una tabla interna de proveedores cuyo nombre será TI_PROVEEDORES con 3 campos que son los sig:
> DNI: de tipo caracter de 8 posiciones
> NOMBRE: de tipo caracter de 30 posiciones
> APELLIDO: de tipo caracter de 30 posiciones
Lo mas eficiente de declarar una tabla interna es utilizando TYPES en donde primero declaramos un tipo de datos que será TY_PROVEEDORES, luego declaramos la tabla interna TI_PROVEEDORES de ese mismo tipo de datos con la sentencia TYPES STANDARD TABLE OF
Y por último declaramos la estructura o área de trabajo WA_PROVEEDORES que nos va a permitir trabajar con la tabla interna y para ellos utilizamos la sentencia LIKE LINE OF
* Declaramos el TYPES TYPES: BEGIN OF ty_proveedores, dni(8) TYPE c, nombre(30) TYPE c, apellido(30) TYPE c, END OF ty_proveedores. * Declaramos la tabla interna y la estructura DATA: ti_proveedores TYPE STANDARD TABLE OF ty_proveedores, wa_proveedores LIKE LINE OF ti_proveedores.
Una 2da forma que tenemos disponible para declarar la tabla interna TI_PROVEEDORES es utilizando la sentencia OCCURS 0 y para declarar la estructura o área de trabajo WA_PROVEEDORES utilizamos la sentencia LIKE LINE OF tal como hicimos anteriormente
** Declaramos la tabla interna *DATA: BEGIN OF ti_proveedores OCCURS 0, * dni(8) TYPE c, * nombre(30) TYPE c, * apellido(30) TYPE c, * END OF ti_proveedores. ** Declaramos la estructura *DATA: wa_proveedores LIKE LINE OF ti_proveedores.
De esta manera definimos 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 se especifican en OCCURS no limitan el tamaño de la tabla interna sino la cantidad de registros que se guardarán en memoria simultaneamente. En el parámetro OCCURS se especifica la cantidad 0 lo que permite trabajar con tablas internas de gran cantidad de registros.
"Siempre que declaramos una tabla interna el nombre de la misma empieza con ti_ en donde ti significa Tabla Interna, las estructuras o áreas de trabajo comienzan con wa_ (Work Area)"
Una 3era forma de declarar una tabla interna consiste en primero declarar la estrucutra WA_PROVEEDORES y luego declarar la tabla interna TI_PROVEEDORES del mismo tipo de datos que la estructura que declaramos anteriormente.
** Declaramos la estructura
*DATA: BEGIN OF wa_proveedores,
* dni(8) TYPE c, * nombre(30) TYPE c,
* apellido(30) TYPE c, * END OF wa_proveedores. *
** Declaramos la tabla interna
*DATA: ti_proveedores LIKE STANDARD TABLE OF wa_proveedores.
Y una 4ta forma de declarar la tabla interna TI_PROVEEDORES consiste en declararla del mismo tipo que una tabla base de datos existente en el diccionario de datos ABAP
*DATA: ti_proveedores LIKE TABLE OF lfa1, * wa_proveedores like line of ti_proveedores.
En este caso la tabla interna TI_PROVEEDORES tendrá la misma estructura que la tabla base de datos estándar LFA1 del sistema SAP que es el maestro de proveedores, cuya estructura no está formada por los campos DNI, NOMBRE y APELLIDO sino que está compuesta por otros campos.
Por último, existe una forma de declarar la estrucutra o área de trabajo de una tabla interna usando la misma tabla interna como cabecera. Para ello utilizamos la sentencia WITH HEADER LINE
* Declaramos la tabla interna junto con su cabecera o área de trabajo *DATA: ti_proveedores LIKE TABLE OF lfa1 WITH HEADER LINE.
3. Como se declara una tabla interna?
Existen varias formas de agregar registros a una tabla interna o lo que tambien podemos denominar llenar una tabla interna.
La primera consiste en realizar un SELECT a una tabla base de datos de SAP y almacenar en la tabla interna el resultado de la selección.
Otra forma consiste en insertar registros en la tabla interna mediante la sentencia INSERT
La última manera consiste en añador registro a registro en la tabla interna y para ellos vamos a utilizar la sentencia APPEND TO. Los registros que añadimos con append to se agregan al final de la tabla interna. Cada que se agregue un registro que generará debajo del anterior y así consecutivamente.
*---------------------------------------------------------------------*
START-OF-SELECTION.
*---------------------------------------------------------------------*
* Añadimos un registro a la tabla interna de proveedores
CLEAR wa_proveedores.
wa_proveedores-dni = '24987564'.
wa_proveedores-nombre = 'Ernesto'.
wa_proveedores-apellido = 'Villanueva'.
APPEND wa_proveedores TO ti_proveedores.
* Añadimos un registro a la tabla interna de proveedores
CLEAR wa_proveedores.
wa_proveedores-dni = '25986584'.
wa_proveedores-nombre = 'Ariel'.
wa_proveedores-apellido = 'Gallardo'.
APPEND wa_proveedores TO ti_proveedores.
En el modo debuggin dentro de la columna Val. de valores visualizamos Standard Table que hace referencia al tipo de tabla interna y 2x3(68) significa que la tabla almacena 2 registros de datos, cada uno de ellos tiene 3 campos y en total ocupan 68 caracteres
Y si hacemos doble clic en TI_PROVEEDORES entonces podemos visualizar el contenido de la tabla interna:
<< Existen 5 diferentes tipos de tablas internas en ABAP: Any Table, Index Table, Standard Table, Sorted Table y las hashag Table, siempre vamos a utilizar las standard table, el resto de las opciones se utilizan para casos sumamente específicos>>
Para ordenar una tabla interna utilizamos la sentencia SORT. Una tabla interna se puede ordenar por cualquiera de los campos que forman parte de la tabla interna. Basicamente tenemos 2 opciones disponibles para ordenar, podemos ordenar de forma ascendente o de forma descendente .
Para ordenar la tabla interna TI_PROVEEDORES por el campo DNI de forma ascendente vamos a ejecutar lo siguiente:
* Ordenamos los proveedores de menor a mayor por DNI SORT ti_proveedores BY dni ASCENDING.
Para ordenar la tabla interna TI_PROVEEDORES por el campo DNI de forma descendente vamos a ejecutar lo siguiente:
* Ordenamos los proveedores de mayor a menor por DNI SORT ti_proveedores BY dni DESCENDING.
Si al ejecutar la sentencia SORT no especificamos la forma de ordenamiento ya sea ASCENDING o DESCENDING entonces por defecto el ordenamiento de la tabla interna se realiza en forma ascendente.
5. Como recorrer una tabla interna
Para recorrer una tabla interna y procesar registro a registro su contenido utilizaremos la sentencia LOOP-ENDLOPP.
Para recorrer cada uno de los registros de la tabla interna TI_PROVEEDORES vamos a necesitar contar con la estructura o área de trabajo WA_PROVEEDORES.
* Recorremos la tabla interna LOOP AT ti_proveedores INTO wa_proveedores WRITE:/ wa_proveedores-dni, wa_proveedores-nombre, wa_proveedores-apellido. ENDLOOP.
Podemos restringir los registros de la tabla interna TI_PROVEEDORES que vamos a recorrer en base a que cumplan con una condición que específiquemos utilizando la setnencia WHERE:
* Recorremos la tabla interna LOOP AT ti_proveedores INTO wa_proveedores WHERE NOT nombre IS INITIAL WRITE:/ wa_proveedores-dni, wa_proveedores-nombre, wa_proveedores-apellido. ENDLOOP.
Si no existe ningún registro que cumpla con la condición especificada en la adición WHERE, y el SY_SUBRC será distinto de cero.
Por último, a la derecha del WHERE podemos especificar más de una condición y para ello vamos a concatenar las condiciones and AND o con OR según necesitemos.
* Recorremos la tabla interna LOOP AT ti_proveedores INTO wa_proveedores WHERE NOT nombre IS INITIAL AND dni NE '25986584'. WRITE:/ wa_proveedores-dni, wa_proveedores-nombre, wa_proveedores-apellido. ENDLOOP.
6. La lectura de una tabla interna
Para leer un registro en particular de una tabla interna sin necesidad de recorrerla registro a registro utilizamos la sentencia READ TABLE
Para leer la tabla interna TI_PROVEEDORES vamos a necesitar contar con la estrucutra o área de trabajo WA_PROVEEDORES.
* Lectura de la tabla interna READ TABLE ti_proveedores INTO wa_proveedores WITH KEY nombre = 'Ariel'. IF sy-subrc EQ 0. ELSE. ENDIF.
Si se encuentra el registro buscado entonces el SY-SUBRC será cero, caso contrario será distinto de cero. La sentencia READ TABLE por más que especifiquemos una condición para la lectura, va a leer en forma secuencial cada uno de los registros de la tabla interna TI_PROVEEDORES hasta encontrar aquel registro que cumpla con la condición que escribamos en WITH KEY
Para optimizar esta casuítica existe lo que se conoce como Búsqueda Binaria
Búsqueda binaria: Es un algoritmo de bpusqueda que encuentra la posición de un valor en una tabla interna ordenada, dividiendo el espacio de búsqueda en dos y comparando el valor buscado con e elemento en el medio de la tabla interna si no son iguales, la mitad en la cual el valor no está es eliminada y la busqueda continua en la mitad restante, utilizando el mismo procedimiento hasta que se encuentre el valor buscado. Esta forma de búsqueda es ampliamente más eficiente que la forma secuencial.
Para implementar la búsqueda binaria en ABAP antes de realizar la lectura debemos primeramente ordenar la tabla interna por el campo que deseamos buscar, utilizando la sentencia SORT y luego vamos a realizar la lectura utilizando la clausula BINARY SEARCH:
SORT ti_proveedores ASCENDING BY nombre. READ TABLE ti_proveedores INTO wa_proveedores WITH KEY nombre = 'Ariel' BINARY SEARCH. IF sy-subrc EQ 0. ELSE. ENDIF.Por último, si deseamos leer los datos que se encuentran en una posición particular de la tabla interna utilizaremos la cláusula INDEX:
* Leemos el quinto registro de la tabla interna READ TABLE ti_proveedores INTO wa_proveedores INDEX 5. IF sy-subrc EQ 0. ELSE. ENDIF.6. Modificando una tabla interna
Para modificar el contenido de un registro existente en una tabla interna utilizamos la sentencia MODIFY
Para modificar la tabla interna TI_PROVEEDORES vamos a necesitar contar con la estrucutra o área de trabajo WA_PROVEEDORES.
* Modificamos el primer registro de la tabla interna
wa_proveedores-dni = '24987500'.
MODIFY ti_proveedores FROM wa_proveedores INDEX 1.
IF sy-subrc EQ 0.
ELSE.
ENDIF.
Podemos ingresar un registro en una posición determinada de una tabla interna utilizando la sentencia INSERT:
* Insertamos un registro en la segunda posicion de la tabla interna wa_proveedores-nombre = 'Marcelo'. wa_proveedores-apellido = 'Rivarola'. wa_proveedores-dni = '20857492'. INSERT wa_proveedores INTO ti_proveedores INDEX 2. IF sy-subrc EQ 0. ELSE. ENDIF.Para borrar el contenido de un registro de una tabla interna utilizamos la sentencia DELETE:
* Borramos un registro de la tabla interna DELETE ti_proveedores WHERE dni = '20857492'. IF sy-subrc EQ 0. ELSE. ENDIF.Para borrar todo el contenido de una tabla interna utilizamos la sentencia REFRESH:
Y si deseamos saber cúantos registros tiene una tabla interna utilizaremos la sentencia DESCRIBE TABLE:
Para ello vamos a necesitar declarar la variable V_LINEAS de tipo I, que va a contener la cantidad de registros de la tabla interna TI_PROVEEDORES luego ejecutar la sentencia DESCRIBE TABLE
 
 
 
Sobre el autor
Publicación académica de Yeny Gisela Yanes Bautista, en su ámbito de estudios para la Carrera Consultor ABAP Nivel Inicial.
Yeny Gisela Yanes Bautista
Profesión: Ingeniera en Sistemas - Honduras - Legajo: XC34C
✒️Autor de: 46 Publicaciones Académicas
🎓Egresado de los módulos:
- Master Funcional ABAP
- Master ABAP for HANA
- Carrera Consultor ABAP Nivel Avanzado
- Carrera Consultor ABAP Nivel Inicial






Disponibilidad Laboral: FullTime


















