You are on page 1of 22

Tablas internas

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).

Alejandro Torrijos

Pgina 1

Tablas internas
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. Alejandro Torrijos Pgina 2

Tablas internas
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). Alejandro Torrijos Pgina 3

Tablas internas
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.

Alejandro Torrijos

Pgina 4

Tablas internas
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 Alejandro Torrijos Pgina 5

Tablas internas
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.

Alejandro Torrijos

Pgina 6

Tablas internas
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.

Alejandro Torrijos

Pgina 7

Tablas internas
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.

Alejandro Torrijos

Pgina 8

Tablas internas
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.

Alejandro Torrijos

Pgina 9

Tablas internas
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.

Alejandro Torrijos

Pgina 10

Tablas internas
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. Alejandro Torrijos Pgina 11

Tablas internas
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. Alejandro Torrijos Pgina 12

Tablas internas
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

Alejandro Torrijos

Pgina 13

Tablas internas
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, Alejandro Torrijos Pgina 14

Tablas internas
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 Alejandro Torrijos Pgina 15

Tablas internas
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. Alejandro Torrijos Pgina 16

Tablas internas
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.

Alejandro Torrijos

Pgina 17

Tablas internas
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. Alejandro Torrijos Pgina 18

Tablas internas
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.

Alejandro Torrijos

Pgina 19

Tablas internas
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: Alejandro Torrijos Pgina 20

Tablas internas
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 COLLECT wa INTO table READ TABLE tabla INTO wa MODIFY TABLE tabla FROM wa Alejandro Torrijos INSERT TABLE tabla COLLECT tabla READ TABLE tabla MODIFY TABLE tabla Pgina 21

Tablas internas
MODIFY tabla FROM wa WHERE LOOP AT tabla INTO wa APPEND wa TO tabla INSERT wa INTO tabla MODIFY tabla FROM wa MODIFY tabla WHERE LOOP AT tabla APPEND tabla INSERT tabla 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).

Alejandro Torrijos

Pgina 22

You might also like