jueves, 24 de julio de 2008

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 almacen 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 unico registro que se utiliza para añadir y recoger datos del cuerpo de la tabla interna.

Como crear una basica 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 numero 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 'perfomance'.

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 los asignamientos de campos de las tablas internas siempre se refieren al header.

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 conla 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 numeros de registros.
  • exp es una expresión lógica restrigiendo el numero de registros.
  • --- Son lineas de codigo que se ejecutan una vez por registro de la tabla interna.
Mas explicaciones:
  • wa tiene que tener la misma estructura que la tabla interna.
  • wa puede ser la cabecera de la tabla interna.
  • Si no se expecifica work area se usa por defecto la cabecera..
  • Si from no se especifica es el primer registro
  • Si to no se especifica es el ultimo registro.
  • En la expresion logica, los componentes os subcampos de la it no tienen que escribirse it-componente, sino componente. Incluso da error si se hace asi.
  • En exp, cualquie 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 numero de registro por el que vamos.
Si hay bucles anidados, nos da el del bucle en el que estamos.
Despues del bucle, es cero si se han leido registro y no-cero si no se ha leido ninguno (comprobar).

En la condición, hay que intentar que no se hagan transformaciones que no llegen a hacer el program amuy pesado.


Sentencias del control de bucle.
Sentencias que alteran el bucle de proceso de tablas internas
Statement
Effect
exitTermina el bucle y sigue en la linea siguiente a endloop
ContinueEl programa va inmediatamente a la sentencia endloop y continuea el siguiente registro. Si no hay mas, linea 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 expresion de comparación de test sobre el registro encontrado.
  • texp es una expresion 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.


read table con la opcion index
En una tabla interna el indice de registros es el numero 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
sy-tabix=3
0003
ramiro obeja

Si ejecutamos con
read table mitabla index 9.
cRead table con la opcion 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 busqueda que hace es secuencial.

Expresiones de la opcion 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 vaariable) 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 mayusculas).
= wawa es un work area identico 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.
Wawa 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 encontro un registro
0
index of matching row
No se encontro un registro pero hay uno con una clave mayor que la leida
4
index of row with next higher key
No se encontro un registro ni igual ni mayor, (esto a mi no me funciona)
8
number of rows in it + 1
-----------------------
Ejemplo anterior usando key expr:

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 opcion binary search

Cuando usamos la opcion key addition, podemos usar la opcion binary search, que causa que el registro se localice usando una busqueda bianaria en lugar de una busqueda lineal.
Claro que antes necesita ser indexada en ascendente orden por los componentes especificados en la key exp. (ver la opcion on sorting).

???? esto hay que mirarlo mas, no se muy bien como 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 opcion comparing.


La opcion comparing es seguida por campos de la tabla, la busqueda 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 fieldsTodos los campos son comparados.
no fieldsNo 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 opcion transporte, es para indicar los campos del registro encontrado que pasarán al workarea.

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 fieldsAll fields are transported. This is the default, and has the same effect as leaving off the transporting addition.
no fieldsNo 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 mas colunas en orden ascendente o descendente.

La secuencia de ordenación puede ser modificada.

Syntax de la sentencia SORT


sort it [descending] [as text] [by f1 [ascending|descending] [as text]
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..

mas 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 tagbla en orden ascendiente.
El orden de registros con la misma clave es impredecible.


La opción text, se reffiere a las palabras acentuadas y ñ's. Por defecto en un entorno ASCII se ordena por codigo ascii del caracter.

EL text environment(entorno de texto) es un conjunto de caracteristicas asociadas con el lenguaje al hacer el usuario logon. Se caracteriza por el conjunto de caracteres utilizados y su secuencia. Se puede puede cambiar usando la sentencia set locale. La variable dels sistema sy-langu guarda el contenido de lenguaje especificado

En todo caso lo siguiente se aplica a la opcion text en la sentencia sort.
  • Solo se aplica a campos tipo c.
  • Puede especificarse para todos o campo por campo.


xxxx
xxxx