Está en la página 1de 22

Tablas internas

Alejandro Torrijos Pgina 1




TABLAS INTERNAS
Introduccin:
Hay dos maneras de procesar datos en ABAP, tablas internas o un
extracto de datos. Todas las entradas de una tabla interna deben tener
la misma estructura. Podemos acceder a una lnea mediante una clave.
En ABAP las tablas internas hacen la funcin de los arrays en otros
lenguajes de programacin. El uso ms frecuente de una tabla interna
es almacenar en memoria los datos de una tabla de una base de datos
durante la ejecucin de un programa ABAP.
Por lo tanto, las tablas internas son memoria dinmica, es decir, se
crean en tiempo de ejecucin del programa en la parte de memoria RAM
asignada para este propsito (HEAP), y desaparecen una vez que se ha
ejecutado el bloque o programa para el que se haban creado.
Una tabla almacena un determinado nmero de lneas o registros del
tipo declarado en TYPES. El tamao mximo de una tabla interna en una
arquitectura de 32 bits es de 500 megabytes (o 2 millones de lneas
para tablas hashed).
Tablas internas

Alejandro Torrijos Pgina 2

Las tablas planas (flat structures) son estructuras complejas
compuestas por elementos ms simples o campos (por ejemplo
variables de tipo i, p, c, o d).
Una tabla profunda (deep) puede incluir a su vez estructuras complejas
de forma recursiva, por ejemplo otras tablas.
Tipo de lnea de una tabla interna:
Suele ser normalmente una estructura, aunque podra ser cualquier
tipo. Cada componente de la estructura es una columna de la tabla
interna. El tipo puede ser elemental (c, d, f, i, n, p, t, x) o complejo
(incluso otra tabla).
La clave:
La clave identifica cada entrada de una tabla. Hay dos tipos de claves:
clave estndar y la clave definida por el usuario. El programador puede
decidir si la clave es nica (UNIQUE) o no (NON-UNIQUE). Si la clave es
nica no puede haber entradas duplicadas. La clave de las tablas
estndar NO puede ser nica. La clave de las tablas hashed siempre es
nica.
En todas las tablas con un tipo de lnea estructurada, la clave estndar
la forman todas las columnas (excepto si son punteros o tablas
internas). Los campos claves podran incluso ser estructuras anidadas.
Por defecto una lnea con estructuras anidadas tiene una clave que va
extendindose componente a componente dentro del anidamiento.
Si la tabla tiene una lnea estructurada, la clave por defecto son todos
los campos de tipo carcter (c, d, t, n, x, string, xstring).
Si la tabla interna tiene como tipo de lnea una tabla interna NO tiene
clave por defecto.
Si la tabla tiene un tipo de lnea no estructurada, la clave estndar es
toda la fila.
Para declarar una clave por defecto usamos la instruccin
UNIQUE/NON-UNIQUE DEFAULT KEY.
Una clave definida por el usuario puede contener cualquier columna que
no contenga una tabla interna.
Tablas internas

Alejandro Torrijos Pgina 3

No es obligatorio declarar una clave. En este caso el sistema selecciona
una clave arbitrariamente. Esto slo es vlido para field symbols y para
pasar la tabla como un parmetro a procedimientos.
Se puede definir un puntero como clave interna.
La secuencia de los campos es importante a la hora de definir la clave,
por ejemplo cuando intentamos ordenar una tabla de por su clave.
Tablas internas genricas:
No es necesario declarar completamente el tipo de una tabla interna.
Una tabla interna se puede declarar como una tabla genrica. Por
ejemplo podemos NO especificar la clave, o el tipo de lnea.
Podemos usar tablas internas genricas para declarar el tipo de un field
symbol, o los parmetros de un procedimiento, pero NO para declarar
un objeto (data object).
Tipos de tablas internas segn el tipo de acceso:
Acceso a travs de un ndice:
o El ndice se guarda en la variable de sistema sy-tabix.
o Este es el modo ms rpido de acceder a un registro pero
slo podemos usarlo si conocemos el ndice de un
determinado registro en la tabla.
o No todas las tablas tienen asignado un ndice interno (por
ejemplo las tablas hashed)
Acceso a travs de una clave:
o La clave puede ser nica o mltiple.
o Este es el modo universal en que podemos acceder a un
registro determinado de cualquier tipo de tabla.
Tipos de tablas segn la ordenacin:
Tablas estndar (Standard table):
o Este es el tipo de tabla que se crea por defecto si no se
indica otra cosa en el programa.
o Las lneas de este tipo de tabla estn organizadas segn un
ndice interno.
o Para buscar un registro determinado podemos hacerlo por el
ndice o por la clave. En este ltimo caso el sistema compara
uno a uno todos los registros de la tabla hasta encontrar el
o los que buscamos (bsqueda lineal).
Tablas internas

Alejandro Torrijos Pgina 4

o La clave de una tabla estndar siempre es mltiple e incluye
todos los campos no numricos de dicha tabla. Esto significa
que el sistema no comprueba si se repiten entradas en una
tabla.
o Este tipo de tabla ocupa menos memoria y se le pueden
aadir registros muy rpidamente, pero es poco eficiente si
necesitamos buscar registros con frecuencia (sobre todo si la
base de datos tiene muchas entradas). El tiempo de
bsqueda se incrementa linealmente con el nmero de
registros.
o Las tablas estndar se deben rellenar aadiendo lneas
mediante la instruccin APPEND.
o Preferiblemente deben leerse, modificar o borrar entradas
especificando el ndice mediante la instruccin INDEX.
o En caso de usar la clave, no se deben hacer las adiciones de
lneas y las bsquedas al mismo tiempo. Sera mejor aadir
las lneas y luego ordenar la tabla mediante la instruccin
SORT. Una vez ordenada la tabla podemos hacer una
bsqueda binaria usando la clave mediante la instruccin
BINARY. Si la tabla tiene muchas entradas la bsqueda
binaria es mucho ms eficiente que la bsqueda lineal.
Tablas ordenadas (Sorted table):
o Las lneas o registros tienen tambin asignado un ndice
interno, pero aparecen ordenados en orden ascendente de
acuerdo con la clave.
o La clave puede ser simple (UNIQUE) o mltiple
(NON-UNIQUE).
o El acceso a este tipo de tablas se puede hacer a travs de
un ndice o a travs de la clave. En este ultimo caso el
sistema utiliza un algoritmo de bsqueda binaria.
o La modificacin de este tipo de tabla es ms lenta, ya que
necesita encontrar el lugar que debe ocupar el nuevo
registro, pero el acceso es mucho ms rpido ya que el
algoritmo de bsqueda va dividiendo la base de datos en
dos hasta llegar al registro que buscamos.
o El tiempo de bsqueda se incrementa de forma logartmica a
medida que aadimos ms registros a la tabla.
o Para insertar lneas en una tabla ordenada usamos la
instruccin INSERT.
o Si el nuevo registro de la tabla entra en conflicto con un
registro existente (por ejemplo si se repite la clave) se
detecta al momento.
Tablas internas

Alejandro Torrijos Pgina 5

o Las tablas ordenadas son especialmente tiles para procesar
secuencias parciales de una tabla en un LOOP si
especificamos el inicio de la clave mediante una condicin en
el WHERE.
Tablas hashed (Hashed table):
o En este tipo de tabla no podemos acceder a una entrada
mediante el ndice.
o El orden de los registros de este tipo de tablas no se hace
mediante un ndice sino a travs de un algoritmo de tipo
numrico (hashed function) que calcula la posicin de un
determinado registro partiendo de una determinada clave.
o La clave siempre tiene que ser nica.
o La funcin o algoritmo hashed debe intentar evitar (o al
menos gestionar de alguna manera) el problema de las
colisiones, es decir el hecho de que dos valores distintos de
la clave den como resultado una misma posicin en la tabla.
o Tambin est el problema de la fragmentacin de la
memoria, es decir que la funcin hashed sea tal que nunca
d como resultado una determinada posicin de la tabla, y
por lo tanto ese rea de memoria quede en blanco.
o La modificacin de la tabla es ms lento que una tabla
estndar ya que para cada nuevo registro el sistema tiene
que calcular antes mediante la funcin hashed el lugar que
debe de ocupar.
o El tiempo de acceso a un determinado registro es constante
(independiente del nmero de entradas que tenga la base de
datos) y es siempre menor que el de los otros tipos de
tablas. Tan slo depende del algoritmo y de la rapidez del
sistema, y suele ser muy pequeo, unos 17 nanosegundos.
o Este tipo de tablas es el ms adecuado si la accin ms
frecuente es acceder a una lnea por la clave. Esto ser as
cuando queramos crear una tabla interna que se parezca a
una tabla de la base de datos. Tambin es el ms adecuado
si deseamos procesar grandes cantidades de datos.
Creacin de una tabla interna:
Lo primero es definir la estructura de la tabla interna como un tipo de
datos abstracto en el programa ABAP (mediante la instruccin TYPES) o
en el Dictionary. Luego, basndonos en ese tipo de datos, creamos la
tabla interna mediante la instruccin DATA.
El tamao de cada uno de los componentes de la cabecera de una tabla
es de ocho bytes. El tamao total de la tabla interna NO est definido al
Tablas internas

Alejandro Torrijos Pgina 6

declarar la tabla, puesto que los distintos registros de una tabla se
aaden de forma dinmica (en tiempo de ejecucin del programa).
Para declarar una estructura de una tabla:
TYPES: BEGIN OF tabla,
Columna1 TYPE c,
Columna2 TYPE c,
END OF tabla.
Para declarar un tipo de tabla interna (estndar/ordenada), con un tipo
de lnea como la tabla anterior, con la columna1 como clave nica y un
tamao inicial de 100 lneas:
TYPES t1 LIKE STANDARD TABLE OF tabla WITH UNIQUE KEY
columna1 INITIAL SIZE 100.
TYPES t2 LIKE SORTED TABLE OF tabla WITH UNIQUE KEY
columna1 INITIAL SIZE 100.
Si declaramos un tamao inicial de la tabla (en este caso 100 lneas) el
sistema reserva espacio en memoria para ese tamao. Cuando llegamos
al final de las 100 lneas el sistema automticamente reserva espacio en
memoria para otras 100 lneas. Normalmente no es necesario declarar
el tamao inicial de la tabla.
Para declarar una tabla interna hashed sobre un tipo existente en el
Dictionary:
DATA t TYPE HASHED TABLE OF tabla WITH UNIQUE KEY
columna1 INITIAL SIZE 100.
El tipo de tablas definido por nosotros no existe por derecho propio, y
tan slo podemos crear tablas de ese tipo con la instruccin LIKE, nunca
con la instruccin TYPE. Esta instruccin est reservada para los tipos
elementales o las tablas definidas en el Dictionary. Los data objects del
Dictionary tienen que tener todos los atributos del tipo declarados (no
pueden ser data objects genricos). Tan slo nos podemos referir con la
instruccin LIKE a tablas que tienen el tipo completamente definido. No
podemos referirnos a tablas genricas.
Tablas internas

Alejandro Torrijos Pgina 7

Aunque se considera obsoleto podemos definir una tabla con una
cabecera (WITH HEADER LINE). Esto supone crear un nuevo objeto
(header line) con el mismo nombre y tipo que la tabla interna. Se usa
como un rea de trabajo cuando operamos con la tabla. Cuando se tabaja con
cabeceras ABAP entiende que cuando nos dirigimos a una tabla en
realidad nos dirigimos a la cabecera de la tabla. Para hacer saber al
sistema que hacemos referencia al cuerpo de la tabla debemos escribir
dos parntesis cuadrados detrs (por ejemplo tabla1[]) detrs del
nombre de la tabla. Las tablas con otras tablas internas anidadas no
permiten el uso de las cabeceras (header line).
Para crear una tabla genrica indexada
DATA t INDEX TABLE.
Para crear una tabla totalmente genrica
DATA t ANY TABLE.
Estos dos ltimos tipos de tablas se usan slo para asignar field symbols
y para pasar una tabla como parmetro a un procedimiento.
Asignacin de una tabla interna:
Podemos copiar tablas internas de dos maneras:
MOVE tabla1 TO tabla2.
tabla2 = tabla1.
Estas instrucciones asignan el contenido completo de la tabla1 a la
tabla2, incluyendo cualquier anidamiento. Los contenidos de la tabla2 se
sobrescriben con los de la tabla1. Las dos tablas deben ser compatibles
o bien convertibles entre s.
Si asignamos una tabla NO ordenada a una tabla ordenada, los
contenidos se ordenan automticamente por la clave de la segunda.
Inicializacin de una tabla interna:
Podemos inicializar una tabla interna con la instruccin:
CLEAR tabla1.
Tablas internas

Alejandro Torrijos Pgina 8

Si queremos inicializar el cuerpo de una tabla con cabecera (header line)
debemos usar parntesis:
CLEAR tabla1[].
Para asegurarse de que la tabla ha sido inicializada podemos usar la
instruccin:
REFRESH tabla1.
Esto ltimo siempre se realiza sobre el cuerpo de la tabla.
Si queremos eliminar el requisito inicial de memoria que el sistema
reserva por defecto para una tabla interna usamos la siguiente
instruccin:
FREE tabla1.
Despus de ejecutar esta instruccin de la tabla slo queda la cabecera,
que tan slo ocupa 256 bytes. A medida que llenamos la tabla el
sistema reserva ms espacio para esta tabla.
Tambin podemos comprobar si la tabla est vaca con la instruccin IS
INITIAL de la siguiente manera:
IF tabla1 IS INITIAL.
WRITE la tabla est vacia.
Comparando tablas internas:
Podemos usar tablas internas como operando en expresiones lgicas.
Uno de las expresiones lgicas ms comunes es ver si dos tablas
internas son iguales, por ejemplo:
IF tabla1 EQ tabla2.
WRITE las dos tablas son iguales.
Ordenando tablas internas:
Para ordenar una tabla por su clave:
SORT tabla1.
Tablas internas

Alejandro Torrijos Pgina 9

Por defecto las tablas se ordenan en orden ascendente. La clave por
defecto de una tabla estndar se compone de los campos NO numricos.
La secuencia de los campos determina cmo se van a ordenar los
registros.
Para ordenar una tabla en orden descendente:
SORT tabla1 DESCENDING.
Podemos ordenar una tabla interna por uno o varios campos:
SORT tabla1 BY columna1 columna2.
Podemos ordenar una tabla por varios campos en orden inverso:
SORT tabla1 BY DESCENDIGN columna1 ASCENDING columna2.
Podemos ordenar una tabla por un campo que se determina
dinmicamente:
DATA: a(15) TYPE c VALUE columna1.
SORT tabla1 BY (a).
Si el campo es un puntero podemos usar el objeto al que apunta para
ordenar la tabla:
SORT tabla1 BY puntero1->variable1.
Podemos ordenar una tabla por la clave y pedir que la tabla se ordene
en orden alfabtico:
SORT tabla1 AS TEXT.
Esto afecta el modo en que se ordenan los campos tipo carcter. Si no
se indica nada el sistema ordena por el orden alfabtico del cdigo
usado en la plataforma (por ejemplo ASCII). Si se indica este atributo,
el sistema usa la lengua del logon (por ejemplo ingls). Mediante el uso
de esta instruccin no necesitamos convertir los campos tipo string a un
tipo de formato que se pueda ordenar alfabticamente. Para hacer esto
necesitaramos la instruccin:
CONVERT TEXT campo1 INTO SORTABLE CODE campo2.
Tablas internas

Alejandro Torrijos Pgina 10

El campo1 debe ser de tipo carcter y el campo2 hexadecimal.
Si queremos cambiar la lengua de forma local para ese programa:
SET LOCALE LANGUAGE
Si queremos ordenar una tabla de forma estable, es decir que no vare
cada vez que la ordenemos por la misma clave, usamos la instruccin
STABLE. Esto es til cuando el campo por el que estamos ordenando
tiene valores repetidos.
SORT tabla1 BY columna1 STABLE.
Tablas internas como parmetros:
Podemos pasar tablas internas a un procedimiento como parmetros por
valor o por referencia.
Podemos especificar parmetros en subrutinas y funciones como tablas
internas con la instruccin TABLES. Esta instruccin define el parmetro
como una tabla interna estndar con cabecera y la clave por defecto.
Si le pasamos a la funcin una tabla sin cabecera el sistema la crea por
defecto.
Describiendo los atributos de una tabla interna:
Para saber los atributos de una tabla interna en tiempo de ejecucin
utilizamos la instruccin:
DESCRIBE TABLE tabla LINES x OCCURS n KIND clase.
El parmetro LINES asigna el nmero de lneas que tiene la tabla a la
variable x.
El parmetro OCCURS asigna el tamao inicial de la tabla a la variable
n.
El parmetro KIND asigna el tipo de tabla a la variable clase.
T: tabla estndar.
S: Tabla ordenada (sorted).
H: Tabla hashed.
Tablas internas

Alejandro Torrijos Pgina 11

Trabajando con una lnea individual:
El principal uso de las tablas internas es cargar una gran cantidad de
datos de la base de datos a la memoria interna del sistema para, de
esta manera, trabajar rpido y eficientemente.
Para acceder a una lnea individual de una tabla podemos hacerlo segn
el ndice interno o la clave. Las tablas estndar y las tablas ordenadas
tienen un ndice interno que nos indica el nmero de lnea. Las tablas
hashed no tienen ndice. Para acceder a una lnea en una tabla hashed
debemos usar la clave.
El acceso a travs del ndice siempre es el ms rpido, puesto que la
referencia del ndice se guarda internamente en el sistema. Sin embargo
no siempre sabemos la asociacin entre el contenido de una lnea y el
ndice. Por eso la mayora de los programas acceden a una tabla a
travs de una clave.
Cuando accedemos a una lnea individual la variable de sistema sy-tabix
guarda el ndice de la lnea.
Tablas estndar: Podemos acceder a una lnea por medio del
ndice o de la clave. Preferiblemente debemos acceder a travs del
ndice. La clave nunca es nica.
Tablas ordenadas: Podemos acceder a una lnea por medio de
una clave o de un ndice. Preferiblemente debemos acceder a
travs de la clave. La clave puede ser nica o no.
Tablas hashed: Podemos acceder a una lnea tan slo mediante
la clave, que siempre es nica.

Mtodos de acceso a una lnea individual:
rea de trabajo:
Un rea de trabajo es una interfaz a la tabla interna, y debe ser
compatible con el tipo de lnea de la tabla interna. Al leer una entrada
de una tabla, los datos se sobrescriben sobre los contenidos previos del
rea de trabajo. Estos datos se pueden usar en un programa.

Para escribir datos en una tabla interna primero se escriben en un rea
de trabajo y luego se transfieren a la tabla interna mediante la
instruccin MOVEINTO.
Tablas internas

Alejandro Torrijos Pgina 12


Para modificar datos mediante un rea de trabajo usamos la instruccin
MODIFY.

Si la tabla interna tiene una cabecera, sta se puede usar como rea de
trabajo.

Field Symbol:
Al usar un field symbol no es necesario copiar los datos a un rea de
trabajo. Simplemente asignamos la lnea de la tabla interna al field
symbol. El field symbol debera tener el mismo tipo que la tabla interna.

Una vez asignado, trabajar con el field symbol es lo mismo que trabajar
con la lnea directamente.

Cuando leemos entradas de una tabla, bien sea mediante la instruccin
READ o mediante la instruccin LOOP, podemos asignarlas a un field
symbol aadiendo ASSIGNING <f>, siendo f el nombre del field symbol.

En este momento el field symbol apunta a la direccin de memoria que
contiene la lnea. El field symbol permite cambiar el contenido de una
tabla directamente.

Es importante NO cambiar el contenido de los campos claves de una
tabla ordenada o hashed, lo que dara un error en tiempo de ejecucin.

El field symbol es ms eficiente que un rea de trabajo a la hora de
modificar datos en tablas complicadas, especialmente si tienen otras
tablas anidadas.

A la hora de leer tablas internas mediante la instruccin READ usando
un field symbol el sistema tiene primero que registrar la asignacin (es
decir copiar la direccin de la tabla en el field symbol). Si borramos una
lnea a la que apunta un field symbol el sistema tiene primero que
desasignarlo para evitar errores.

Para leer (READ) tablas cuya lnea tenga una longitud de ms de 1000
bytes, los field symbols resultan ms eficientes que las reas de trabajo.

Para modificar (MODIFY) tablas cuya lnea tenga una longitud de ms de
100 bytes los field symbols resultan ms eficientes que las reas de
trabajo.

Tablas internas

Alejandro Torrijos Pgina 13

A la hora de procesar lneas de una tabla mediante la instruccin LOOP
usando un field symbol el sistema no registra la asignacin del field
symbol a cada lnea leda, sino que registra una asignacin general a la
tabla. Al terminar el loop el field symbol queda asignado a la ltima
tabla leda. Cuando una tabla tiene ms de 10 entradas resulta ms
eficiente usar un field symbol. Dentro del loop el field symbol no puede
reasignase a otra tabla, es decir, no podemos usar la instruccin
ASSIGN dentro del loop para el mismo field symbol.

Veamos un ejemplo:

DATA: BEGIN OF fecha,
mes TYPE i,
dia TYPE i,
END OF fecha.
DATA tabla LIKE SORTED TABLE OF fecha WITH UNIQUE KEY mes.
FIELD-SYMBOLS <f> LIKE LINE OF tabla.
DO 4 TIMES.
fecha-mes = sy-index.
fecha-dia = sy-index * 2.
APPEND edad TO table.
ENDDO.
READ TABLE tabla WITH TABLE KEY MES = 2 ASSIGNING <f>.
IF <f> IS ASSIGNED.
WRITE asignado.
ENDIF.
DELETE tabla INDEX 2.
LOOP AT tabla ASSIGNING <f>.
WRITE: / <f>-mes,
<f>-dia.
ENDLOOP.

Data references (punteros):
Podemos asignar una lnea de una tabla interna a un puntero. El puntero
debera ser del mismo tipo que la tabla interna. Una vez asignado un
puntero, podemos trabajar con el mismo (una vez de-referenciado) igual
que si trabajramos con la tabla directamente.

Insertando lneas:
Cuando queremos aadir una lnea a una tabla hashed (o a una tabla
genrica) debemos usar la instruccin INSERTINTO TABLE. Si
Tablas internas

Alejandro Torrijos Pgina 14

aadimos la instruccin INITIAL LINE se inserta una lnea con los valores
por defecto para cada uno de los campos de la tabla.
Tambin usamos la instruccin INSERT cuando queremos insertar una
lnea en cualquier tipo de tabla. En el caso de las tablas estndar es lo
mismo que si usamos el comando APPEND. Los campos de la lnea
deben ser compatibles. Si la tabla tiene una clave nica no podemos
insertar una lnea con el valor de la clave repetido. Si la clave no es
nica los duplicados se insertan encima de la lnea existente.
Para insertar varias lneas usamos la instruccin
INSERT LINES OF tabla1 FROM x TO y INTO TABLE tabla2.
Para indicar las lneas que se van a insertar debe ser una tabla
indexada. Este mtodo es ms rpido que insertarlas en un loop.
Podemos insertar varias lneas usando el ndice:
INSERT LINES OF tabla1 FROM x TO y INTO tabla2 INDEX n.
Podemos insertar una lnea usando el ndice:
INSERT linea INTO tabla INDEX n.
Sin el aadido INDEX tan slo podemos usar esta instruccin en un loop.
La lnea se inserta justo antes de la lnea con el ndice n. Tambin
podemos sustituir linea por INITIAL LINE.
Sumando lneas:
Para crear tablas internas agregadas usamos la instruccin COLLECT.
COLLECT wa INTO tabla.
Siendo wa un rea de trabajo. La tabla debe tener una estructura plana
y los campos que no son claves deben ser numricos (f, i, p). La
instruccin COLLECT no aade una nueva lnea, sino que aade los
contenidos de los campos numricos a los correspondientes campos de
la tabla, siempre que la clave sea la misma. Por ejemplo:
DATA. BEGIN OF linea,
col1(1) TYPE c,
Tablas internas

Alejandro Torrijos Pgina 15

col2(1) TYPE c,
col3 TYPE i,
END OF linea.
DATA tabla LIKE SORTED TABLE OF linea WITH NON UNIQUE KEY
col1 col2.
linea-col1 = a.
linea-col2 = b.
linea-col3 = 1.
COLLECT linea INTO tabla.
linea-col1 = a.
linea-col2 = b.
linea-col3 = 1.
COLLECT linea INTO tabla.
WRITE linea-col3.

En este caso la ltima instruccin mostrar el valor de 2.

Aadiendo lneas:
Cuando queremos aadir una lnea a una tabla indexada debemos usar
la instruccin APPENDTO. Puesto que la lnea se aade al final de la
tabla no tiene que comprobar las dems lneas.
APPEND linea TO tabla.

Actualmente los ndices de una tabla indexada se estructuran en forma
de rbol para que el acceso a una determinada lnea sea ms eficiente.
Podemos sustituir linea con la expresin INITIAL LINE, que aade una
lnea con los valores por defecto para cada campo.

Despus de insertar una nueva lnea, la variable sy-tabix guarda el
ndice de la lnea aadida. No se pueden aadir lneas con la clave
repetida a tablas ordenadas con clave nica o a tablas hashed.

Podemos aadir lneas de una tabla a otra:

APPEND LINES OF tabla1 FROM x TO y TO tabla2.

Podemos aadir una lnea y ordenar una tabla al mismo tiempo. Para
ello primero creamos una tabla vaca mediante la instruccin INITIAL
Tablas internas

Alejandro Torrijos Pgina 16

SIZE y luego aadimos una o varias lneas a la tabla y ordenamos esta
ltima por un campo:

APPEND linea TO tabla SORTED BY campo.

Esta instruccin no se puede usar con tablas ya ordenadas (sorted). Por
defecto la tabla se ordena en orden descendiente. La tabla interna no
puede contener ms entradas que las especificadas en la declaracin
inicial (INITIAL SIZE).

Si la tabla tiene muchas lneas es preferible no usar esta instruccin.

Leyendo lneas de una tabla:

Para leer una sola lnea de una tabla usamos la instruccin READ
TABLE... Si se encuentra una entrada para leer la variable de sistema
sy-subrc guarda un 0, si no guarda un 4. La variable sy-tabix guarda el
ndice de la lnea que encuentra.

Para leer de acuerdo con la clave de la tabla

READ TABLE tabla WITH TABLE KEY k = x.

Si el valor x no es compatible con el campo el sistema lo convierte.
Tambin se puede buscar en una parte del campo mediante offset y
length.

READ TABLE tabla WITH TABLE KEY k+2(3) = x.

En este caso el sistema busca 3 caracteres del campo k a partir del
segundo carcter.

La clave de bsqueda puede ser la clave de la tabla u otro campo
cualquiera. En este ltimo caso se puede especificar que la bsqueda
sea binaria.

READ TABLE tabla WITH KEY k = x BINARY SEARCH.

Podemos especificar el nombre de la clave de forma dinmica:

n = k.
READ TABLE tabla WITH KEY (n) = x.

Tablas internas

Alejandro Torrijos Pgina 17

Si la tabla incluye un campo que es un puntero:

READ TABLE tabla WITH KEY puntero->x.

Podemos leer entradas de una tabla en un rea de trabajo:

READ TABLE tabla WITH KEY k = x INTO wa.

Podemos comparar los campos de la tabla y del rea de trabajo antes de
leerlos.

READ TABLE tabla INTO wa COMPARING campo2.

En este caso el sistema compara el campo2 y guarda un 0 en la variable
sy-subrc si son iguales y un 2 si no son iguales. Tambin podemos
comparar todos los campos:

READ TABLE tabla INTO wa COMPARING ALL FIELDS.

Podemos copiar tan solo algunos campos:

READ TABLE tabla INTO wa TRANSPORTING campo2.

Incluso podemos no copiar ningn campo:

READ TABLE tabla TRANSPORTING NO FIELDS.

En este caso el sistema tan slo llena el contenido de las variables
sy-tabyx y sy-subrc.

Podemos usar un field symbol para leer una entrada de una tabla:

READ TABKE tabla WITH KEY k = x ASSIGNING <f>.

El field symbol <f> apunta a la lnea leda.

Tambin podemos usar el ndice para leer una lnea de una tabla:

READ TABLE tabla ASSIGNING <f> INDEX n.

Usar el ndice para leer una tabla es ms rpido que usar la clave.

Tablas internas

Alejandro Torrijos Pgina 18

Procesando tablas con loops:

Podemos procesar entradas de una tabla mediante la instruccin LOOP
AT...ENDLOOP.

Si no se especifica nada se procesan todas las entradas de la tabla. Las
tablas indexadas se procesan segn el ndice. Las tablas hashed segn
el orden en que se insertaron.

Podemos anidar varios loops.

En un loop no podemos usar instrucciones que afecten a toda la tabla.

Para rellenar un rea de trabajo mediante un loop:

LOOP AT tabla INTO wa.

Para asignar lneas a un field symbol mediante un loop:

LOOP AT tabla ASSIGNING <f>.

Si tan solo queremos usar el ndice de una tabla y no los contenidos
usamos la instruccin:

LOOP AT tabla TRANSPORTING NO FIELDS.

Podemos incluir condiciones lgicas en un loop:

LOOP AT tabla WHERE

Podemos controlar el nivel de procesado dividiendo la tabla en grupos
segn el contenido de los campos, primero por la primera columna,
luego la siguiente, etctera. Para ello usamos la instruccin ATENDAT,
y los modificadores FIRST (primera lnea de la tabla), LAST (ltima lnea
de la tabla), NEW (nuevo grupo), END OF (final del grupo).

Por ejemplo podemos dividir una tabla de alumnos de un colegio por
clases:

LOOP AT tabla INTO linea.
AT NEW clase.

ENDAT.
Tablas internas

Alejandro Torrijos Pgina 19


Tambin podemos aadir una lnea en blanco al final de un grupo:

AT END OF clase.
ULINE.
ENDAT.

Podemos sumar el contenido de unos campos numricos:

AT END OF columna1.
SUM.
ENDAT.

Podemos usar el ndice de una tabla en un loop:

LOOP AT tabla FROM x TO y.

Modificando lneas en una tabla:

Para cambiar el contenido de una sola entrada usamos la instruccin:

MODIFY TABLE tabla FROM wa TRANSPORTING columna1.

El sistema busca en la tabla interna la lnea cuya clave coincide con la
del rea de trabajo. El contenido de los campos que no son clave se
copia en los correspondientes campos de la tabla. En este caso tan slo
se copia la columna1. El uso del aadido TRANSPORTING es opcional.

Tambin podemos modificar varias lneas mediante una condicin:

MODIFY tabla FROM wa TRANSPORTING cloumna1 WHERE

En este caso el uso del aadido TRANSPORTING es obligatorio.

Tambin podemos usar el ndice:

MODIFY tabla FROM wa INDEX n.

En este caso el contenido del rea de trabajo sustituye el contenido de
la lnea con el ndice n. Es importante recordar que en una tabla
ordenada no podemos cambiar el contenido de la clave.

Tablas internas

Alejandro Torrijos Pgina 20

Borrando lneas:
Podemos borrar una lnea desde un rea de trabajo:

DELETE TABLE tabla FROM wa.

En este caso se borraran las entradas de la tabla cuya clave coincida
con la clave del rea de trabajo wa.

Tambin podemos borrar una lnea por la clave:

DELETE TABLE tabla WITH TABLE KEY k = x.

Tambin podemos borrar una lnea poniendo una condicin (expresin
lgica):

DELETE tabla WHERE

Podemos borrar entradas duplicadas adyacentes:

DELETE ADJACENT DUPLICATE ENTRIES FROM tabla.

En este caso borraramos aquellas entradas que tienen los mismos
valores en los campos claves.

Tambin podemos borrar entradas que tengan el mismo valor en los
campos especificados mediante el aadido COMPARING:

DELETE ADJACENT DUPLICATE ENTRIES FROM table COMPARING
campo1 campo2

Tambin podemos borrar entradas por el ndice:

DELETE taba INDEX n.

Mediante el ndice podemos borrar varias entradas:

DELETE tabla FROM x TO y.


Buscando entradas en una tabla:

Podemos buscar una determinada palabra o cadena de caracteres en el
contenido de una tabla:
Tablas internas

Alejandro Torrijos Pgina 21

FIND palabra IN TABLE tabla IN CHARACTER MODE.
FIND palabra IN TABLE tabla IN BYTE MODE.

Tambin podemos buscar la primera vez que aparece la palabra:

FIND FIRST OCCURRENCE OF palabra IN TABLE tabla.

O bien todas las veces que aparece esa palabra:

FIND ALL OCCURRENCES OF palabra IN TABLE tabla.

Para buscar una palabra y reemplazarla por otra:

REPLACE palabra IN TABLE tabla WITH nueva palabra.

Aunque est obsoleto tambin podemos buscar una cadena de
caracteres de la siguiente manera:

SEARCH tabla FOR abc.

En este caso la variable de sistema sy-tabyx muestra el ndice de la
lnea donde se encuentra esa cadena de caracteres. Obviamente slo
funciona con tablas indexadas.

Aunque tambin est obsoleto, podemos cambiar el contenido de un
campo mediante la instruccin:

WRITE palabra TO tabla INDEX n.

Trabajando con lneas de cabecera (header lines):
Cuando creamos una tabla interna tambin podemos declarar una lnea
de cabecera (header line) con el mismo nombre que la tabla. Podemos
usar esa lnea de cabecera como rea de trabajo para esa tabla.

Aunque hoy en da se considera obsoleto, si trabajramos con cabeceras
(header lines) podramos usar las siguientes instrucciones equivalentes
(estas instrucciones asumen que la lnea de cabecera es el rea de
trabajo):

INSERT wa INTO TABLE tabla INSERT TABLE tabla
COLLECT wa INTO table COLLECT tabla
READ TABLE tabla INTO wa READ TABLE tabla
MODIFY TABLE tabla FROM wa MODIFY TABLE tabla
Tablas internas

Alejandro Torrijos Pgina 22

MODIFY tabla FROM wa WHERE MODIFY tabla WHERE
LOOP AT tabla INTO wa LOOP AT tabla
APPEND wa TO tabla APPEND tabla
INSERT wa INTO tabla INSERT tabla
MODIFY tabla FROM wa MODIFY tabla

El problema de estas instrucciones ms cortas es que no se ve
claramente el origen y destino de los datos. El hecho de que la lnea de
cabecera tenga el mismo nombre que la tabla crea confusin al trabajar
con toda la tabla (por eso las reas de trabajo deben tener un nombre
distinto a la tabla).

También podría gustarte