Está en la página 1de 4

Tablas internas

Ya habamos comentado que las tablas internas sirven para almacenar informacin extrada
de la base de datos. En este ejemplo voy a utilizar una tabla interna que ya habamos
declarado previamente.

* Tabla de vuelos
DATA:
BEGIN OF i_vuelos OCCURS 0,
carrid LIKE sflight-carrid, "Cdigo de aerolnea
connid LIKE sflight-connid, "Nmero de vuelo
fldate LIKE sflight-fldate, "Fecha de vuelo
planetype LIKE sflight-planetype, "Tipo de avin
END OF i_vuelos.

La sentencia select...endselect
Esta sentencia realiza una lectura lineal de los datos de las tablas de la base de datos y los
asigna directamente a los campos de nuestra tabla interna. Pero atencin, para que queden
almacenados sobre la tabla interna para cada registro seleccionado debemos utilizar la
sentencia APPEND. As, haremos aadiremos los registros a nuestra tabla interna.

SELECT * FROM sflight WHERE carrid IN s_carrid.


i_vuelos-carrid = sflight-carrid.
i_vuelos-connid = sflight-connid.
i_vuelos-fldate = sflight-fldate.
i_vuelos-planetype = sflight-planetype.
APPEND i_vuelos. CLEAR i_vuelos.
ENDSELECT.

El smbolo (*) le indica a SAP que debe guardar en memoria absolutamente todos
los valores de todos los campos de cada registro de la tabla SAP.
La clusula WHERE nos permite indicar el filtro de seleccin. En este caso
utilizamos como filtro el rango de cdigos de aerolneas. De la tabla sflightslo
recuperaremos aquellos registros que cumplan con la condicin indicada en
el WHERE.
Seguidamente asignamos a cada campo de la tabla interna el valor del campo de la
tabla SAP, dejndolo a nivel de la cabecera de la tabla interna.
Finalmente, guardamos el registro en nuesta tabla interna mediante la sentencia
APPEND.
Con la sentencia CLEAR limpiamos la cabecera y la dejamos lista para el siguiente
registro.

La sentencia SELECT...ENDSELECT ir pasando uno a uno por cada uno de los registros
que cumplan la condicin de la clusula WHERE y los ir almacenando gracias a la
sentencia APPEND dentro de nuestra tabla interna.

El mayor inconveniente de trabajar con la forma SELECT...ENDSELECT es que la


lectura se hace linealmente, es decir, SAP debe pasar por cada uno de los registros
individualmente hasta llegar al final. Esto hace que la bsqueda de datos sea muy
ineficiente en trminos de rendimiento y alarga innecesariamente el tiempo de ejecucin del
programa.

Una forma de mejorar el rendimiento sera no utilizar la clusula (*) sino indicar
especficamente los campos que necesitamos llenar.

SELECT carrid connid fldate planetype FROM sflight


INTO (i_vuelos-carrid, i_vuelos-connid, i_vuelos-fldate,
i_vuelos-planetype)
WHERE carrid IN s_carrid.
APPEND i_vuelos. CLEAR i_vuelos.
ENDSELECT.

Al no usar todos los campos mejoramos el rendimiento y con la clusulo INTO asignamos
directamente el valor al campo de la tabla interna.

Otra forma de sentencia select.


Existe otra forma de la sentencia SELECT mucho ms eficiente nos permite almacenar los
datos en la tabla interna sin necesidad de utilizar la sentencia APPEND. El mismo efecto
que en el caso anterior lo obtendramos usando...

SELECT * FROM sflight


INTO CORRESPONDING FIELDS OF TABLE i_vuelos
WHERE carrid IN s_carrid.

Seguimos utilizando el valor (*) para leer todos los campos.


La clasula INTO CORRESPONDING FIELDS OF TABLE compara el nombre
del campo de la tabla de SAP con cada nombre de la tabla interna. Si encuentra
coincidencia le asigna su valor correspondiente. Por eso, es tan importante que el
nombre de los campos de una tabla interna sean iguales al nombre de los campos de
una tabla SAP. De lo contrario, esta forma no se puede utilizar.
Se mantiene la clusula WHERE.
Se elimina la sentencia APPEND ya que la lectura deja de ser secuencial sino en
bloques. Es decir, SAP ya no tiene que recorrer uno a uno todos los registros, sino
que toma el bloque de registros que coinciden con la condicin determinada a travs
de la clusula WHERE y lo asigna en bloque a la tabla interna.

Y an, otra variacin que podemos utilizar sera:


SELECT carrid connid fldate planetype FROM sflight
INTO TABLE i_vuelos
WHERE carrid IN s_carrid.

Esta forma es todava ms eficiente ya que:

Evita el uso de (*) y en su lugar slo toma el valor de los campos que nos interesa
(carrid, connid, fldate y planetype).
La clusula INTO TABLE asigna estos cuatro campos a los cuatro primeros campos
de la tabla interna. As que, cuidado, el orden en que se hayan declarado estos
campos en la tabla interna es importante. Aqu no hay asignacin por nombre de
campo, sino por posicin, el valor del campo carrid de la tabla sflight se asignar al
primer campo de la tabla interna, el valor del campo connid de la tabla sflight se
asignar al segundo campo de la tabla interna, y as sucesivamente. Aqu ya no es
tan importante el nombre de los campos de la tabla interna, pero s la longitud y el
tipo de esos campos. Si no lo tenemos cuenta nuestro programa acabar
abruptamente con dump breve.

La sentencia select para recuperar


registros individualmente.
Finalmente, otra forma que se utiliza mucho, es la sentencia SELECT SINGLE.

SELECT SINGLE * FROM sflight


WHERE connid = p_connid.

Se utiliza si lo que nos interesa es nicamente un registro de nuestra tabla de base de datos.
En en el ejemplo, me interesa un nmero de vuelo en concreto y utilizo la
sentencia SELECT con la clusula SINGLE. Es muy habitual que despus de escribir esta
sentencia se escriba una condicin del tipo IF sy-subrc ... ENDIF.

SELECT SINGLE * FROM sflight


WHERE connid = p_connid.
IF sy-subrc = 0.
i_vuelos-connid = sflight-connid.
APPEND i_vuelos. CLEAR i_vuelos.
ENDIF.

El campo sy-subrc es un campo de sistema y si el resultado es 0 significa que la sentencia


que se ha ejecutado anteriormente lo ha hecho de forma satisfactoria. Si el valor, en
cambio, fuese 4 o cualquier otro, entonces hemos de suponer que dentro de la
tabla sflight no existe ningn registro que confirme la condicin dada en la
clusula WHERE.
Por supuesto, podemos hacer esta sentencia un poco ms eficiente de la siguiente forma:

SELECT SINGLE connid FROM sflight


INTO i_vuelos-connid
WHERE connid = p_connid.
APPEND i_vuelos. CLEAR i_vuelos.

Haciendo joining de tablas


sta es ya una forma ms avanzada de bsqueda de informacin en dos o ms tablas de una
base de datos que nos permite guardar los datos en una sola tabla interna con criterios de
seleccin complejos. Como esto no es ms que una introduccin al lenguaje ABAP slo la
voy a mencionar. Si queris obtener informacin de su manejo podis acudir a la
sentencia ABAPHELP y pedir ayuda por el keyword inner join.

Por cierto, todo lo que se explica en este artculo se refiere a ABAP SQL. Ya sabis que
SAP admite tambin SQL nativo, aunque no lo recomienda, ni yo lo explico en este
artculo.

En el prximo artculo, el ltimo de esta serie, hablaremos de cmo presentar los datos por
pantalla.

También podría gustarte