Tablas Internas

8

Click here to load reader

Transcript of Tablas Internas

Page 1: Tablas Internas

TABLAS INTERNAS

Page 2: Tablas Internas

Tablas Internas – RichardRey.com - 2

¿Qué son?

Cuando desde un programa realizamos una consulta en Base de Datos a través 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 están disponibles DENTRO de un programa.

Son objetos cuya función es el tratamiento de varios registros exclusivamente durante la ejecución

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 número de registros que se guardaran en memoria simultáneamente. 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 algún campo del Diccionario; etc).

Page 3: Tablas Internas

Tablas Internas – RichardRey.com - 3

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 más esta segunda opción.

Líneas 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 añadir y recoger datos del cuerpo de la tabla

interna.

La asignación 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 línea de cabecera, para leer cada registro de la tabla, o bien declarar la

tabla misma con línea 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>.

Page 4: Tablas Internas

Tablas Internas – RichardRey.com - 4

Con la primera instrucción, la cabecera también se llamará <itab>, por lo que tendremos la

sensación de que leemos la tabla interna directamente.

Ejemplo:

LOOP AT <itab>.

WRITE: <itab>-<campo1>.

ENDLOOP.

Con la segunda instrucción, cada registro que se lea de <itab> deberá tratarse desde <line>, que es

la línea de cabecera de la tabla interna.

Ejemplo:

LOOP AT <itab> INTO <line>.

WRITE: <line>-<campo1>.

ENDLOOP.

En el primer LOOP; la línea 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, están 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 líneas 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 línea de cabecera <itab>.

Page 5: Tablas Internas

Tablas Internas – RichardRey.com - 5

Llenar una tabla interna

Para ingresar datos a una tabla interna, tenemos las siguientes sentencias:

APPEND: Añade 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 línea de cabecera, el registro que leerá

lo determinará la condición 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 instrucción lee el registro ubicado en la línea <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 posición <n>)

Page 6: Tablas Internas

Tablas Internas – RichardRey.com - 6

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 posición <n>)

COLLECT: Añade o suma la línea de cabecera. Sumará los campos tipo P, F, I (tema 2), si existe una

línea en la tabla con campos idénticos (tipo C) a los del work area. El problema es que se trata de

una instrucción que consume mucho en memoria.

Ordenar una tabla interna

Para ordenar los registros de una tabla interna, utilizamos la instrucción SORT (ordenar en Inglés),

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 instrucción LOOP.

LOOP AT <itab> (WHERE <cond>)

. . .

ENDLOOP. (con cabecera)

LOOP AT <itab> INTO <line> (WHERE <cond>)

. . .

ENDLOOP. (sin cabecera)

Page 7: Tablas Internas

Tablas Internas – RichardRey.com - 7

En cada iteración, la instrucción coloca la línea de la tabla que se está procesando en la línea de

cabecera.

Con la cláusula WHERE podemos filtrar los registros que leeremos en el LOOP, tal cual como lo

haríamos en una consulta SQL; si no existe ningún registro que cumpla con la condición de la

cláusula WHERE, la variable SY-SUBRC será diferente de 0 y no habrán iteraciones en el LOOP.

Mientras haya iteraciones dentro de un LOOP, con la variable del sistema SY-TABIX podremos

saber cuál 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 específicas para el primer registro de la tabla.

• AT LAST: Instrucciones específicas 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 cláusula AT .. ENDAT irán las instrucciones que queremos programar para ese registro

en particular.

Page 8: Tablas Internas

Tablas Internas – RichardRey.com - 8

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 información de la tabla interna, como la

cantidad de líneas o registros que contiene.

Te saluda,

Richard Rey

http://aprendeabap.com