Está en la página 1de 32

Tablas internas

Tablas internas
1.- Introduccin
El objeto de la implementacin de las tablas internas en SAP es el de guardar datos de cualquier
Base de Datos del sistema con la intencin de poder operar con ellos sin la necesidad de tener que
ir accediendo a la misma con cada consulta que hagamos. Con ello conseguimos guardar una
coleccin de los datos accedidos en memoria.
Con anterioridad a la versin 3. de SAP! las tablas internas representaban tablas de bases de
datos guardadas internamente en memoria! " las l#neas de $stas consist#an en estructuras planas.
%o obstante! " tras la citada versin! dicho tipo de l#nea pas a ser arbitrario. El espectro de
rangos de tablas internas de arra"s de campos elementales se ampli llegando hasta objetos de
datos din&micos altamente complejos donde las l#neas o los componentes de $stas pod#an llegar a
ser incluso m&s tablas internas en s# mismos.
'a caracter#stica m&s rese(able de las tablas internas puede que sea que para cualquier tipo de
l#nea dado! se puede grabar un nmero ilimitado
)
de l#neas en memoria. Dicho n*mero de l#neas
es determinado en tiempo de ejecucin del programa.
Por otro lado! las tablas internas est&n gestionadas impl#citamente por el entorno de ejecucin del
programa ABAP que la utili+a. Este lenguaje de programacin implementa una serie de sentencias
que permiten al usuario trabajar con ellas " manejar objetos de datos din&micos complejos.
En la siguiente ,igura podemos ver un ejemplo sencillo de implementacin " uso de una tabla
interna-
DATA: BEGIN OF i_tab OCCURS 0,
nombre(20) T!E ",
#ire""ion(20) T!E ",
te$e%ono(&0) T!E i,
#ni T!E i'
DATA: END OF i_tab'
SE(ECTION)SCREEN: BEGIN OF B(OC* b&'
!ARA+ETERS:
,_nombre(20) T!E ",
,_#ire""(20) T!E ",
,_te$e%(&0) T!E i,
,_#ni(&0) T!E i'
SE(ECTION)SCREEN: END OF B(OC* b&'
START)OF)SE(ECTION'
i_tab)nombre - ,_nombre'
i_tab)#ire""ion - ,_#ire""'
i_tab)te$e%ono - ,_te$e%'
i_tab)#ni - ,_#ni'
Como puede observarse! su manejo en nada di,iere de lo que "a conocemos. En el ejemplo que
nos ocupa! el programa . bastante rudimentario! por lo dem&s/! se limita a pedir unos datos por
pantalla " a asignarlos a la tabla interna en el comien+o de la seleccin.
)
Por supuesto! el n*mero de l#neas de una tabla interna vendr& restringido por la propia memoria ,#sica instalada en el
sistema. En teor#a! una tabla interna puede llegar a alcan+ar hasta los dos 0igab"tes. De todos modos! la memoria no
suele estar reservada en su totalidad al uso de una sola tabla interna. De hecho! en una plata,orma de 31 bits no
podremos tener tablas internas de m&s de 2 3B. Con tablas hashed el n*mero de l#neas est& limitado a dos
millones.
)
Tablas internas
2.- Tipos de tablas internas
El tipo de tabla interna determina cmo es gestionada por el sistema internamente! " cmo es
accedida en nuestro programa ABAP. El decidir por qu$ tipo de tabla interna decantarnos depende
del tipo de operaciones que queramos hacer con la ella " la ,recuencia con que queramos
repetirlas.
Seg*n esto! tenemos-
2.1.- Tablas estndar
Para la de,inicin de tablas est&ndar usamos la cl&usula STANDARD TAB(E' 'as l#neas
individuales de una tabla est&ndar son gestionadas internamente por un #ndice lgico.
Cuando rellenamos una tabla est&ndar! se van a(adiendo nuevas l#neas al ,inal de la misma
o en ciertas posiciones. Podemos reali+ar la lectura bien mediante la especi,icacin de una
clave o bien mediante un #ndice. Si accedemos a trav$s de $ste *ltimo! la lgica del
programa debe conocer en todo momento qu$ l#neas pertenecen al #ndice especi,icado.
2.2.- Tablas sorted
Para la de,inicin de tablas sorted usaremos la cl&usula SORTED TAB(E. Como en el caso de
las tablas est&ndar! las tablas sorted son gestionadas por un #ndice lgico. De todos modos!
las tablas sorted di,ieren de las est&ndar en que sus entradas est&n siempre dispuestas en
orden ascendente de acuerdo con una clave de la tabla. El acceso a tablas sorted se hace de
igual modo que para las tablas est&ndar.
2.3.- Tablas hashed
Para la de,inicin de este tipo de tablas hemos de usar la sentencia .AS.ED TAB(E' En este
caso! el orden de las entradas no est& gestionado por un #ndice lgico4 en lugar de eso! las
entradas de la tabla se encuentran alamcenadas en memoria sin orden concreto! " se
manejan a trav$s de un algoritmo hash. 'a posicin de una entrada es calculada
directamente a trav$s de una ,uncin hash. Con tablas hashed el acceso basado en #ndices
no es posible.
2.4.- Jerarqua de tablas
1
Tablas
internas
Tablas
indexadas
Tablas
estndar
Tablas sorted
Tablas
hashed
Tablas internas
2.5.- Acceso a los dierentes tipos de tablas !cuadro resu"en#
Tablas
estndar
Tablas sorted Tablas hashed
Acceso indexado S# S# %o
Acceso mediante clave S# S# S#
Valores de la clave %5%/
6%786E
6%786E o %5%/
6%786E
6%786E
Acceso preferible 7nde9ado 3ediante clave Slo mediante clave
2.$.- Tablas %en&ricas
El tipo gen$rico AN TAB(E signi,ica que un ,ield/s"mbol o el par&metro de la inter,a+ de
un procedimiento puede ser una tabla interna de cualquier tipo. Adem&s! los *nicos modos
de acceso que pueden ser programados son aquellos que se permiten para toda clase de
tablas. Concretamente! el acceso inde9ado no es un caso! toda ve+ que no es posible
reali+arlo con tablas hashed. De todos modos! el acceso inde9ado se puede programar para
,ield/s"mbols " par&metros de inter,a+ del tipo gen$rico TAB(E INDE/! porque el tipo actual
slo puede ser una tabla con administracin inde9ada.
:ambi$n podemos hacer uso de las tablas gen$ricas en la sentencia TYPES para crear tipos
de tabla gen$ricos autode,inidos! como por ejemplo-
T!ES itab T!E INDE/ TAB(E OF t0,e'
5
T!ES itab T!E AN TAB(E
OF t0,e
1IT. *E 2e0'
3.- Tipo de lnea
El tipo de l#nea de una tabla interna es cualquier tipo de dato global o local de la jerarqu#a tipo
ABAP que est& determinada por la cl&usula :;PE o '7<E. El tipo de l#nea de un cl&sica tabla en
ABAP es de estructura plana! " una aplicacin com*n para esto es una re,erencia a la estructura
de una tabla de la base de datos.
De todos modos! es digno de mencin el papel clave que juegan los arra"s de tipos elementales o
variables de re,erencia.
=inalmente! hemos de mencionar que los tipos de l#nea que contienen en s# mismos m&s tablas
internas son ideales para el manejo de objetos complejos. 6n ejemplo de esto *ltimo es la
estructura cxtab_control! que necesitamos para la gestin de table controls en la impresin de
pantalla.
4.- 'la(es
6na clave tiene por objeto el identi,icar las columnas de una tabla. >a" dos clases de clave para
las tablas internas- las est&ndar " las de,inidas por el usuario. Podemos especi,icar si la clave es
6%786E o %5%/6%786E. Caso de que se de,ina la tabla interna con una clave 6%786E! dicha
tabla no podr& contener entradas duplicadas. En s#ntesis! el que tenga un tipo de clave u otro
depende slo del m$todo de acceso.
Si una l#nea tiene un tipo de l#nea estructurado! su clave por de,ecto consite en todas sus columnas
no num$ricas que no contienen re,erencias e9ternas ni son tablas internas.
3
Tablas internas
Sin embargo! si una tabla tiene un tipo de l#nea elemental! la clave por de,ecto es la l#nea entera.
; ,inalmente! si el tipo de l#nea de la tabla interna es! precisamente! otra tabla interna! la clave por
de,ecto se queda vac#a.
Por otro lado! las tablas internas con claves de,inidas por el usuario reciben el nombre de tablas
clave. Cuando de,inimos la clave! hemos de tener cuidado "a que el orden de los campos de la
misma tiene importancia. Debemos tener esto presente si! por ejemplo! intentamos ordenar la
tabla de acuerdo con la clave.
5.- )einicin de tablas internas
Por de,inicin! una tabla interna bien puede ser un tipo de dato o un objeto de dato! por lo que la
implementacin en ABAP bien podr#a ser de esta ,orma-
DATA: BEGIN OF 3itab4 OCCURS 3n4,
53%&4,''',3%n4 6 INC(UDE STRUCTURE 37tr48,
END OF 3itab4'
5 bien de estas otras-
&' T!ES itabt0,e 5T!E tab2in# OF $inet0,e
(I*E tab2in# OF $ineob98
:1IT. :UNI;UE NON)UNI;UE< 2e0#e%< :INITIA( SI=E n<'

2' T!ES itabt0,e T!E RANGE OF t0,e'
T!ES itabt0,e (I*E RANGE OF %'

>' T!ES itabt0,e 5T!E $inet0,e (I*E $ineob98 OCCURS n'
Dependiendo de si la de,inimos como un objeto de dato o un tipo de dato! respectivamente.
En la de,inicin de la tabla interna! hemos de tener en cuenta que adem&s se establece una l#nea de
cabecera o &rea de trabajo.
5.1.- )einicin co"o ob*eto de datos
5.1.1.- +entencia ,''-.+
Para empe+ar! hemos de considerar que una tabla interna es! en s#ntesis! una
estructura de datos din&mica. Sus requerimientos de memoria est&n constituidos
por bloques. 'a locali+acin inicial de memoria ?desde ahora la llamaremos &rea
5CC6@SA! se puede controlar mediante la cl&usula B5CC6@S nC o B7%7:7A'
S7DE nC al ,inal de la de,inicin de la tabla interna dentro del cdigo de nuestro
programa. 6na ve+ que el &rea occurs se ha llenado! el siguiente bloque que se crea
es dos veces m&s grande que el &rea reci$n agotada ?con tal de que no sea ma"or de
E <bA. :odos los dem&s bloques que se crean despu$s tienen un tama(o constante
de )1 <b.
%o obstante todo lo dicho! tambi$n tenemos la posibilidad de dejar que sea el
propio sistema el que determine el tama(o del &rea occurs! haciendo n F ?como
en el ejemplo que ve#amos en la introduccinA. En este caso! el sistema reserva una
peque(a porcin de memoria tras la primera sentencia insert o append. 3&s
concretamente! el par&metro n se locali+a en un valor comprendido entre )G " )
?dependiendo "a del tama(o de la l#neaA.
Slo tiene sentido especi,icar un valor concreto de n ma"or que cero en el caso de
que sepamos con e9actitud el n*mero de entradas que va a tener nuestra tabla
interna.
H
Tablas internas
En general " para terminar! consideremos que un 5CC6@S mu" grande supone un
gran gasto de recursos del sistema! " que otro mu" peque(o implica un proceso
mu" lento! habida cuenta de que necesita de paginacin.
5.1.2.- /structura de la tabla interna
'a ,orma de la tabla interna se puede de,inir de dos ,ormas posibles- bien
describiendo uno por uno los campos de que va a estar compuesta! o bien
pas&ndole una estructura an&loga a otra "a e9istente previamente en nuestro
diccionario de datos-
'e de,inimos los campos uno a uno-
53%&4,''',3%n48
5 re,erenciamos una estructura "a e9istente-
INC(UDE STRUCTURE 37tr4
5.2.- )einicin co"o tipo de datos
5.2.1.- Tipo 1
T!ES itabt0,e 5T!E tab2in# OF $inet0,e
(I*E tab2in# OF $ineob98
:1IT. :UNI;UE NON)UNI;UE< 2e0#e%< :INITIA( SI=E n<'
De,ine el tipo itabt"pe para una tabla interna sin l#nea de cabecera en un programa
con un tipo de tabla tabIind " un tipo de l#nea linet"pe ?siempre que usemos una
re,erencia :;PEA o el tipo lineobj del objeto re,erido ?si usamos la sentencia
'7<EA. 'as tablas internas sin l#nea de cabecera consisten en un n*mero de l#neas
de tabla! que tienen un estructura de,inida por el tipo de l#nea.
:ambi$n podr#amos de,inir una clave de tabla. Si no lo hacemos! el sistema crea un
tipo de tabla gen$rica con cualquier clave. Podemos usar tipos gen$ricos para
especi,icar el tipo de par&metros de subrutina gen$ricos.
'as cl&usulas 6%786E " %5%/6%786E nos permiten especi,icar si una tabla de
tipo itabt"pe puede contener dos o m&s registros con la misma clave o no. 3&s
concretamente-
5.2.1.1.- Tablas estndar:
'a clave es siempre %5%J6%786E por de,ecto. %o podemos usar la
cl&usula 6%786E con este tipo de tablas.
5.2.1.2.- Tablas sorted:
%o ha" opciones por de,ecto para estas tablas. Si no especi,icamos las
cl&usulas 6%786E o %5%/6%786E! el sistema crea un tipo de tabla
gen$rica sin ning*n atributo *nico en particular. Podemos usar tipos
gen$ricos para especi,icar los tipos de par&metros de subrutina gen$ricos.
5.2.1.3.- Tablas hashed:
Al igual que en el caso de las Sorted! tampoco ha" opciones por de,ecto
para este tipo de tablas. De todos modos! hemos de de,inir una clave
6%786E. 'a cl&usula %5%/6%786E no est& permitida.
'a cl&usula opcional 7%7:7A' S7DE sirve para especi,icar cu&nta memoria
deseamos reservar para nuestra tabla al crearla.
A continuacin vemos unos cuantos ejemplos de implementacin de cuanto
llevamos e9plicado hasta ahora-
2
Tablas internas
'as siguientes de,iniciones de tipo implementan tablas usando el tipo de
l#nea S:@6C " la clave %A3E-
T!ES: BEGIN OF 7tr?",
name(&0) T!E ",
a@e T!E i,
END OF 7tr?"'
T!ES: tab& T!E STANDARD TAB(E OF 7tr?" 1IT. DEFAU(T *E,
tab2 T!E SORTED TAB(E OF 7tr?"
1IT. NON)UNI;UE *E name,
tab> T!E .AS.ED TAB(E OF 7tr?" 1IT. UNI;UE *E name'

A di,erencia de los tipos especi,icados arriba! los que veremos a
continuacin son gen$ricos. Esto signi,ica que podemos usarlos para
especi,icar el tipo de un par&metro de subrutina gen$rico! pero no para crear
una tabla objeto usando la cl&usula DA:A. 'a *nica e9cepcin a esto es
que el sistema nos permite usar un tipo de tabla est&ndar gen$rico en una
cl&usula DA:A . la descripcin del tipo es completada autom&ticamente
por el sistema de acuerdo con las reglas descritas debajo de la l#nea DA:A.
T!ES: @en_tab& T!E STANDARD TAB(E OF 7tr?",
@en_tab2 T!E SORTED TAB(E OF 7tr?" 1IT. *E name
@en_tab> T!E .AS.ED TAB(E OF 7tr?"'

El siguiente ejemplo muestra la de,inicin de una tabla sorted usando una
re,erencia '7<E a la estructura del diccionario de datos S='70>:-

T!ES: %$tab (I*E SORTED TAB(E OF 7%$i@At
1IT. NON)UNI;UE *E "arri# "onni# %$#ate'
5.2.2.- Tipo 2
T!ES itabt0,e T!E RANGE OF t0,e'
T!ES itabt0,e (I*E RANGE OF %'
A todos los e,ectos crea un tipo de tabla st&ndar. El tipo de l#nea es una estructura!
que se con,igura del siguiente modo-
SIGN(&) T!E C
O!TION(2) T!E C
(O1 T!E t0,e or (I*E %
.IG. T!E t0,e or (I*E %
5.2.3.- Tipo 3
T!ES itabt0,e 5T!E $inet0,e (I*E $ineob98 OCCURS n'
De,ine el tipo itabt"pe como el tipo para una tabla est&ndar sin l#nea de cabecera.
'a clave es la que viene por de,ecto para las tablas internas.
Este tipo tiene el mismo e,ecto que la siguiente de,inicin-
T!ES itabt0,e 5T!E STANDARD TAB(E OF $inet0,e
(I*E STANDARD TAB(E OF $ineob98
1IT. DEFAU(T *E INITIA( SI=E n'
Nota: El nombre de un tipo puede tener hasta 3 caracteres! " slo puede construirse con letras!
ci,ras " el car&cter KJK. %o est& permitido que conste slo de ci,ras! " los signos especiales como
G
Tablas internas
la di$resis tampoco deben usarse. E9isten! adem&s de $stos! otros caracteres especiales para
objetivos internos que no deber#an usarse en los programas de aplicaciones. SPACE es un nombre
reservado " tampoco puede usarse. ; en una sentencia no deber#a utili+arse ning*n campo cu"o
nombre sea id$ntico al de uno de los par&metros adicionales de la palabra clave introductoria ?Por
ejemplo- PE@=5@3 S6B 6S7%0 C>A%07%0.A.
@ecomendaciones para nombrar un tipo-
). 6tilicar siempre como primer car&cter una letra.
1. El car&cter de subra"ado resulta *til para estructurar nombres que van juntos ?+.B.
%ELJP@5D6C:A.

$.- Traba*ando con tablas internas
Cuando trabajamos con tablas internas podemos distinguir entre el acceso a l#neas individuales de
la misma o el acceso a toda la tabla. Para empe+ar! comen+aremos con el tratamiento de acceso a
l#neas individuales. En este conte9to! podemos distinguir! as# mismo! entre acceso mediante clave
" acceso inde9ado. En este apartado slo se pretende presentar los aspectos m&s importantes de
ambos! sin entrar en demasiados detalles4 no obstante! " si nos interesa! siempre podemos
encontrar mucha m&s in,ormacin en la documentacin on line que SAP nos o,rece.
$.1.- Acceso inde0ado
Como su propio nombre indica! este tipo de acceso direcciona l#neas mediante un #ndice
interno " slo es posible para tablas est&ndar " sorted. :ras ser accedida la tabla! la
variable de entorno sy-tabix contiene siempre el valor del #ndice de la l#nea accedida.
Aunque la inde9ada! por lo general! resulta ser la ,orma m&s r&pida de acceder a la l#nea de
una tabla interna! resulta que desde que ha" una re,erencia interna directa! tambi$n puede
resultar que no sea la m&s ptima! sobre todo cuando trabajamos con datos de una tabla de
la base de datos del diccionario. Cuando trabajamos en esta ,orma de acceso! el sistema
debe saber en todo momento la asignacin habida entre el #ndice " el contenido de la l#nea
de la tabla interna! si bien con el acceso mediante clave primaria el contenido de la l#nea
interna es evaluado previamente. Debido a ello! nos encontramos con que el acceso
mediante clave parece ser m&s recomendable para la ma"or#a de las aplicaciones que
manejan datos de elementos del diccionario ABAP.
$.2.- Acceso "ediante cla(e pri"aria
En el acceso mediante clave a tablas est&ndar! el sistema reali+a una b*squeda
lineal mediante el valor de la clave. El tiempo medio de b*squeda es directamente
proporcional al n*mero de l#neas de la tabla interna.
En el mismo acceso pero a tablas sorted! el entorno de ejecucin del programa
reali+a una b*squeda binaria para el valor clave. El tiempo medio de b*squeda es
directamente proporcional al log
1
del n*mero de l#neas.
; ,inalmente! con el mismo acceso pero a tablas hashed! el sistema calcula la
posicin de la l#nea mediante el valor de la clave aplicando una ,uncin hash. En
este caso! el tiempo de b*squeda es independiente del n*mero de l#neas " se
mantiene siempre constante.
En el siguiente gr&,ico podemos observar la media de tiempos de acceso para el
tipo de clave primaria. En abscisas tenemos el n*mero de l#neas! mientras que en
ordenadas el tiempo de acceso en s. 'lama la atencin cmo sube $ste en las
tablas est&ndar con,orme tambi$n lo hace el n*mero de l#neas a tratar.
M
Tablas internas
0
15
30
45
60
75
90
105
120
135
150
165
180
195
210
225
240
255
270
285
300
315
330
345
360
375
390
405
420
435
450
465
480
495
510
525
540
10 100 1000 10000
Tabla estndar
Tabla sorted
Tabla hashed
Tipo tabla\No.lneas 10 100 1000 10000
Tabla estndar 20 s 64 s 530 s 5300 s
Tabla sorted 18 s 21 s 28 s 31 s
Tabla hashed 17 s 17 s 17 s 17 s
$.3.- 'onclusin
As# pues! dependiendo del propsito de la tabla interna dentro de nuestro programa ABAP
?n*mero de l#neas! ,recuencia de acceso! etc.A deber#amos siempre usar el tipo de tabla
adecuado. Por ejemplo! para tablas peque(as con hasta cien l#neas! a las que se accede
mu" espor&dicamente mediante clave primaria! la implementacin del tipo est&ndar parece
la m&s adecuada. Sin embargo! tablas grandes sin entradas duplicadas a las que queramos
acceder slo mediante clave primaria! bien podr#an estar implementadas como tablas
hashed. Si se requiere que la tabla permane+ca ordenada durante todo el tiempo de
ejecucin! se recomienda el uso de tablas sorted
1
.
1.- ,peraciones con tablas internas
1.1.- +entencia I2+/.T
&' INSERT :Ba INTO INITIA( (INE INTO< itab :INDE/ i#C<'
2' INSERT :Ba INTO INITIA( (INE INTO< TAB(E itab'
>' INSERT (INES OF itab& :FRO+ i#C&< :TO i#C2<
INTO itab2 :INDE/ i#C><'
D' INSERT (INES OF itab& :FRO+ i#C&< :TO i#C2<
INTO TAB(E itab2'
1
Si ordenamos una tabla est&ndar con el comando S5@: " hacemos una b*squeda binaria con la cl&usula B7%A@;
SEA@C> en la sentencia @EAD :AB'E! estaremos obteniendo los mismos resultados en tiempo de ejecucin que
para las tablas sorted.
E
Tablas internas
1.1.1.- INSERT [wa INTO INITIAL LINE INTO] itab [INDEX idx].
Esta sentencia inserta un nueva l#nea en la tabla interna usando una especi,icacin
impl#cita o e9pl#cita de #ndice. Esta variante de la sentencia insert slo podemos
usarla con tablas inde9adas ?est&ndar o sortedA.
Si usamos la cl&usula BNa 7%:5C el contenido del NorI area BNaC es insertado
como una nueva l#nea. Si los respectivos tipos de Na " de la tabla interna ,uesen
incompatibles! el contenido del primero se trans,ieren de acuerdo con la lgica de
proceso de la sentencia 35OE.
Si usamos la cl&usula 7%7:7A' '7%E 7%:5! insertaremos una l#nea en la tabla! que
contendr& valores apropiados de acuerdo con los tipos de que conste dicha tabla.
Si no especi,icamos nada antes de itab! la nueva l#nea se toma de la l#nea de
cabecera de la tabla interna.
Por otro lado! usamos 7%DEP id9 para especi,icar el #ndice de la tabla antes del
que la nueva l#nea va a ser insertada.
Si estamos insertando l#neas en una tabla inde9ada usando un '55P! podemos
omitir la especi,icacin del #ndice! "a que la l#nea a insertar se introducir& antes de
la l#nea activa en ese momento de la sentencia '55P4 es lo que se llama
especi,icacin inde9ada impl#citaA. >emos de tener en cuenta! as# mismo! que la
insercin de l#neas en una tabla dentro de una sentencia '55P slo tiene e,ecto en
la siguiente pasada de la esta instruccin.
Si la tabla en la que estamos introduciendo l#neas es del tipo S5@:ED! $sta ha de
estar correctamente ordenada despu$s de terminar de insertar l#neas! de lo contrario
se producir& un error.
El cdigo de retorno devuelve los siguientes valores! seg*n el caso-
o S;/S6B@C F 'a l#nea se insert con $9ito.
o S;/S6B@C F H El #ndice especi,icado es demasiado grande. 'a
l#nea no se insert.
Ahora vamos a ver el siguiente ejemplo en el que insertamos valores dentro de una
tabla de n*meros enteros-
DATA: EA(UE T!E I,
ITAB T!E I OCCURS &00 1IT. .EADER (INE'

ITAB - F'
EA(UE - >G'

INSERT ITAB INDE/ &'
INSERT EA(UE INTO ITAB INDE/ 2'
INSERT INITIA( (INE INTO ITAB INDE/ 2'
1.1.2.- INSERT [wa INTO INITIAL LINE INTO] TABLE itab.
7nserta valores en una tabla interna con una clave! que es tomada! precisamente! del
NorI area. Si indicamos e9pl#citamente dicho NorI area! hemos de asegurarnos de
que es compatible con el tipo de l#nea de la tabla donde queremos insertar.
A di,erencia de la sentencia anterior! $sta puede usarse con cualquier tipo de tabla.
Si la tabla donde pretendemos insetar tiene la cl&usula 6%786E <E;! el sistema
ignora cualquier entrada duplicada.
'a ,orma en la que el sistema inserta nuevas entradas en la tabla depende del tipo
que sea $sta-
:ablas est&ndar- la nueva entrada es a(adida al ,inal de la tabla. 'a
insercin gen$rica es similar a usar la sentencia APPE%D.
Q
Tablas internas
:ablas sorted- la nueva entrada es colocada en el lugar apropiado! que
es determinado por la clave de la tabla. Como se ha dicho con
anterioridad! el valor de la clave es tomado directamente del Na o de la
l#nea de cabecera de la tabla. Si la clave es %5%/6%786E! la entrada
es colocada la primera en la lista de entradas duplicadas. El punto de
insercin se determina internamente usando una b*squeda binaria.
:ablas hashed- la nueva entrada es colocada en la administracin hash
interna de la tabla de acuerdo con la clave de la misma. Como en el
anterior caso! los valores de la clave se toman del Na especi,icado o de
la l#nea de cabecera de la tabla. El tiempo de ejecucin requerido
permanece constante! debido a que no depende del n*mero de entradas
de la tabla. 'a clave ha de ser *nica.
'os cdigos de retorno devuelven los siguientes valores-
o S;/S6B@C F Entrada a(adida a la tabla.
o S;/S6B@C F H 'a entrada no ha podido ser a(adida a la tabla!
debido a que duplica una entrada e9istente " la tabla est& di,inida
como 6%786E <E;.
Como ejemplo! vamos a implementar una tabla sorted! ordenada por nombre "
edad-
T!ES: BEGIN OF !ERSON,
NA+E(&0) T!E C,
AGE T!E I,
END OF !ERSON'

DATA: ! T!E !ERSON,
!TAB T!E SORTED TAB(E OF !ERSON
1IT. UNI;UE *E NA+E AGE'

!)NA+E - HSteIeH' !)AGE - 20' INSERT ! INTO TAB(E !TAB'
!)NA+E - HAn#0H' !)AGE - 20' INSERT ! INTO TAB(E !TAB'
!)NA+E - HSteIeH' !)AGE - &J' INSERT ! INTO TAB(E !TAB'
!)NA+E - HAn#0H' !)AGE - 20' INSERT ! INTO TAB(E !TAB'
1.1.3.- INSERT LINES OF itab1 [FROM idx1] [TO idx2]
INTO itab2 [INDEX idx3]
7nserta la tabla interna itab) o parte de la misma dentro de la tabla interna itab1.
Esta sentencia viene a equivaler a insertar l#nea por l#nea dentro de un bucle '55P.
En el #ndice id93 especi,icamos la posicin del #ndice de la tabla antes de la cual
queremos insertar la entrada en itab1. Este par&metro no puede ser del tipo
>AS>ED o A%; :AB'E! debido a que estas tablas no tienen de,inidas
operaciones inde9adas.
Oolvemos a repetir que si estamos insertando en un '55P! podemos omitir id93.
Podemos restringir el n*mero de l#neas tomadas de la tabla ,uente usando =@53
id9) :5 id91. Si omitimos el primero ?id9)A! la seleccin comien+a en la primera
l#nea de la tabla interna4 de manera an&loga! si lo que omitimos es id91! la
seleccin terminar& en la *ltima l#nea de la tabla ,uente. Esto quiere decir que si
omitimos ambos par&metros! ser& la totalidad de la tabla ,uente la que se copie en
la tabla destino.
Oamos ahora a ver el siguiente ejemplo consistente en la introduccin de una tabla
de nombres en otra-
T!ES NA+E(&0) T!E C'

)
Tablas internas
DATA: NA+E_TAB_& T!E STANDARD TAB(E OF NA+E 1IT.
NON)UNI;UE DEFAU(T *E INITIA( SI=E F,
NA+E_TAB_2 T!E STANDARD TAB(E OF NA+E 1IT.
NON)UNI;UE DEFAU(T *E INITIA( SI=E F'

A!!END HA$i"eH TO NA+E_TAB_&'
A!!END H+artAaH TO NA+E_TAB_&'
A!!END HR?tAH TO NA+E_TAB_&'

A!!END H.arr0H TO NA+E_TAB_2'
A!!END H1a$terH TO NA+E_TAB_2'

INSERT (INES OF NA+E_TAB_& FRO+ 2 INTO NA+E_TAB_2 INDE/ 2'
1.1.4.- INSERT LINES OF itab1 [FROM idx1] [TO idx2]
INTO TABLE itab2.
7nsercin gen$rica de la tabla interna itab) o parte de la misma dentro de la tabla
interna itab1. A di,erencia del anterior caso! este tipo de insercin se puede usar
con cualquier tipo de tabla origen " destino.
'a ,orma en que las l#neas se toman de la tabla origen itab) " son insertadas en la
tabla itab1 depende! ,undamentalmente! del tipo de tabla que sea itab1.
@ecomendaciones para la implementacin-
o >emos de evitar en lo posible asignaciones innecesarias en la l#nea de
cabecera. Cuando podamos! debemos usar sentencias que tengan un Na
e9pl#cito. Por ejemplo! BAPPE%D Na :5 itabC es mucho m&s simple "
r&pido que Bitab F Na. APPE%D itab.C Podemos hacer an&logas
observaciones para las cl&usulas C5''EC: e 7%SE@:.
o Cuando a(adimos una l#nea a un #ndice de tabla! el mantenimiento de
$ste va en detrimento del tiempo de acceso e insercin. Por ejemplo!
para la insercin de una l#nea dentro de una tabla interna de ) b"tes
de tama(o " 1 entradas! necesitaremos alrededor de Q msn
?microsegundos est&ndarA .
o A la hora de insertar tablas internas o parte de ellas dentro de otras! la
sentencia 7%SE@: '7%ES 5= R resulta mucho m&s e,iciente que ir
a(adiendo l#neas una a una dentro de un bucle '55P.
1.2.- +entencia ',33/'T
CO((ECT 3Ba4 INTO 3itab4'
Suma el contenido de la l#nea de cabecera en la tabla que estemos tratando. 'a tabla en
cuestin ha de tener un tipo de l#nea plano! " todos los campos que no perten+can a la
clave de la tabla han de ser tipo num$rico . lgicamente/! para poder sumarlos.
El sistema! al insertar la nueva l#nea comprueba si e9iste en la tabla una entrada que se
corresponda con la clave primaria4 de no haberla! esta sentencia tiene el mismo e,ecto que
la de insertar l#neas nuevas. Si "a ha" una entrada que coincida con la clave! C5''EC:
no reali+a el APPE%D correspondiente! pero no as# suma los contenidos de los campos
num$ricos habidos en el NorI area a los campos de id$nticos tipos de la entrada e9istente.
En general! esta sentencia se deber#a usar slo en el caso de que el usaurio des$e reali+ar
sumatorias con los campos de una tabla! debido a que esta instruccin es mani,iestamente
m&s lenta que @EAD! 7%SE@: o 35D7=;.
'as l#neas se suman a las tablas internas tal " como se e9plica a continuacin-
o Tablas estndar -
))
Tablas internas
Si la sentencia C5''EC: es la primera en empe+ar a rellenar la tabla! el
sistema crea una administracin hash temporal para identi,icar las entradas
e9istentes en la tabla. Dicha administracin hash permanece activa hasta que
otra sentencia cambia los contenidos de los campos clave o la secuencia de las
l#neas de la tabla interna. Despu$s! el sistema encuentra entradas e9istentes
mediante una b*squeda lineal. El tiempo de ejecucin de esta operacin se
incrementa linealmente en ,uncin del n*mero de entradas e9itentes en la tabla.
'a variable de sistema S;/:AB7P contiene el #ndice de la l#nea insertada o
modi,icada en la sentencia C5''EC:.
o Tablas sorted -
En este caso! el sistema reali+a una b*squeda binaria para locali+ar las entradas
e9istentes. El tiempo de ejecucin de esta operacin se incrementa
logar#tmicamente con el n*mero de l#neas e9istentes. 'a variable de sistema
S;/:AB7P contiene el #ndice de la l#nea insertada o modi,icada en la sentencia
C5''EC:.S
o Tablas hashed -
El sistema encuentra las l#neas e9istentes utili+ando un algoritmo hash de la
tabla interna. :ras la sentencia C5''EC:! la variable de sistema S;/:AB7P
contiene el valor ! debido a que las tablas hashed no tiene #ndice lineal.
Oeamos el siguiente ejemplo-
DATA: BEGIN OF (INE,
CO(&(>) T!E C,
CO(2(2) T!E N,
CO(> T!E I,
END OF (INE'
DATA ITAB (I*E SORTED TAB(E OF (INE
1IT. NON)UNI;UE *E CO(& CO(2'
(INE)CO(& - Hab"H' (INE)CO(2 - H&2H' (INE)CO(> - >'
CO((ECT (INE INTO ITAB'
1RITE K S)TABI/'
(INE)CO(& - H#e%H' (INE)CO(2 - H>DH' (INE)CO(> - F'
CO((ECT (INE INTO ITAB'
1RITE K S)TABI/'
(INE)CO(& - Hab"H' (INE)CO(2 - H&2H' (INE)CO(> - J'
CO((ECT (INE INTO ITAB'
1RITE K S)TABI/'
(OO! AT ITAB INTO (INE'
1RITE: K (INE)CO(&, (INE)CO(2, (INE)CO(>'
END(OO!'
Cu"a salida ser#a-
1
2
1
abc 12 10
def 34 5
)1
Tablas internas
Este ejemplo rellena una tabla sorted. 'as primeras dos sentencias C5''EC:
,uncionancomo sentencias 7%SE@: normales " corrientes. En la tercera sentencia
C5''EC:! la primera l#nea de 7:AB se modi,ica. Con el siguiente diagrama vemos los
tres pasos gr&,icamente-
1.3.- 3ectura de tablas internas
Para la lectura de una *nica l#nea de una tabla interna! hemos de usar la sentencia-
READ TAB(E 3itab4 32e04 3re7?$t4'
Para que ducha sentencua sea v&lida para cualquier tipo de tabla! debemos especi,icar la
entrada usando la calve " no el #ndice. 'a parte TresultU puede especi,icar alguna opcin
m&s de procesamiento para la l#nea que se va a leer.
Si el sistema encuentra una entrada! pone a cero la variable de sistema S;/S6B@C! de lo
contrario! la pone a cuatro. Si la tabla que se est& tratando es del tipo inde9ado! S;/
:AB7P contiene el #ndice de la l#nea le#da. Si la tabla tiene la cl&usula %5%/6%786E
<E; " tiene entradas duplicadas! slo se lee la primera l#nea.
1.3.1.- /speciicacin de la cla(e de b4squeda
Vsta puede ser! bien la clave de la tabla o bien cualquier otra-
o Clave de la tabla - Para usar la clave primaria de la tabla! hemos de usar la
siguiente sentencia-
READ TAB(E 3itab4 FRO+ 3Ba4 3re7?$t4'
o $sta otra-
READ TAB(E 3itab4 1IT. TAB(E *E 32&4 - 3% &4 ''' 32 n4 - 3% n4
3re7?$t4'
En el primer caso! TNaU debe ser un NorI area compatible con el tipo de
linea de TitabU. 'os valores de los campos de la clave se toman de los
componentes correspondientes del NorI area.
)3
Tablas internas
En el segundo caso! debemos especi,icar los valores de cada campo de la
clave e9pl#citamente. Si no sabemos alguno de los nombres de los campos
clave hasta el tiempo de ejecucin! podemos especi,icarlo como el
contenido de un campo <n
i
> utili+ando la ,orma (<n
i
>) = <f
i
>. Si el tipo
de datos de <f
i
> no es compatible con los campos de la clave! el sistema
los convierte autom&ticamente.
El sistema reali+a la b*squeda de la siguiente ,orma-
:ablas est&ndar B*squeda lineal! donde el tiempo de
ejecucin es directamente proporcional al n*mero de entradas de
la tabla.
:ablas sorted B*squeda binaria! donde el tiempo de ejecucin
est& en proporcin logar#tmica al n*mero de entradas de la tabla.
:ablas hashed 'a entrada se encuentra usando un algoritmo
hash de la tabla interna. Como "a se ha dicho anteriormente! el
tiempo de ejecucin en estos casos es indpendiente del n*mero
de entradas.
o so de otra clave - Para hacer uso de una clave que no sea la de la tabla
interna! hemos de introducir el par&metro TIe"U como se e9plica-
READ TAB(E 3itab4 1IT. *E - 3%4 3re7?$t4'
o de esta otra ,orma-
READ TAB(E 3itab4 1IT. *E 32&4 - 3%&4 ''' 32 n4 - 3% n4 3re7?$t4'
En el primer caso! la l#nea de la tabla interna en su totalidad se usa como
calve de b*squeda. 'os contenidos de la l#nea de la tabla entera se
comparan con los contenidos del campo T,U. Si T,U no es compatible con el
tipo de l#nea de la tabla! el valor se convierte al tipo de l#nea de la tabla. 'a
b*squeda por clave nos permite encontrar entradas en tablas internas que no
tienen un tipo de l#nea estructurado! es decir! tienen un tipo de l#nea que
consiste en un *nico campo o en un tipo de tabla interna.
En el segundo caso! la clave de b*squeda puede consistir en cualquier de los
campos de la tabla <k
1
>...<k
n
>. Si no sabemos alguno de los nombres de
los campos clave hasta el tiempo de ejecucin! podemos especi,icarlo como
el contenido de un campo <n
i
> utili+ando la ,orma (<n
i
>) = <f
i
>. Si el
tipo de datos de <f
i
> no es compatible con los campos de la clave! el
sistema los convierte autom&ticamente. Podemos restringir la b*squeda a
campos parciales especi,icando el despla+amiento " la longitud.
'a b*squeda es lineal para todo tipo de tablas. El tiempo de ejecucin! en
este caso! " siendo la b*squeda lineal! va en proporcin directa al n*mero
de entradas de la tabla.
1.3.2.- /speciicacin de la opcin de procesa"iento
Podemos especi,icar una opcin que contenga cuanto queremos que el sistema
haga con la entrada reci$n encontrada. Para ello e9iten dos maneras-
o !ediante el "or# area - Podemos escribir la entrada de tabla le#da dentro
de un NorI area con la cl&usula TresultU-
READ TAB(E 3itab4 32e04 INTO 3Ba4 :CO+!ARING 3%&4 3% 24 '''
6A(( FIE(DS<
:TRANS!ORTING 3%&4 3% 24 '''
)H
Tablas internas
6A(( FIE(DS
6NO FIE(DS<'
Si no usamos los par&metros C53PA@7%0 o :@A%SP5@:7%0! los
contenidos de la l#nea de la tabla debe ser convertible al tipo de dato del
NorI area TNaU. Si especi,icamos dichos par&metros! tanto el tipo de l#nea
como el Na han de ser compatibles. Siempre deber#amos usar un NorI area
que sea compatible con el tipo del l#nea pertinente de la tabla interna.
Si usamos el par&metro C53PA@7%0! los campos de la tabla
especi,icados T,iU del tipo de l#nea estructurado son comparados con los
campos correspondientes del NorI area antes de ser transportados. Si
hacemos uso de la opcin A'' =7E'DS! el sistema compara todos los
componentes. Si el sistema encuentra una entrada con la clave especi,icada
TIe"U " si los contenidos de los campos comparados son los mismos! S;/
S6B@C pasa a contener el valor . Si el contenido de los campos
comparados no son los mismos! S;/S6B@C devuelve el valor 1. ; por
*ltimo! si el sistema no encuentra ninguna entrada! esta variable de sistema
contiene el valor H. Si el sistema encuantra una entrada! la copia en el NorI
area sin importar el resultado de la comparacin.
Si usamos la opcin :@A%SP5@:7%0! podemos especi,icar los campos de
la tabla del tipo de l#nea estructurado que queremos transportar al NorI
area. Si de,inimos A'' =7E'DS sin :@A%SP5@:7%0! se transportar&n
todos los contenidos de todos los campos. Si escribimos %5 =7E'DS! no se
transportar& ning*n campo. Por *ltimo! debemos se(alar que especi,icar el
NorI area con :@A%SP5@:7%0 %5 =7E'DS es innecesario! " no deber#a
usarse.
En ambos casos ?C53PA@7%0 " :@A%SP5@:7%0A! podemos de,inir un
campo <f
i
> din&micamente como el contenido de un campo <n
i
> en la
,orma (<n
i
>). Si <n
i
> est& vac#o cuando se ejecuta la sentencia! $ste se
ignora. Podemos restringir la b*squeda a campos parciales especi,icando el
despla+amiento " la longitud.
o !ediante $n %ield-&'mbol - Podemos asignar la entrada de tabla le#da a un
,iled/s"mbol de,iniendo TresultU de la siguiente manera-
READ TAB(E 3itab4 32e04 ASSIGNING 3FS4'
Despu$s de la sentencia @EAD! el ,ield/s"mbol apunta a la l#nea de la tabla.
Si $ste es de tipo estructurado! deber#amos declarar el mismo tipo para el
,ield/s"mbol al declararlo. Esto nos permite direccionar los componentes
del ,ield/s"mbol. Si no especi,icamos el tipo est&ticamente! debemos usar
m&s ,ield/s"mbols " la t$cnica de asignacin de componentes de estructuras
para direccionarlas.
Oeamos! ahora! los siguientes ejemplos-
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIE !A"!ED TABLE OF LINE #IT! $NI%$E EY COL1.
)2
Tablas internas
DO 4 TI&E".
LINE'COL1 ( "Y'INDE).
LINE'COL2 ( "Y'INDE) ** 2.
IN"E+T LINE INTO TABLE ITAB.
ENDDO.
LINE'COL1 ( 2. LINE'COL2 ( 3.
+EAD TABLE ITAB F+O& LINE INTO LINE CO&PA+ING COL2.
#+ITE: ,"Y'"$B+C (,, "Y'"$B+C.
"IP.
#+ITE: - LINE'COL1, LINE'COL2.
La salida !" #"n"$a "l %$&#$a'a "s(
SY)S*+,- = 2
2 4
El programa rellena una tabla hashed con una lista de n*meros cuadrados.El NorI
area '7%E! que es compatible con el tipo de l#nea! se rellena con los n*meros 1 " 3.
'a sentencia @EAD lee la l#nea de la tabla en la que el campo clave C5') tiene el
mismo valor que en el NorI area " lo copia en $ste. S;/S6B@C toma el valor 1!
DATA: BEGIN OF (INE,
CO(& T!E I,
CO(2 T!E I,
END OF (INE'
DATA ITAB (I*E SORTED TAB(E OF (INE 1IT. UNI;UE *E CO(&'
DO D TI+ES'
(INE)CO(& - S)INDE/'
(INE)CO(2 - S)INDE/ LL 2'
INSERT (INE INTO TAB(E ITAB'
ENDDO'
C(EAR (INE'
READ TAB(E ITAB 1IT. TAB(E *E CO(& - >
INTO (INE TRANS!ORTING CO(2'
1RITE: HS)SUBRC -H, S)SUBRC,
K HS)TABI/ -H, S)TABI/'
S*I!'
1RITE: K (INE)CO(&, (INE)CO(2'
; su salida es-
"Y'"$B+C ( 0
"Y'TABI) ( 3
0 .
El programa rellena una tabla ordenada con una lista de n*meros cuadrados
tambi$n. 'a sentencia @EAD lee la l#nea de la tabla en la que el campo clave
C5') tiene el mismo valor que en el NorI area " lo copia en $ste. Slo el
)G
Tablas internas
contenido de C5'1 es copiado al NorI area '7%E. S;/S6B@C se pone a cero! "
S;/:AB7P en 3! porque 7:AB es un #ndice de la tabla.
DATA: BEGIN OF (INE,
CO(& T!E I,
CO(2 T!E I,
END OF (INE'
DATA ITAB (I*E SORTED TAB(E OF (INE 1IT. UNI;UE *E CO(&'
DO D TI+ES'
(INE)CO(& - S)INDE/'
(INE)CO(2 - S)INDE/ LL 2'
INSERT (INE INTO TAB(E ITAB'
ENDDO'
READ TAB(E ITAB 1IT. *E CO(2 - &G TRANS!ORTING NO FIE(DS'
1RITE: HS)SUBRC -H, S)SUBRC,
K HS)TABI/ -H, S)TABI/'
; la salida es-
"Y'"$B+C ( 0
"Y'TABI) ( 4
El programa rellena una tabla sorted con una lista de n*meros cuadrados. 'a
sentencia @EAD lee la l#nea de la tabla en la que el campo clave tiene el valor )G.
%o usa la clave de la tabla. %o se copia ning*n campo al NorI area ni se asigna a
ning*n ,ield/s"mbol. En lugar de eso! son las variables de sistema S;/S6B@C
?con valor ! "a que se encontr la l#neaA " S;/:AB7P ?con valor HA los *nicos que
toman alg*n valor.
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIE !A"!ED TABLE OF LINE #IT! $NI%$E EY COL1.
FIELD'"Y&BOL" /F"0 LIE LINE OF ITAB.
DO 4 TI&E".
LINE'COL1 ( "Y'INDE).
LINE'COL2 ( "Y'INDE) ** 2.
IN"E+T LINE INTO TABLE ITAB.
ENDDO.
+EAD TABLE ITAB #IT! TABLE EY COL1 ( 2 A""IGNING /F"0.
/F"0'COL2 ( 100.
)M
Tablas internas
LOOP AT ITAB INTO LINE.
#+ITE: - LINE'COL1, LINE'COL2.
ENDLOOP.
Y la salida d" "s." %$&#$a'a "s(
& &
2 &00
> M
D &G
El programa rellena una tabla hashed con una lista de n*meros cuadrados! como en
los casos anteriores. 'a sentencia @EAD lee la l#nea de la tabla en la que el campo
clave C5') tiene el valor 1! " lo asigna al ,ield/s"mbol T,sU. El programa!
entonces! asigna el valor ) al componente C5'1 de T,sU. Esto tambi$n cambia
el campo de la tabla correspondiente.
1.4.- 5odiicacin de lneas
Para cambiar una *nica l#nea de una tabla interna! debemos usar la sentencia 35D7=;.
:ambi$n podemos hacer uso de la clave de la tabla para encontrar " cambiar una l#nea
usando su clave! o encontrar " cambiar un conjunto de l#neas que satis,agan cierta
condicin. Si la tabla est& de,inida con la cl&usula %5%/6%786E <E; " ha" entradas
duplicadas! slo se modi,icar& la primera entrada.
1.4.1.- 'a"bio de una lnea "ediante la cla(e de la tabla
Para modi,icar una l#nea! hemos de usar la siguiente sentencia-
+ODIF TAB(E 3itab4 FRO+ 3Ba4 :TRANS!ORTING 3%&4 3% 24 '''<'
El NorI area TNaU! que debe ser compatible con el tipo de l#nea de la tabla interna!
juega un doble papel en esta sentencia. %o slo se utili+a para cambiar la l#nea que
se desea cambiar! sino que tambi$n contine los nuevos valores. El sistema busca en
la tabla interna la l#nea cu"a clave de tabla coincida con los campos clave de TNaU.
'as b*squedas en los di,erentes tipos de tabla son de la m#sma #ndole que las
e9plicadas hasta ahora4 a saber- b*squeda lineal! binaria " algoritmo hash para
tablas est&ndar! sorted " hashed! respectivamente! con las caracter#sticas
anteriormente descritas.
De igual ,orma! las variables de sistema cambian de valor de manera id$ntica a la
descrita hasta ahora.
1.4.2.- 'a"biar (arias lneas "ediante una condicin
Para cambiar una o m&s l#neas mediante una condicin! hemos de utili+ar la
siguiente sentencia-
+ODIF 3itab4 FRO+ 3Ba4 TRANS!ORTING 3%&4 3% 24 ''' 1.ERE 3"on#4'
Esto procesa todas las l#neas que satis,agan la condicin lgica TcondU. Vsta puede
consistir en m&s de una comparacin. En cada una de ellas! el primer operando
debe ser un componente de la estructura de la l#nea. Si las l#neas de la tabla no
est&n estructuradas! el primer operando tambi$n puede ser la e9presin :AB'E
'7%E. 'a comparacin entonces se aplica a la l#nea entera.
El NorI area TNaU! que ha de ser compatible con el tipo de l#nea de la tabla
interna! contiene ahora los nuevos valores! que se asignar&n a la l#nea pertinente de
)E
Tablas internas
la tabla mediante el par&metro :@A%SP5@:7%0. A di,erencia de la sentencia
35D7=; de arriba! en este caso :@A%SP5@:7%0 no es opcional. Adem&s! slo
podemos modi,icar los campos clave de la tabla interna si $sta es est&ndar. Con tal
de que una sola l#nea sea cambiada! S;/S6B@C devuelve el valor ! en caso
contrario! H.
Oeamos los siguientes ejemplos-
DATA: BEGIN OF (INE,
CO(& T!E I,
CO(2 T!E I,
END OF (INE'
DATA ITAB (I*E .AS.ED TAB(E OF (INE 1IT. UNI;UE *E CO(&'
DO D TI+ES'
(INE)CO(& - S)INDE/'
(INE)CO(2 - S)INDE/ LL 2'
INSERT (INE INTO TAB(E ITAB'
ENDDO'
(INE)CO(& - 2' (INE)CO(2 - &00'
+ODIF TAB(E ITAB FRO+ (INE'
(OO! AT ITAB INTO (INE'
1RITE: K (INE)CO(&, (INE)CO(2'
END(OO!'
8ue genera la siguiente salida-
1 1
2 100
3 .
4 11
Como podemos comprobar! el programa rellena una tabla hashed! " modi,ica el
valor pertinente en la sentencia 35D7=; ?en este caso el 1A.
Aqu# tenemos otro programa-
DATA: BEGIN OF (INE,
CO(& T!E I,
CO(2 T!E I,
END OF (INE'
DATA ITAB (I*E .AS.ED TAB(E OF (INE 1IT. UNI;UE *E CO(&'
DO D TI+ES'
(INE)CO(& - S)INDE/'
(INE)CO(2 - S)INDE/ LL 2'
INSERT (INE INTO TAB(E ITAB'
ENDDO'
(INE)CO(2 - &00'
+ODIF ITAB FRO+ (INE TRANS!ORTING CO(2
1.ERE ( CO(2 4 & ) AND ( CO(& 3 D )'
)Q
Tablas internas
(OO! AT ITAB INTO (INE'
1RITE: K (INE)CO(&, (INE)CO(2'
END(OO!'
-!/a salida "s(
1 1
2 100
3 100
4 11
Este *ltimo rellena la tabla hashed! en primer t$rmino! para despu$s modi,icarla
seg*n la condicin ? CO(2 4 & ) AND ( CO(& 3 D )'
1.5.- 6orrado de lneas
Deberemos usar la sentencia DE'E:E para borrar una l#nea de una tabla interna. :ambi$n
podemos hacer uso de la clave de la tabla para encontrar " borrar la l#nea que nos interese!
o un conjunto de ellas que satis,agan una condicin! o un conjunto de entradas duplicadas.
Si la tabla est& de,inida con la cl&usula %5%/6%786E <E; " ha" entradas duplicadas!
slo se borrar& la primera.
1.5.1.- 6orrar una lnea "ediante la cla(e de tabla
Debemos usar la siguiente sentencia-
0ELETE T1+LE <i.a2> 3,45 <6a>.
4(
0ELETE T1+LE <i.a2> 78T9 T1+LE :EY <k1> = <f 1> ... <k n> = <f n>.
En el primer caso! TNaU debe ser compatible con el tipo de l#nea de TitabU. 'os
calores de los campos de la clave se toman de los componentes correspondientes
del NorI area.
En el segundo caso! hemos de se(alar los valores de cada campo e9pl#citamente. Si
no sabemos alguno de los nombres de los campos clave hasta el tiempo de
ejecucin! podemos especi,icarlo como el contenido de un campo <n
i
> utili+ando
la ,orma (<n
i
>) = <f
i
>. Si los tipos de datos de T,iU no son compatibles con los
campos de la clave! el sistema los convierte autom&ticamente.
'a b*squeda en los di,erentes tipos de tablas se reali+an como "a se ha comentado
en apartados anteriores " los valores de las variables de sistema se establecen
con,orme a lo anteriormente descrito! tambi$n.
1.5.2.- 6orrar (arias lneas "ediante una condicin
Para borrar varias l#neas de una tabla bastar& usar la siguiente sentencia-
0ELETE <i.a2> 79E,E <;&nd>.
TcondU puede ser! bien una sola condicin! o bien varias.
1.5.3.- 6orrar entradas duplicadas ad7acentes
6saremos la siguiente sentencia-
1
Tablas internas
0ELETE 10<1-E=T 0*PL8-1TE 3,45 <i.a2>
>-45P1,8=? <f1> <f 2> ...
@1LL 38EL0SA.
'as entradas est&n duplicadas si satis,acen uno de los siguientes criterios de
comparacin-
o Sin el par&metro C53PA@7%0! los contenidos de los campos de la clave
de la tabla deben ser id$nticos en ambas l#neas.
o Si usamos el par&metro -45P1,8=? <f1> <f 2> ... los contenidos de los
campos especi,icados <f
1
> <f
2
> ... deben ser id$nticos! tambi$n! para
ambas l#neas.
o ; si usamos el par&metro C53PA@7%0 A'' =7E'DS los contenidos de
todos los campos de ambas l#neas deben ser iguales.
Podemos usar esta sentencia para borrar todas las entradas duplicadas de la tabla
interna si $sta se encuentra ordenada por el criterio de comparacin especi,icado.
'a variable de sistema S;/S6B@C pasa a tener el valor con tal de que una sola
l#nea ha"a sido borrada.
Oeamos ahora algunos ejemplos-
DATA: BEGIN OF (INE,
CO(& T!E I,
CO(2 T!E I,
END OF (INE'
DATA ITAB (I*E .AS.ED TAB(E OF (INE 1IT. UNI;UE *E CO(&'
DO D TI+ES'
(INE)CO(& - S)INDE/'
(INE)CO(2 - S)INDE/ LL 2'
INSERT (INE INTO TAB(E ITAB'
ENDDO'
(INE)CO(& - &'
DE(ETE TAB(E ITAB: FRO+ (INE,
1IT. TAB(E *E CO(& - >'
(OO! AT ITAB INTO (INE'
1RITE: K (INE)CO(&, (INE)CO(2'
END(OO!'
B!" #"n"$a "s.a salida(
2 4
4 11
El programa! primero! rellena una tabla interna con una lista de n*mero cuadrados.
Posteriormente! la sentencia DE'E:E borra las l#neas de la tabla interna que
contienen en C5') el valor ) o 3.
DATA: BEGIN OF (INE,
CO(& T!E I,
CO(2 T!E I,
END OF (INE'
DATA ITAB (I*E .AS.ED TAB(E OF (INE 1IT. UNI;UE *E CO(&'
1)
Tablas internas
DO D TI+ES'
(INE)CO(& - S)INDE/'
(INE)CO(2 - S)INDE/ LL 2'
INSERT (INE INTO TAB(E ITAB'
ENDDO'
DE(ETE ITAB 1.ERE ( CO(2 4 & ) AND ( CO(& 3 D )'
(OO! AT ITAB INTO (INE'
1RITE: K (INE)CO(&, (INE)CO(2'
END(OO!'
Cu"a salida es-
1 1
4 11
En este otro! vemos otra sentencia DE'E:E con otra condicin lgica.
DATA OFF T!E I'
DATA: BEGIN OF (INE,
CO(& T!E I,
CO(2 T!E C,
END OF (INE'
DATA ITAB (I*E STANDARD TAB(E OF (INE
1IT. NON)UNI;UE *E CO(2'
(INE)CO(& - &' (INE)CO(2 - HAH' A!!END (INE TO ITAB'
(INE)CO(& - &' (INE)CO(2 - HAH' A!!END (INE TO ITAB'
(INE)CO(& - &' (INE)CO(2 - HBH' A!!END (INE TO ITAB'
(INE)CO(& - 2' (INE)CO(2 - HBH' A!!END (INE TO ITAB'
(INE)CO(& - >' (INE)CO(2 - HBH' A!!END (INE TO ITAB'
(INE)CO(& - D' (INE)CO(2 - HBH' A!!END (INE TO ITAB'
(INE)CO(& - F' (INE)CO(2 - HAH' A!!END (INE TO ITAB'
OFF - 0' !ERFOR+ (IST'
DE(ETE ADNACENT DU!(ICATES FRO+ ITAB CO+!ARING A(( FIE(DS'
OFF - &D' !ERFOR+ (IST'
DE(ETE ADNACENT DU!(ICATES FRO+ ITAB CO+!ARING CO(&'
OFF - 2O' !ERFOR+ (IST'
DE(ETE ADNACENT DU!(ICATES FRO+ ITAB'
OFF - D2' !ERFOR+ (IST'
FOR+ (IST'
S*I! TO (INE >'
(OO! AT ITAB INTO (INE'
1RITE: AT KOFF (INE)CO(&, (INE)CO(2'
END(OO!'
ENDFOR+'
11
Tablas internas
8ue genera esta otra salida-
1 A 1 A 1 A 1 A
1 A 1 B 2 B 2 B
1 B 2 B 3 B 5 A
2 B 3 B 4 B
3 B 4 B 5 A
4 B 5 A
5 A
Este *ltimo ejemplo crea " rellena una tabla est&ndar. 'a primera sentencia
DE'E:E borra la segunda l#nea de 7:AB "a que tiene los mismos contenidos que
la primera. 'a segunda sentencia DE'E:E borra la segunda l#nea de la tabla
resultante de la primera oparacin porque los contenidos del campo C5') son
id$nticos que los de la primera l#nea. El tercer DE'E:E borra la tercera " cuarta
l#nea porque los contenidos del campo clave por de,ecto C5'1 son los mismos que
la segunda l#nea. Aunque los contenidos de las claves por de,ecto son los mismos
para las l#neas primera " quinta! $sta *ltima no se borra al no ser ad"acente a la
primera.
1.$.- 8rodcesa"iento de tablas en sentencias 3,,8
Podemos usar la sentencia '55P para el procesamiento " recorrido de cualquier tabla
interna-
(OO! AT 3itab4 3re7?$t4 3"on#ition4'
37tatement b$o"24
END(OO!'
Esta instruccin lee las l#neas de la tabla una a una tal " como se especi,icar#a en TresultU.
Adem&s! podemos reali+ar el '55P para todas las entradas de la tabla! o bien restringir el
recorrido slo para parte de ella! especi,icando una condicin ?TconditionUA. Se permite
cierto control del nivel de procesamiento dentro del '55P.
'a secuencia en la que las l#neas se procesan depende del tipo de tabla-
o Tablas estndar ' sorted:
'as l#neas se procesan de acuerdo con un #ndice lineal. Dentro del bloque de
procesamiento! la variable de sistema S;/:AB7P contiene el #ndice de la l#nea actual
de procesamiento.
o Tablas hashed:
3ientras la tabla no est$ ordenada! las l#neas se procesan en el orden en que han sido
a(adidas a la tabla. Dentro del bloque de procesamiento! S;/:AB7P se mantiene
constante a .
As# mismo! podemos anidar bloques '55P. Cuando abandonamos un buqle '55P! S;/
:AB7P recupera el valor que ten#a justo antes de entrar en $l. Adem&s! S;/S6B@C toma
el valor con tal de que al menos una entrada de la tabla ha"a sido procesada.
Dentro de un bucle '55P no se permite reali+ar operaciones a nivel global de la tabla!
sino de l#nea a l#nea individualmente.
13
Tablas internas
1.$.1.- )einiendo una opcin de procesa"iento e0tra
'a opcin de procesamiento especi,ica cmo se puede disponer de una l#nea dentro
de la l#nea de procesamiento.
1.$.1.1.- 5ediante el 9or: area
Para colocar la l#nea actual del '55P en un NorI area! hemos de de,inir
TresultU de la siguiente ,orma-
(OO! AT 3itab4 INTO 3Ba4 3"on#ition4'
'os contenidos de las l#neas de la tabla han de poder ser convertibles al tipo
del Na. En cada pasada del '55P! una l#nea de la tabla se copia en el Na.
El ,inal del '55P no a,ecta al Na! es decir! los contenidos del Na son los
mismos despu$s de la sentencia E%D'55P "a que ,ueron copiados en la
*ltima pasada del bucle.
1.$.1.2.- 5ediante un ield-s7"bol
Para asignar el contenido de la l#nea actual del '55P a un ,ield/s"mbol!
debemos especi,icar TresultU de la siguiente manera-
(OO! AT 3itab4 ASSIGNING 3FS4 3"on#ition74'
En cada pasada del '55P! el ,ield s"mbol T,sU apunta a la l#nea de la tabla
le#da. Si el tipo de l#nea es estructurado! deber#amos especi,icar el mismo
tipo para el ,ield s"mbol al declararlo. Esto nos permite direccionar los
componentes del ,ield s"mbol.
Como en el caso del NorI area! el ,inal del bucle '55P no a,ecta al ,ield/
s"mbol! debido a que $ste se queda apuntando a la *ltima l#nea de la tabla
tras la *ltima pasada del bucle.
1.$.1.3.- +upri"iendo la asi%nacin de lneas
Si no necesitamos trans,erir los contenidos de la l#nea de la tabla actual a un
NorI area ni a un ,ield/s"mbol! podemos usar la siguiente sentencia-
(OO! AT 3itab4 TRANS!ORTING NO FIE(DS 3"on#ition4'
Esta modalidad de '55P es especialmente *til si queremos encontrar el
#ndice de una tabla interna particular! o el n*mero de l#neas de una tabla que
satis,agan una cierta condicin.
1.$.2.- /speciicacin de condiciones
Para evitar el tener que leer la totalidad de las l#neas de una tabla interna! podemos
especi,icar una condicin de seleccin de la siguiente manera-
(OO! AT 3itab4 3re7?$t4 1.ERE 3"on#4'
Aqu# accederemos secuencialmente a las l#neas que slo satis,agan ciertas
condiciones. Si las l#neas de la tabla no son estructuradas! el primer operando de la
condicin puede ser :AB'E '7%E. 'a comparacin entonces se aplica a toda la
l#nea.
1H
Tablas internas
1.$.3.- 'ontrol del ni(el de procesa"iento
Este control consiste en que podemos dividir secuencias de entradas en grupos
bas&ndonos en el contenido de ciertos campos.
'as tablas internas est&n divididas en grupos de acuerdo con la secuencia de los
campos en la l#nea estructurada.
Dicho de otro modo! nos es posible estructurar el desarrollo del '55P en ,uncin
de los valores de los campos! seg*n las siguientes variantes-
le!el" #eanin$
FIRST
P$i'"$a lCn"a d" la .a2la in."$na
LAST
Dl.i'a lCn"a d" la .a2la in."$na
NEW <f>
-&'i"nE& d" !n #$!%& d" lCn"as ;&n ;&n."nid&s idFn.i;&s "n "l ;a'%& <f>
END Of <f>
3inal d" !n #$!%& d" lCn"as ;&n ;&n."nid&s idFn.i;&s "n "l ;a'%& <f>
El siguiente diagrama ilustra el control de nivel de procesamiento en una tabla
ordenada! donde los di,erentes contenidos de cada campo se di,erencian por el
color-
12
Tablas internas
Con la sentencia A: se nos permite gestionar la sentencia '55P en ,uncin de
esos cambios en los contenidos de los campos que aqu# re,erenciamos mediante un
cambio de color.
En general! la sentencia A: tiene el siguiente aspecto-
(OO! AT 3itab4'
AT FIRST' ''' ENDAT'
AT NE1 3%&4' '''''' ENDAT'
AT NE1 3%2 4' '''''' ENDAT'
'''''''
37in@$e $ine ,ro"e77in@4
'''''''
AT END OF 3%24' ''' ENDAT'
AT END OF 3%&4' ''' ENDAT'
AT (AST' '''' ENDAT'
END(OO!'
Si estamos trabajando con un Na! $ste no contiene la l#nea actual en el bloque
A:R E%DA:. :odos los caracteres a la derecha de la actual clave de grupo son
rellenados con asteriscos. :odos los dem&s campos a la derecha de la clave de
grupo actual contienen su valor inicial.
Dentro de un bloque A:R E%DA:! podemos calcular los contenidos de los
campos num$ricos correspondientes al nivel actual mediante la sentencia &!.
Si la tabla contiene otra tabla anidada! no podremos usar la sentencia S63.
Oeamos los siuientes ejemplos-
1G
Tablas internas
DATA: BEGIN OF (INE,
CO(& T!E C,
CO(2 T!E I,
CO(> T!E I,
END OF (INE'
DATA ITAB (I*E .AS.ED TAB(E OF (INE
1IT. UNI;UE *E CO(& CO(2'
(INE)CO(& - HAH'
DO > TI+ES'
(INE)CO(2 - S)INDE/'
(INE)CO(> - S)INDE/ LL 2'
INSERT (INE INTO TAB(E ITAB'
ENDDO'
(INE)CO(& - HBH'
DO > TI+ES'
(INE)CO(2 - 2 L S)INDE/'
(INE)CO(> - ( 2 L S)INDE/ ) LL 2'
INSERT (INE INTO TAB(E ITAB'
ENDDO'
SORT ITAB'
(OO! AT ITAB INTO (INE'
1RITE: K (INE)CO(&, (INE)CO(2, (INE)CO(>'
AT END OF CO(&'
SU+'
U(INE'
1RITE: K (INE)CO(&, (INE)CO(2, (INE)CO(>'
S*I!'
ENDAT'
AT (AST'
SU+'
U(INE'
1RITE: K (INE)CO(&, (INE)CO(2, (INE)CO(>'
ENDAT'
END(OO!'
B!" #"n"$a la si#!i"n." salida(
A 1 1
A 2 4
A 3 .
22222222222222222222222222222222
A 1 14
B 2 4
B 4 11
B 1 31
22222222222222222222222222222222
B 12 51
22222222222222222222222222222222
1M
Tablas internas
* 13 40
El programa crea una tabla hashed 7:AB! la rellena con seis l#neas " la ordena. En
el bloque '55P/E%D'55P! el NorI area '7%E es presentado por pantalla en cada
pasada del '55P. El primer campo de la clave de la tabla! C5')! se usa para el
control del nivel de procesamiento. El total para todos los campos num$ricos
siempre se calcula cuando el contenido de C5') cambia " el sistema se encuentra
en la *ltima pasada del '55P.
DATA: BEGIN OF (INE,
CARRID T!E SBOO*)CARRID,
CONNID T!E SBOO*)CONNID,
F(DATE T!E SBOO*)F(DATE,
CUSTT!E T!E SBOO*)CUSTT!E,
C(ASS T!E SBOO*)C(ASS,
BOO*ID T!E SBOO*)BOO*ID,
END OF (INE'
DATA ITAB (I*E SORTED TAB(E OF (INE 1IT. UNI;UE *E TAB(E (INE'
SE(ECT CARRID CONNID F(DATE CUSTT!E C(ASS BOO*ID
FRO+ SBOO* INTO CORRES!ONDING FIE(DS OF TAB(E ITAB'
(OO! AT ITAB INTO (INE'
AT FIRST'
1RITE K H(i7t o% Boo2in@7H'
U(INE'
ENDAT'
AT NE1 CARRID'
1RITE: K HCarri#:H, (INE)CARRID'
ENDAT'
AT NE1 CONNID'
1RITE: K HConni#:H, (INE)CONNID'
ENDAT'
AT NE1 F(DATE'
1RITE: K HF$#ate:H, (INE)F(DATE'
ENDAT'
AT NE1 CUSTT!E'
1RITE: K HC?7tt0,e:H, (INE)CUSTT!E'
ENDAT'
1RITE: K (INE)BOO*ID, (INE)C(ASS'
AT END OF C(ASS'
U(INE'
ENDAT'
END(OO!'
En este ejemplo! la tabla sorted interna es rellenada con datos de la tabla de la base
de datos SB55< mediante la sentencia SE'EC:. 'a secuencia de las columnas en
la tabla interna de,ine la jerarqu#a del nivel de control. Debido a que la clave de la
tabla es la l#nea entera! la sequencia de ordenacin " la jerarqu#a del nivel de
control son las mismas.
El programa genera la siguiente salida-
1E
Tablas internas
L567 of Boo859:6
Ca;;5d: AA
Co995d: 0014
F<da7e: 1..3-11-22
C=677>?e: B
0001350. C
00013514 C
...
2222222222222222222222222222222222222222222222
00013532 F
00013535 F
...
2222222222222222222222222222222222222222222222
C=677>?e: P
00013153 C
00013154 C
...
2222222222222222222222222222222222222222222222
00013113 F
00013140 F
...
2222222222222222222222222222222222222222222222
F<da7e: 1..3-2.-11
C=677>?e: B
00014120 C
00014121 C
...
; contin*a.
1.1.- Iniciali;ar tablas
Como cualquier otro objeto de datos! las tablas internas pueden ser iniciali+adas con esta
sentencia-
CLEAR <itab>.
Este sentencia reestablece una tabla interna al estado en el que se encontraba
inmediatamente despues de haber sido declarada. Esto signi,ica que a partir de entonces la
tabnla interna no contiene ninguna l#nea. Sin embargo! la memoria "a ocupada por la tabla
interna hasta que la reiniciali+amos con C'EA@ permanece locali+ada " reservada.
Si estamos usando tablas internas con l#neas de cabecera! hemos de recordar que tanto las
tablas como sus l#neas de cabecera tienen el mismo nombre. Si lo que queremos es
re,erenciar el cuerpo de la tabla! habremos de invocar el nombre de la misma seguido con
un par de corchetes ?W XA-
C(EAR 3itab4:<'
Para asegurarnos de que la tabla se ha iniciali+ado! podemos usar la sentencia siguiente-
REFRES. 3itab4'
Vsta siempre se aplica al cuerpo de la tabla. As# como en la sentencia C'EA@! $sta *ltima
deja reservado el espacio de memoria que ten#a la tabla.
%o obstante! si lo que queremos es liberar dicho espacio en memoria! usaremos la
siguiente sentencia-
FREE 3itab4'
1Q
Tablas internas
>emos de recordar que esta sentencia tiene e,ecto sobre el cuerpo de la tabla " no sobre el
NorI area.
DATA: BEGIN OF (INE,
CO(&,
CO(2,
END OF (INE'
DATA ITAB (I*E TAB(E OF (INE'
(INE)CO(& - HAH' (INE)CO(2 - HBH'
A!!END (INE TO ITAB'
REFRES. ITAB'
IF ITAB IS INITIA('
1RITE HITAB i7 em,t0H'
FREE ITAB'
ENDIF'
; la salida del programa es-
ITAB 56 e@?7>.
En este programa! una tabla interna 7:AB se rellena primero! " se iniciali+a con
@E=@ES>! despu$s. 'a sentencia 7= utili+a la e9presin 7:AB 7S 7%7:7A' para averiguar
si 7:AB est& vac#a o no. De estarlo! la memoria es borrada.
1.<.- ,rdenacin de tablas internas
En ABAP podemos ordenar una tabla est&ndar o hashed! para lo que usaremos la
sieguiente sentencia-
SORT 3itab4 :ASCENDING6DESCENDING< :AS TE/T< :STAB(E<'
Esta sentencia se aplica a la tabla en s# misma! nunca a la l#nea de cabecera.
El modo de ordenacin se especi,ca mediante el par&metro ASCE%D7%0 o
DESCE%D7%0! siendo el primero el que se reali+a por de,ecto. En general! el sentido de
la ordenacin depende de los campos de la clave de la tabla interna. 'a clave de
ordenacin por de,ecto se hace con los campos no num$ricos de la l#nea de la tabla en el
orden en el que est&n dispuestos.
Cuanto m&s grande sea la clave de ordenacin! m&s tiempo necesitar& el sistema para
ordenar la tabla. Si $sta adem&s contiene una tabla interna! el proceso de ordenacin puede
ser considerablemente m&s lento.
Por otro lado! no nos es posible la ordenacin de tablas sorted! debido a que el sistema las
mantiene "a ordenadas autom&ticamente. Si aplicamos la sentencia S5@: a una tabla
sorted! aqu$lla causar& un error de sinta9is.
1.<.1.- ,rdenacin con otra cla(e
Si tenemos una tabla interna con un tipo de l#nea estructutrado que queramos
ordenar con una clave di,erente de la de por de,ecto! podemos especi,carlo en la
sentencia S5@:-
3
Tablas internas
SORT 3itab4 :ASCENDING6DESCENDING< :AS TE/T< :STAB(E<
B 3%&4 :ASCENDING6DESCENDING< :AS TE/T<
'''
3%n4 :ASCENDING6DESCENDING< :AS TE/T<'
'a tabla est& ahora ordenada por los componentes especi,icados <f
1
> ... <f
n
> en
lugar de estarlo por la clave de la tabla. El n*mero de campos de ordenacin se
limita a 12. Como en el anterior caso! el modo de ordenacin depende de la
secuencia de los campos <f
i
>. 'a secuencia de ordenacin especi,icada antes de
B; se aplica a todos los campos. 'a secuencia de ordenacin despu$s de un campo
se aplica slo a esa columna de la tabla.
1.<.2.- ,rdenacin alab&tica
Adem&s de los casos de ordenacin ascendente o descendente! $sta puede ser
al,ab$tica-
SORT 3itab4 ''' AS TE/T ''' '
Esta sentencia a,ecta a la ordenacin de cadenas de caracteres. Sin ella! dichas
cedenas se ordenan de acuerdo con la secuencia especi,icada por la plata,orma
hardNare del sistema. Con la opcin AS :EP:! el sistema ordena campos de
caracteres al,ab$ticamente de acuerdo con el entorno te9tual actual. Por de,ecto!
dicho entorno te9tual se establece en el registro maestro del usuario. Sin embargo!
tambi$n podemos especi,icarlo e9pl#citamente usando la sentencia-
SET (OCA(E (ANGUAGE
'a cl&usula AS :EP: nos ahorrar& el tener que converitr cadenas a un ,ormato de
ordenacin compatible.
Si AS :EP: se aplica a toda la ordenacin entera! $sta slo a,ecta a los campos de
tipo C. De ser aplicada a un campo concreto! $ste ha de ser de tipo C! igualmente.
1.=.- )eter"inacin de los atributos de una tabla interna
Para averiguar los atributos de una tabla interna en tiempo de ejecucin que no est&n
disponibles est&ticamente! debemos usar la sentencia-
DESCRIBE TAB(E 3itab4 :(INES 3$4< :OCCURS 3n4< :*IND 324<'
Si usamos el par&metro '7%ES! el n*mero de l#neas rellenas se escribir& en la variable TlU.
Si usamos el par&metro 5CC6@S! el valor del tama(o inicial de la tabla se escribir& en la
variable TnU. Si usamos el par&metro <7%D! el tipo de tabla interna se devolver& mediante
la variable TIU- Y:Z para tablas est&ndar! YSZ para tablas est&ndar " Y>Z para las hashed.
DATA: BEGIN OF (INE,
CO(& T!E I,
CO(2 T!E I,
END OF (INE'
DATA ITAB (I*E .AS.ED TAB(E OF (INE 1IT. UNI;UE *E CO(&
INITIA( SI=E &0'
DATA: (IN T!E I,
INI T!E I,
*ND T!E C'
3)
Tablas internas
DESCRIBE TAB(E ITAB (INES (IN OCCURS INI *IND *ND'
1RITE: K (IN, INI, *ND'
DO &000 TI+ES'
(INE)CO(& - S)INDE/'
(INE)CO(2 - S)INDE/ LL 2'
INSERT (INE INTO TAB(E ITAB'
ENDDO'
DESCRIBE TAB(E ITAB (INES (IN OCCURS INI *IND *ND'
1RITE: K (IN, INI, *ND'
'a salida ser#a-
0 10 !
1,000 10 !
Aqu#! se crea una tabla hashed que se rellena posteriormente. 'a sentencia DESC@7BE
:AB'E de procesa antes " despu$s del llenado de la tabla. El n*mero de l#neas actual
cambia! no as# el n*mero de l#neas inicial.
31

También podría gustarte