✒️ABAP / Las tablas internas Por Gaston Asplanatti
ABAP Las tablas internas

Diccionario de datos: Tablas Internas.
Son objeto de datos que permite guardar en memoria grande cantidad de datos con la misma estructura, y puede almacenar 0 a n registro de datos.
La verdadera cantidad de registros máxima está íntimamente relacionado con los limites especificados en la instalación del sistema SAP.
La tabla interna existe en tiempo de ejecución, conocido como vector, lista, colección etc.
Usos típicos:
· Almacenar temporalmente los datos de las tablas de DB para un futuro procedimiento.
· Estructurar formatear los datos a mostrar como salida de programa.
· Como datos para ser usados por otros servicios.
Existen varias formas de declarar una tabla interna en ABAP. Según para que la utilicemos nos va a convenir usar alguna de estas diferentes formas.
Para poder trabajar con una tabla interna contar con una estructura, llamada “área de trabajo” o cabecera de la tabla interna.
· Leer el contenido de un registro
· Recorrer cada registros
· Agregar registros
· Modificar el contenido de un registro
Una estructura o área de trabajo o cabecera de una tabla interna solo pueden almacenar 1 registro de datos.
Ejemplo:
Declarar tabla interna de proveedores.
TYPES: BEGING OF ty_proveedores,
Dni(8) TYPE c,
Nombre(30) TYPE c,
Apellido(30) TYPE c,
END OF ty_proveedores.
La forma más eficiente de declarar una tabla interna es utilizando TYPES, donde primero declaramos un tipo de datos que será TY_PROVEEDORES, luego decoláramos la tabla interna TI_PROVEEDORES de ese mismo tipo de datos utilizando la sentencia TYPE ESTÁNDAR TABLE OF y por ultimo declaramos la estructura o área de trabajo WA_PROVEEDOREES que nos va a permite trabajar con la tabla interna y para ello usamos la sentencia LIKE LINE OF
Tabla Interna: TYPE ESTÁNDAR TABLE OF (de tipo de dato ty_prveedores), y luego la estructura.
Segunda forma de tabla interna es usando OCCURS 0, y para declarar el área de trabajo WA_PROVEEDORES utilizamos la sentencia LIKE LINE OF
DATA: BEGIN OF ti_proveedores OCCURS 0,
Dni(8) type c,
Nombre(30) type c,
Apellido(30) type c,
END OF ti_proveedores.
DATA: wa_proveedores LIKE LINE OF ti_proveedores.
De esta forma definimos una tabla interna con N líneas en memoria + una línea de cabera o área de trabajo.
La cantidad de líneas que se especifica en OCCURS no limitan el tamaño de la tabla interna sino la cantidad de registros que se guardaran en memoria simultáneamente. Generalmente se especifica con 0 lo que permite trabajar con tablas internas en gran cantidad de datos.
Convención de nombres:
· TI: Tabla interna.
· WA: Área de trabajo.
Una tercera forma consiste en primero declarar la estructura WA y liego la tabla interna TI
DATA: BEGIN OF WA_clientes,
Dni(8) type c,
END OF WA_clientes.
DATA: ti_clientes LIKE STANDAR TABLE OF WA_clientes.Una cuarta forma: de declarar latabla interna TI_PROVEEDORES consiste en declararla del mismo tipo que una tabla base de datos existentes en el diccionario de datos ABAP.
DATA: ti_proveedores LIKE TABLE OF LFA1,
wa_proveedores LIKE LINE OF ti_proveedores.
LFA1 es el maestro de proveedores.
Esta última forma es útil cuando si la tabla de la DB tiene exactamente los datos que requerimos, sino es así, no se justifica de ninguna manera crear una tabla base de datos en el diccionario de datos para poder declarar una tabla interna en el programa abap.
Por ultimo, existe una forma de declarar la estructura o área de trabajo o cabecera de una tabla interna usando la misma tabla interna como cabecera.
DATA: ti_proveedores LIKE TABLA OF LFA1 WITH HEADER LINE.
Es importante conocer esta sentencia WITH HEADER LINE, pero esto, está totalmente desaconsejada su utilización por SAP.
Llenar una tabla interna con datos.
· Select: datos de una tabla base de datos y almacenar lo seleccionado en la TI.
· Insert: insertar datos mediante la sentencia Insert.
· APPEND TO: Se añade registro a registro, se agregan al final de la tabla interna.
Pasos:
Limpiar WA con la sentencia CLEAR “estructura”.
Completamos los datos manualmente.
APPEND WA to TI para que impacte los datos.
Para ordenar una tabla interna usamos SORT. Por defecto es ascendente. “SORT”.
Podemos usar 2 opciones: ascendente o descendente "SORT ti_clientes BY DNI ASCENDING." o "SORT ti_clientes BY dni DESCENDING".
Como podemos recorrer la TI ¿? Usamos LOOP-ENDLOOP
Vamos a necesitar para recorer la TI, la WA.
LOOP AT ti_tabla INTO WA_estructura.
WRITE:/
WA_proveedor-dni,
WA_proveedor-nombre.
WA_proveedor-apellido.
ENDLOOP.
Se puede filtar y achicar el recorrido en los loops agregando filtros usando WHERE.
Ej: WHERE NOT nombre IS INITIAL. (si esta vacio)
También se puede concatenar WHEER NOT nombre IS INITIAL AND DNI NE ‘123456’.
Para leer un registro en particular de una tabla interna sin necesidad de recorrerla registro a registro usamos la sentencia READ TABLE.
Para leer la tabla interna requerimos de WA_proveedores.
READ TABLE ti_proveedores INTO wa_proveedores WITH KEY nombre = ‘Ariel’.
IF sy_subrc EQ 0.
ELSE (de lo contrario será distinto de cero el sy-subrc)
ENDIF.
Ahora bien la sentencia REAL TABLE por mas que especifiquemos una condición para la lectura, realiza de forma secuencial cada uno de los registros de la TI, hasta encontrar el registro, usando el WITH KEY. Para mejorar este caso, se usa la búsqueda binaria.
Búsqueda binaria: Busca la posición de un valor en la TI. Ordenada dividiendo el espacio de búsqueda en dos y comparando el valor buscado en el elemento en el medio de la TI, si no son iguales, la mitad en la cual el valor no está es eliminada y la búsqueda continúa en la otra mitad restante, utilizando el mismo procedimiento hasta que se encuentre. Es más eficiente.Para hacer esta búsqueda es necesario hacer previamente un SORT y luego hacemos la lectura utilizando la clausula BINAY 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 (de lo contrario será distinto de cero el sy-subrc)
ENDIF.
Si queremos leer datos en una posición en particular de la TI usamos la cláusula INDEX.
READ TABLE TI_proveedores INTO wa_proveedores INDES 5.
Para modificar usamos la sentencia MODIFY
Wa_proveedores-dni=’123456’.
MODIFY ti_proveedores FROM wa_proveedores INDEX 1.
IF sy-subrc EQ 0.
Else
ENDIF.
Podemos agregar registro en posicion determinado usando INSERT.
wa_proveedores-nombre = ‘Marcelo’.
wa_proveedores-apellido = ‘Marcelo’.
wa_proveedores-dni = ‘Marcelo’.
INSERT WA_proveedores INTO ti_proveedores INDEX 2.
Para borrar usamos DELETE.
DELETE ti_proveedores WHERE dni =’123456’.Para borrar todo el contenido de la TI. Usamos REFRESH. Se borra o se inicializa toda la TI.
REFRESH_ti_proveedores.
Por ultimo para saber cuántos registros tiene usamos: DESCRIBE TABLE, para eso necesitamos declarar una variable V_LINEAS de tipo “i” integer, que va a contener la cantidad de registros de la ti_proveedores luego de ejecutar la sentencia DESCRIBE TABLE ejemplo:
DATA: v_lineas TYPE i.
DESCRIBE TALBE ti_proveedores LINES v_lineas.
IF v_lineas > 0.
ENDIF
 
 
 
Sobre el autor
Publicación académica de Gaston Asplanatti, en su ámbito de estudios para la Carrera Consultor ABAP Nivel Inicial.
Gaston Asplanatti
Profesión: Senior Technical Architect - Argentina - Legajo: UW99J
✒️Autor de: 21 Publicaciones Académicas
🎓Cursando Actualmente: Carrera Consultor ABAP Nivel Inicial
Disponibilidad Laboral: FullTime
Presentación:
Mis objetivos laborales se enfocan en ser competente en las funciones requeridas. mi perfil técnico y de interés son: programador y técnico (sysadm)
Certificación Académica de Gaston Asplanatti
























