10
ABAP. Tablas internas. TABLAS INTERNAS. Una tabla interna es una tabla temporal en la memoria del servidor de aplicaciones. Es creada y mantenida por un programa durante la ejecución, y es descartada cuando el programa termina. Como una tabla de bases de datos, una tabla interna consiste de varios registros con la misma estructura, poro sus datos desaparecen cuando el programa termina. Se usa como almacén temporal para manipular datos, o como un buffer temporal privado. Una tabla interna se compone de un cuerpo y una cabecera opcional... El cuerpo es el que almacena los registros de la tabla interna. Normalmente cuando se habla de tabla interna, se refiere al cuerpo de la tabla interna. La cabecera de la tabla interna es un único registro que se utiliza para añadir y recoger datos del cuerpo de la tabla interna. Como crear una básica tabla interna: Creando con data un field string, podemos crear una tabla interna con la sintaxis: Con header: Begin of it1 occurs n. Data it1 like fs1 occurs n with header line. Sin header: Data it1 like fs1 occurs n. Pienso que no necesita explicación. El número de registros simplemente es orientativo, pese a que es posible que haya algún problema cuando nos pasamos este número, por ejemplo que no haga el rolling completo. (Consultar versiones) Es importante el número de registros (puede ser incluso cero) para la 'performance'. La mayor confusión con respecto a las tablas internas está en que el 1

Tablas en Abap

Embed Size (px)

Citation preview

Page 1: Tablas en Abap

ABAP. Tablas internas.

TABLAS INTERNAS.

Una tabla interna es una tabla temporal en la memoria del servidor de aplicaciones. Es creada

y mantenida por un programa durante la ejecución, y es descartada cuando el programa

termina. Como una tabla de bases de datos, una tabla interna consiste de varios registros con

la misma estructura, poro sus datos desaparecen cuando el programa termina. Se usa como

almacén temporal para manipular datos, o como un buffer temporal privado.

Una tabla interna se compone de un cuerpo y una cabecera opcional...

El cuerpo es el que almacena los registros de la tabla interna. Normalmente cuando se habla

de tabla interna, se refiere al cuerpo de la tabla interna.

La cabecera de la tabla interna es un único registro que se utiliza para añadir y recoger datos

del cuerpo de la tabla interna.

Como crear una básica tabla interna:

Creando con data un field string, podemos crear una tabla interna con la sintaxis:

Con header:

Begin of it1 occurs n.

Data it1 like fs1 occurs n with header line.

Sin header:

Data it1 like fs1 occurs n.

Pienso que no necesita explicación.

El número de registros simplemente es orientativo, pese a que es posible que haya algún

problema cuando nos pasamos este número, por ejemplo que no haga el rolling completo.

(Consultar versiones)

Es importante el número de registros (puede ser incluso cero) para la 'performance'.

La mayor confusión con respecto a las tablas internas está en que el cuerpo y la cabecera se

llaman igual, pero esto no es problema porque la propia codificación nos dice si estamos

usando el cuerpo o la cabecera, por ejemplo las asignaciones de campos de las tablas internas

siempre se refieren al header.

1

Page 2: Tablas en Abap

Añadir datos a una tabla interna con la sentencia append.

append it.

Añade los datos introducidos en la cabecera it (usar it como si fuera un field string) al final de la

tabla it.

append wa to it

Añade los datos de wa (un field string con la misma estructura que it).

append initial line to it

Añade un registro en 'blanco' a la tabla interna.

sy-tabix es una variable del sistema que nos dice que numero de registro es el que acabamos

de añadir.

Leyendo datos de una tabla interna

Sentencia loop at

Loop at it [into wa] [from m] [to n] [where exp].

---

endloop.

donde:

it es una tabla interna

wa es el nombre del work area (si se omite, por defecto es el header).

m y n son enteros literales, constantes o variables representando números de registros.

exp es una expresión lógica restringiendo el número de registros.

--- Son líneas de código que se ejecutan una vez por registro de la tabla interna.

Más explicaciones:

wa tiene que tener la misma estructura que la tabla interna.

wa puede ser la cabecera de la tabla interna.

Si no se especifica work area se usa por defecto la cabecera...

Si from no se especifica es el primer registro

Si to no se especifica es el último registro.

2

Page 3: Tablas en Abap

En la expresión lógica, los componentes os subcampos de la it no tienen que escribirse

it-componente, sino componente. Incluso da error si se hace así.

En exp, cualquier uso de los componentes de la tabla tiene que estar a la izquierda del

operador relación.

sy-tabix nos muestra en cualquier momento el número de registro por el que vamos.

Si hay bucles anidados, nos da el del bucle en el que estamos.

Después del bucle, es cero si se han leído registro y no-cero si no se ha leído ninguno

(comprobar).

En la condición, hay que intentar que no se hagan transformaciones que no lleguen a hacer el

programa muy pesado.

Sentencias del control de bucle.

Sentencias que alteran el bucle de proceso de tablas internas

Statement Effect

exit Termina el bucle y sigue en la línea siguiente a endloop

Continue El programa va inmediatamente a la sentencia endloop y continua el siguiente registro. Si no hay mas, línea siguiente a endloop.

Check exp Si if es true, el proceso continua y si no, lo mismo que continue.

Sentencia read table :

Se usa para leer un solo registro de una tabla interna.

read table it [into wa] [index i | with key keyexp [binary search] ] [comparing cmpexp]

[transporting texp].

it es una tabla interna

wa es un work area

i es un número de registro.

keyexp una condición para buscar el registro

cmpexp es una expresión de comparación de test sobre el registro encontrado.

texp es una expresión que representa los campos que se transportan al work area

despues que el registro ha sido encontrado.

Si comparing y transporting son especificados primero se realiza el comparing.

3

Page 4: Tablas en Abap

read table con la opción index

En una tabla interna el índice de registros es el número de registro de cada registro. En la

sentencia read table, index i, especifica el registro numero i.

Ejemplo:

read table it index 7

lee el registro 7 en cabecera.

Si es correcto: sy-subrc=0 y sy-tabix=i

Ejemplo:

REPORT .

data: begin of mitabla occurs 10,

cliente(4),

nombre(20),

importe type i,

end of mitabla.

mitabla-cliente = '0001'. mitabla-nombre = 'pepito perez'. mitabla-importe = 1000.

append mitabla.

mitabla-cliente = '0002'. mitabla-nombre = 'antonio leches'. mitabla-importe = 2000.

append mitabla.

mitabla-cliente = '0003'. mitabla-nombre = 'ramiro oveja'. mitabla-importe = 3000.

append mitabla.

mitabla-cliente = '0004'. mitabla-nombre = 'jesus boina'. mitabla-importe = 4000.

append mitabla.

mitabla-cliente = '0005'. mitabla-nombre = 'remigio gutierrez'. mitabla-importe = 5000.

append mitabla.

mitabla-cliente = '0006'. mitabla-nombre = 'wenceslao roto'. mitabla-importe = 6000.

append mitabla.

read table mitabla index 3.

write: /,

/ 'sy-subrc =', sy-subrc,

/ 'sy-tabix =', sy-tabix,

/ mitabla-cliente,

/ mitabla-nombre.

Resultado:

sy-subrc=0

4

Page 5: Tablas en Abap

sy-tabix=3

0003

ramiro obeja

Si ejecutamos con

read table mitabla index 9.

Read table con la opción key

Si se especifica la opción key keyexp, el sistema busca un registro que cumpla la expresión

clave y lo coloca en el header. Caso de encontrarse varios registros que cumplan la keyexp,

solo el primero encontrado se retorna (por orden de registro). Es de suponer que la búsqueda

que hace es secuencial.

Expresiones de la opción key y sus efectos.

Key Expression Effect

c1 = v1 c2 = v2 ... Localiza el primer registro de la tabla interna cuyo componente c1 tiene el valor v1 (literal, constante o variable) y así

sucesivamente.

(f1) = v1 (f2) = v2 ... f1 contiene el nombre del componente cuyo contenido se va a comparar. (el contenido de f1 es en mayúsculas).

= wa wa es un work area idéntico en estructura a la tabla interna. Se localiza el primer registro que es igual a wa, comparando incluso blancos... Tiene que coincidir el registro entero.

Wa wa es un work area idéntico en estructura a la tabla interna pero solo los primeros n campos.

Busca el primer registro que cumple todos los n campos. Tienen que cumplir los n campos perfectamente

valores de SY-SUBRC and SY-TABIX despues de key exp

Result sy-subrc sy-tabix

Lectura correcta. Se encontró un registro 0 index of matching row

No se encontró un registro pero hay uno con una clave mayor que la leída

4 index of row with next higher key

No se encontró un registro ni igual ni mayor, (esto a mi no me funciona)

8 number of rows in it + 1

Ejemplo anterior usando key expr:

5

Page 6: Tablas en Abap

read table mitabla with key cliente = '0004'.

Resultado:

sy-subrc=0

sy-tabix=4

0004

jesus boina

---------------------

Otro ejemplo:

read table mitabla with key cliente = '0009'.

Resultado:

sy-subrc=4

sy-tabix=0

0006

wenceslao roto

------------------------------

read table mitabla with key importe = 1000."con datos numericos

sy-subrc=0

sy-tabix=1

0001

pepito perez

---------------------------------

data clave(7) value 'CLIENTE'. read table mitabla with key (clave) = '0001'. " indirecto

sy-subrc=0

sy-tabix=1

0001

pepito perez

------------------------------------

read table con la opción binary search

Cuando usamos la opción key addition, podemos usar la opción binary search, que causa que

6

Page 7: Tablas en Abap

el registro se localice usando una búsqueda bianaria en lugar de una búsqueda lineal.

Claro que antes necesita ser indexada en ascendente orden por los componentes

especificados en la key exp. (ver la opción on sorting).

???? esto hay que mirarlo más, no sé muy bien cómo funciona cuando los valores van con

espacios....

CAUTION

Only blanks in a default key field will match all values. This means that you cannot clear types d,

t, n, and x and obtain a match-clearing will set them to zeros, not blanks. You must force blanks

into these fields for them to match. You can do this using a field string (see the following

example), using a subfield, or using a field symbol (see the previous section on field symbols for

more information).

Sin opciones como funciona?.

read table mitable.

Es como si la clave fuera todo

Usando la opción comparing.

La opción comparing es seguida por campos de la tabla, la búsqueda y el resultado es el

mismo, pero según el resultado de comparar el work area y el registro encontrado, el valor de

sy-subrc cambia.

Table 11.4 Forms for the Comparison Expression in the Read Table Statement

Cmpexp Description

f1 f2 ... Si los valores de f1, f2 son iguales en registroencontrado y work area , sy-subrc is set to 0. Si hay alguno diferente, sy-subrc es

2.

all fields Todos los campos son comparados.

no fields No se compara nada, valor por defecto

El workarea es la cabecera o el into workarea. Hemos de tener en cuenta pues, el contenido

inicial del workarea.

La utilidad de esta opción es evitarse unos if despues del read table.

La opción transporting:

La opción transporte, es para indicar los campos del registro encontrado que pasarán al

workarea.

7

Page 8: Tablas en Abap

Table 11.5 Forms for the Transporting Expression in the READ TABLE Statement

Cmpexp Description

f1 f2 ... After a row is found, the value of f1 in the found row overlays the value of f1 in the work area. Then the value of f2 overlays

the value of f2 in the work area, and so on. Only the components named after transporting are moved. All other

components remain unchanged.

All fields All fields are transported. This is the default, and has the same effect as leaving off the transporting addition.

no fields No fields are transported. None of the fields in the work area are changed.

Es util para controlar el contenido del workarea si encuentra un registro.

ORDENANDO EL CONTENIDO DE UNA TABLA INTERNA

Para ordenar el contenido de una tabla interna, hay que usar la sentencia sort. Los registros

son ordenados por una o más columnas en orden ascendente o descendente. La secuencia de

ordenación puede ser modificada.

Syntax de la sentencia SORT

sort it [descending] [as texto] [by f1 [ascending|descending] [as texto]

f2 ...].:

it el nombre de una tabla interna.

f1 y f2 son campos de la tabla interna

La tabla se ordena con los campos indicados con la opción de ascending/descending

y/o como texto..

Más propiedades:

ascending es por defecto.

Si descending aparece antes de los campos, se aplica a todos los campos por defecto.

Por defecto se ordena por la clave por defecto , que son los campos char de la tabla en

orden ascendiente.

El orden de registros con la misma clave es impredecible.

La opción texto, se refiere a las palabras acentuadas y ñ's. Por defecto en un entorno ASCII se

ordena por código ASCII del carácter.

8

Page 9: Tablas en Abap

EL texto environment (entorno de texto) es un conjunto de características asociadas con el

lenguaje al hacer el usuario logon. Se caracteriza por el conjunto de caracteres utilizados y su

secuencia. Se puede cambiar usando la sentencia set locale. La variable del sistema sy-langu

guarda el contenido de lenguaje especificado

En todo caso lo siguiente se aplica a la opción texto en la sentencia sort.

Solo se aplica a campos tipo c.

Puede especificarse para todos o campo por campo.

9