Você está na página 1de 8

TABLAS INTERNAS

Qu son? Cuando desde un programa realizamos una consulta en Base de Datos a travs de sentencias SQL, solemos requerir que los resultados se guarden en alguna estructura de nuestro programa, para su posterior tratamiento. Estas son las tablas internas. Las tablas internas son, como su nombre lo indica, tablas; pero se diferencian de las tablas del Diccionario de Datos en que stas solo estn disponibles DENTRO de un programa. Son objetos cuya funcin es el tratamiento de varios registros exclusivamente durante la ejecucin de un programa.

Las tablas internas tienen dos formas de declararse: DATA: BEGIN OF <itab> OCCURS <n> <campo> TYPE <tipo_campo>, <campo> TYPE <tipo_campo>, END OF <itab>.

<itab> es el nombre que le daremos a la tabla interna. OCCURS <n> es el nmero de registros que se guardaran en memoria simultneamente. Las tablas pueden ser de mayor cantidad, esta sentencia solo determina la cantidad de memoria reservada para su tratamiento (cantidad de registros a atender por vez). <campo> es el nombre del campo (columna) de la tabla interna, y este campo ser de tipo <tipo_campo> (entero, string, igual a algn campo del Diccionario; etc).

Tablas Internas RichardRey.com - 2

La otra forma de declarar una tabla interna es como sigue: TYPES: BEGIN OF <estructura>, <campo> TYPE <tipo_campo>, <campo> TYPE <tipo_campo>, END OF <estructura>. DATA: <itab> TYPE TABLE OF <estructura> .

<estructura> es una Estructura de Datos del programa que ser el esqueleto de la tabla interna (ver tema 2); luego se declara la tabla interna <itab> del tipo tabla cuya estructura ser <estructura> . Yo suelo usar ms esta segunda opcin.

Lneas de cabecera y work areas. Una tabla interna se compone de un cuerpo y una cabecera opcional; el cuerpo es que el almacena los registros de la tabla interna, normalmente cuando se habla de tabla interna, nos referimos al cuerpo. La cabecera es un nico registro que se utiliza para aadir y recoger datos del cuerpo de la tabla interna. La asignacin de campos de las tablas internas siempre se refiere a la cabecera, por lo que debemos tener esto presente a la hora de hacerle tratamiento a dicha tabla. Debemos declarar una lnea de cabecera, para leer cada registro de la tabla, o bien declarar la tabla misma con lnea de cabecera. Con cabecera: DATA: <itab> TYPE TABLE OF <estructura> WITH HEADER LINE. Sin cabecera: DATA: <itab> TYPE TABLE OF <estructura>. DATA: <line> LIKE LINE OF <itab>.

Tablas Internas RichardRey.com - 3

Con la primera instruccin, la cabecera tambin se llamar <itab>, por lo que tendremos la sensacin de que leemos la tabla interna directamente. Ejemplo: LOOP AT <itab>. WRITE: <itab>-<campo1>. ENDLOOP.

Con la segunda instruccin, cada registro que se lea de <itab> deber tratarse desde <line>, que es la lnea de cabecera de la tabla interna. Ejemplo: LOOP AT <itab> INTO <line>. WRITE: <line>-<campo1>. ENDLOOP.

En el primer LOOP; la lnea de cabecera no es que desaparece, de hecho existe, solo que lleva el mismo nombre que la tabla interna por lo que se omite la sentencia INTO y se trata directamente con <itab>.

Work Area Si queremos disponer de una variable que nos sirva para manipular los datos de una <itab>, con su misma estructura, estn los que se conocen como work area o rea de trabajo. Son estructuras con la misma forma que un registro de una tabla interna, similar a sus lneas de cabecera, y se declaran de la siguiente manera: DATA: <wa> TYPE <itab>. Esto nos crear un work area llamado <wa> del mismo tipo que la lnea de cabecera <itab>.

Tablas Internas RichardRey.com - 4

Llenar una tabla interna Para ingresar datos a una tabla interna, tenemos las siguientes sentencias: APPEND: Aade un registro a una tabla interna con los valores que tengamos en dicho registro. Ejemplos: APPEND <itab>. (con cabecera). APPEND <itab> FROM <line>. (sin cabecera).

READ: Lee un registro de la tabla interna y lo guarda en su lnea de cabecera, el registro que leer lo determinar la condicin que le indiquemos. Ejemplos: READ TABLE <itab> WITH KEY <condicion> (con cabecera). READ TABLE <itab> INTO <line> WITH KEY <condicion> (sin cabecera). READ TABLE <itab> INDEX <n>. (Esta instruccin lee el registro ubicado en la lnea <n>).

INSERT: Inserta un registro contenido en un work area en una tabla interna. Ejemplos: INSERT <itab>. (con cabecera). INSERT <wa> INTO <itab>. (sin cabecera).

MODIFY: Modifica el registro indicado en la tabla interna. Ejemplos: MODIFY <itab>. (con cabecera). MODIFY <itab> FROM <line> (sin cabecera). MODIFY <itab> INDEX <n> (modifica el registro de la posicin <n>)

Tablas Internas RichardRey.com - 5

DELETE: Elimina el registro indicado de la tabla interna. Ejemplos: DELETE <itab>. (con cabecera). DELETE <itab> FROM <line> (sin cabecera). DELETE <itab> INDEX <n> (elimina el registro de la posicin <n>)

COLLECT: Aade o suma la lnea de cabecera. Sumar los campos tipo P, F, I (tema 2), si existe una lnea en la tabla con campos idnticos (tipo C) a los del work area. El problema es que se trata de una instruccin que consume mucho en memoria.

Ordenar una tabla interna Para ordenar los registros de una tabla interna, utilizamos la instruccin SORT (ordenar en Ingls), y le indicamos por cuales campos debe ordenar, (si se le indican varios campos, el lenguaje le da prioridad de izquierda a derecha), luego podremos indicarle si queremos que se ordenen de manera ascendente o descendente. (Por defecto siempre ser ascendente). Ejemplo: SORT <itab> BY <campo1> . <campoN> <ASCENDING/DESCENDING>.

Procesamiento de una tabla interna. Para recorrer los registros de una tabla interna, utilizaremos la instruccin LOOP. LOOP AT <itab> (WHERE <cond>) . . . ENDLOOP. (con cabecera)

LOOP AT <itab> INTO <line> (WHERE <cond>) . . . ENDLOOP. (sin cabecera)

Tablas Internas RichardRey.com - 6

En cada iteracin, la instruccin coloca la lnea de la tabla que se est procesando en la lnea de cabecera. Con la clusula WHERE podemos filtrar los registros que leeremos en el LOOP, tal cual como lo haramos en una consulta SQL; si no existe ningn registro que cumpla con la condicin de la clusula WHERE, la variable SY-SUBRC ser diferente de 0 y no habrn iteraciones en el LOOP. Mientras haya iteraciones dentro de un LOOP, con la variable del sistema SY-TABIX podremos saber cul es el ndice del registro que se procesa en un momento dado.

Tratamiento de niveles de ruptura. Existen algunas sentencias para registros puntuales de una tabla interna dentro del LOOP. AT FIRST: Instrucciones especficas para el primer registro de la tabla. AT LAST: Instrucciones especficas para el ltimo registro de la tabla. AT NEW <campo>: Instrucciones para cada inicio de nivel de ruptura o valor diferente. AT END OF <campo>: Instrucciones para cada final de nivel de ruptura.

Todas estas instrucciones tienen la siguiente forma: AT _____ (FIRST, LAST, NEW <campo>, END OF <campo>) ... ENDAT. Dentro de la clusula AT .. ENDAT irn las instrucciones que queremos programar para ese registro en particular.

Tablas Internas RichardRey.com - 7

Otras instrucciones para manejo de tablas internas. CLEAR <itab> o CLEAR <line>. Limpiar la cabecera de la tabla interna. REFRESH <itab>. Borra el contenido de la tabla interna. FREE <itab>. Libera espacio ocupado en memoria por la tabla interna. DESCRIBE TABLE <itab> LINES <wa>. Obtiene informacin de la tabla interna, como la cantidad de lneas o registros que contiene.

Te saluda,

Richard Rey http://aprendeabap.com

Tablas Internas RichardRey.com - 8