✒️ABAP Las tablas internas
ABAP Las tablas internas
1 | ¿Qué son las tablas internas?
Las tablas internas son un objeto de datos que sirven para guardar en memoria grandes cantidades de registros de la misma estructura de datos. Cabe destacar que al momento de ser creadas la capacidad de registros que tienen puede declararse como estática o dinámica, aunque los límites exactos son dictaminados por las capacidades de la instalación del sistema SAP.
Las tablas internas existen exclusivamente en el runtime. Y cabe destacar que lo que de ahora en adelante llamaremos "tabla interna" en otros lenguajes se conoce como array, vector, lista, colección, etc.
En general, usamos las tablas internas como un buffer de datos para las siguientes tareas:
- Almacenar temporalmente datos de las tablas bases de datos para trabajar con sus datos más adelante
- Para estructurar y formatear datos que serán la salida de un programa.
- Para estructurar datos en un formato adaptado para el uso de otros servicios.
2 | ¿Cómo se declara una tabla interna?
Ahora veremos algunas formas de declarar las tablas internas. Aunque mientras que lo hacemos, también crearemos lo que llamamos "estructura". Si usamos la analogía de que los registros de la tabla interna es una cinta con datos, podemos decir que las estructuras (también llamadas "áreas de trabajo" o "cabeceras de tablas internas") son el cursor/cabezal que usamos para navegar la "cinta" (tabla interna), leer y modificar cada uno de sus registros.
Cabe destacar algo sobre esta analogía: No es completamente precisa. La imprecisión es de que en este caso, el cursor constantemente manipula el registro de la tabla interna, cuando en realidad, la estructura es un objeto de datos (en gran parte) independiente de la tabla interna, lo importante es que comparten el hecho que son derivados del mismo tipo de datos compuesto.
Teniendo eso en cuenta, ya podemos ver los métodos que tenemos para declarar las tablas internas, cabe destacar que de ahora en adelante vamos a trabajar consistentemente con un ejemplo en el que creamos una lista de proveedores donde los mismos son guardados en la base de datos a través de los campos: DNI (caracter de 8 posiciones); NOMBRE (caracter de 30 posiciones); APELLIDO (caracter de 30 posiciones).
1er método:
En este método creamos un tipo de datos compuesto, con ese tipo de datos creamos una tabla interna y con la tabla interna creamos una estructura:
Nótese el uso del sufijo "ty" para tipos compuestos, "ti" para tablas internas y "wa" para estructuras, ya que se usarán como estándares.
2do método:
En este método, creamos la tabla a base de darle nombre, definir sus contenidos y implícitamente decirle a SAP que es una tabla interna usando la sentencia OCCURS 0. Luego declaramos la estructura como en el primer método.
La sentencia OCCURS sirve para reservar el espacio para la cantidad de registros especificada, la cantidad reservada es estática pero la tabla interna puede sobrepasar la cantidad reservada sin causar problemas, por lo que se la puede dejar en 0 para que SAP se arregle y le asigne memoria al programa como lo vea necesario.
3er método:
En este método creamos la estructura y a través de la estructura creamos la tabla interna. En esencia es lo mismo que el método anterior pero cambiando el orden y con la diferencia que la línea de data usaría el formato: ti_foo LIKE STANDARD TABLE OF wa_bar.
4to método:
Este método lo usamos cuando ya tenemos el tipo de datos definido en el diccionario de datos. El significado de todo esto será dado más adelante. Esto se vería de la siguiente forma:
5to método:
En este método usamos la misma tabla interna como una estructura. Esto lo hacemos de la siguiente forma:
Cabe destacar que esta forma de manipular tablas internas se podría considerar obsoleta y por lo tanto su uso es desaconsejable.
3 | ¿Cómo llenar de contenido una tabla interna?
El proceso real suele emplear un SELECT a una tabla base de datos, el almacenado de los resultados de dicho SELECT en una tabla interna, la modificación de la tabla interna o la adición de datos en la misma usando la sentencia INSERT o APPEND TO.
Todo este proceso será explicado a profundidad más adelante, pero de momento podemos hablar del APPEND TO y de cómo modificamos los valores dentro de la estructura/tipo de datos compuesto.
Primero, tenemos que usar CLEAR en nuestra estructura. Luego, ya podemos empezar a meterle valores a cada variable dentro de la estructura.
Algo que no se había explicado antes es cómo acceder a las variables dentro de un tipo de datos compuesto. Esto lo hacemos escribiendo el nombre del tipo de datos y luego escribimos el nombre de la variable dentro del tipo de datos separando ambos nombres con un guión, es decir, un ejemplo sería: "ty_foo-bar" para acceder a la variable "bar" dentro del tipo "ty_foo".
Una vez ya tengamos nuestra estructura con los datos que queremos podemos ponerla en la tabla interna, para eso, por el momento vamos a usar APPEND TO, el cual es una sentencia que sirve para sumar datos al final de la tabla. La forma en la que usamos dicha sentencia es con la sintaxis: APPEND wa_foo TO ti_bar.
Un ejemplo con en el listado de proovedores en el que creamos un registro desde la estructura y la pasamos a la tabla interna se vería de la siguiente forma:
También podemos ver que si hacemos este ejemplo en el editor de ABAP y lo debugueamos podremos ver que en la parte de variables de debugger podemos ver como una variable la tabla interna y en la columna de valores podemos ver que aparece "standard table [n1xn2(n3)]". n1 es el número de registros (filas), n2 es el número de variables por registro (columnas) y n3 es la cantidad total de caracteres dentro de la tabla. Dándole doble clic al la tabla interna en el listado de variables del debug abre la tabla interna para ver sus contenidos en otra sección del debugger.
4 | El ordenamiento de una tabla interna
Para ordenar una tabla usamos las siguientes sentencias de la siguiente forma:
Donde ti_foo es la tabla a ordenar, v_bar es el campo/columna que se usará para ordenar los contenidos de la tabla y definimos si queremos ordenar de forma descendiente o ascendiente usando una de las dos palabras clave: DESCENDING o ASCENDING (Nótese que puede descartarse la adición de esta cláusula teniendo en cuenta que por defecto se ordena de forma ascendente).
Cabe destacar que las tablas pueden ser ordenada por varios campos, es decir, pueden haber varios "v_bar".
5 | ¿Cómo recorrer una tabla interna?
Para lograr esto, usamos la sentencia LOOP AT-ENDLOOP usando la siguiente sintaxis:
En este ejemplo las sentencias serán ejecutadas mientras que se itera por cada registro de la tabla interna (por supuesto, cada iteración emplea los valores del registro actual).
Sin embargo, iterar por cada uno de los registros no es idóneo, por esto, tenemos formas de filtrar registros para iterar a través de un grupo específico de registros. Esto lo logramos con la cláusula WHERE.
Ejemplos del uso de WHERE para filtrar registros serían:
-Para filtrar los registros en los cuales la variable "nombre" es la variable por defecto:
-Lo mismo que antes pero también descartamos registros en los cuales el dni no es "25986584":
6 | La lectura de una tabla interna
Si queremos leer un registro en específico usaremos la sentencia READ TABLE. El problema es que necesitamos aislar el registro en específico de los demás. Para esto tenemos dos opciones: Buscar el registro o usar el número de la posición exacta del registro.
Para el primero, usamos READ TABLE junto a la sentencia WITH KEY de la siguiente forma:
Lo que hacemos con esto es buscar en el campo "nombre" el string "Ariel". Tenemos el condicional "IF sy-subrc 0" para hacer algo si sy-subrc es diferente de cero, ya que cuando READ TABLE no encuentra el registro que busca se altera el valor de sy-subrc.
Hay un problema con este método de búsqueda, el problema es de que no es eficiente. En este caso el programa navega todos los registros, uno a uno desde el primero hasta el último hasta que encuentre el registro que busca. Para hacer que esto sea más eficiente podemos usar un algoritmo de búsqueda, en este caso, podemos usar la búsqueda binaria, tengamos en cuenta que para buscar de esta forma nuestra lista tiene que estar ordenada. Si el ejemplo anterior usase este método se vería así:
Alternativamente, podemos usar el número de la posición del registro. Esto se vería de la siguiente forma:
Donde n es el número de posición (Algo a aclarar: ABAP no considera el cero como el primer número posible para un índice, arranca desde el uno).
7 | Modificando una tabla interna
Tenemos una buena variedad de formas de modificar las tablas, las que manipularemos de momento son: MODIFY, INSERT, DELETE, REFRESH y DESCRIBE TABLE.
MODIFY
Esta sirve para modificar un registro específico de una tabla interna, para esto es necesario escribir algo en un campo a elección y luego usar la sentencia MODIFY ti_foo FROM wa_bar INDEX n. Donde n es el número de índice del registro a modificar.
Si MODIFY no encuentra un registro en el índice especificado sy-subrc será distinto a cero.
INSERT
El cual inserta la estructura como un nuevo registro en la tabla interna. Usa la sintaxis INSERT wa_foo INTO ti_bar INDEX n.
DELETE
Borra un registro. La sintaxis puede variar mucho ya que esta sentencia puede operar de varias formas, es recomendable ver la documentación oficial de SAP.
REFRESH
Inicializa/borra los contenidos de una tabla interna. Usa el formato REFRESH ti_foo.
DESCRIBE TABLE
Nos da información sobre la tabla interna. Puede darnos 3 datos dependiendo de cómo se use. La sintaxis es: DESCRIBE TABLE ti_foo (LINES/KIND/OCCURS) v_bar. LINES nos dice la cantidad de registros de ti_foo y guarda el número en v_bar; KIND guarda el tipo de tabla que ti_foo es, emplea una variable de tipo c de un solo carácter para guardar el tipo de la tabla; OCCURS dice la cantidad de espacio reservado para la tabla interna y guarda el valor en v_bar.
 
 
 
Sobre el autor
Publicación académica de Mauricio Javier Solis Ibañez, en su ámbito de estudios para la Carrera Consultor ABAP.
Mauricio Javier Solis Ibañez
Profesión: Técnico Electrónico - Argentina - Legajo: CF20Z
✒️Autor de: 28 Publicaciones Académicas
🎓Egresado del módulo:
Disponibilidad Laboral: FullTime
Certificación Académica de Mauricio Solis