Você está na página 1de 10

1.

DECLARACIONES:

Tablas de diccionario
En primer lugar debemos declarar las tablas de diccionario. Sern aquellas tablas de
las que vamos a extraer informacin y que vamos a utilizar posteriormente. La
sentencia que utilizamos para ello es la sentencia tables.
Ejemplo de la sentencia tables:
*******************************************************************
****
Tablas
*******************************************************************
****
TABLES:
sflight,
saplane,
scarr.
Variables globales
Son aquellas variables visibles desde cualquier punto del programa y que contienen
un nico dato. Se declaran mediante la sentencia data seguida del tipo de dato.
Ejemplo:
*******************************************************************
*****
*Variables globales
*******************************************************************
*****
DATA:
g_vuelo(4) TYPE n,
"Nmero de vuelo
g_fecha TYPE s_date,
"Fecha del vuelo
g_precio LIKE sflight-price. "Precio del vuelo
NOTA: Usamos TYPE cuando se usara los tipos ABAP predefinidos (s_date, n, c y
otros). Usamos LIKE si nuestra variable ser igual a un campo que ya exista en una
tabla de diccionario.

Constantes
Al contrario que una variable, las constantes que se declaran al principio del
programa nunca podrn modificar su valor durante la ejecucin del programa. En un
programa se utilizan para evitar escribir valores literales. La sentencia utilizada es la
sentencia constants.
Ejemplo de la sentencia constants:
*******************************************************************
*****
*Constantes
*******************************************************************
*****
CONSTANTS:
c_vuelo(5) TYPE c VALUE 'Vuelo',
c_fecha TYPE d VALUE '20121231'.

Estructuras
Son matrices de datos unidimensionales. En palabras sencillas, una estructura es un
encadenamiento de variables. En lugar de declarar, diferentes variables por
separado, una estructura es una declaracin de variables o campos conjunta.
Ejemplo:
*******************************************************************
*****
*Estructuras
*******************************************************************
*****
DATA:
BEGIN OF e_aerolinea,
carrid LIKE scarr-carrid,
"Cdigo de aerolinea
carname TYPE s_carrname,
"Nombre de aerolnea
url(255) TYPE c,
END OF e_aerolinea.

Tablas internas
Sirven bsicamente para almacenar la informacin que extraemos de las tablas de la
base de datos. Una tabla interna es tambin una matriz de datos, pero bidimensional.
Al contrario que las estructuras que slo pueden contener un valor para cada campo,
las tablas internas contendrn muchos registros. Cada registro llevar un valor
diferente en el mismo campo a la manera que tiene una tabla transparente de
diccionario.
Podemos declarar tablas internas de diferentes maneras:
Ejemplo de declaracin de tablas internas:
*******************************************************************
*****
*Tablas internas
*******************************************************************
*****
* Tabla de vuelos: primera forma de declaracin de tablas internas
DATA:
BEGIN OF i_vuelos occurs 0,
carrid LIKE sflight-carrid,
connid LIKE sflight-connid,
fldate LIKE sflight-fldate,
planetype LIKE sflight-planetype,
END OF i_vuelos.
* Tabla de aviones: segunda forma de declaracin de tablas internas
TYPES:
BEGIN OF ty_aviones,
planetype LIKE saplane-planetype,
seatsmax LIKE saplane-seatsmax,
END OF ty_aviones.
DATA:
i_aviones TYPE STANDARD TABLE OF ty_aviones.
Notas: La primera forma de declarar una tabla interna es muy parecida a la
declaracin de estructuras, pero aadiendo la clusula occurs 0. Al declarar una
tabla interna de este modo tambin estamos diciendo a SAP que nuestra tabla
interna tendr una cabecera.

La segunda forma se realiza mediante sentencia types, que permite la declaracin de


tipos de datos. Esta segunda forma parece ms complicada y ms larga, pero es
preferible utilizarla ya que la primera no es til en ciertos entornos ABAP como en
programacin de queries, smartforms o ABAP orientado a objetos. Al declarar una
tabla interna de este modo tambin estamos diciendo a SAP que nuestra tabla
interna tendr una cabecera. n otro artculo veremos qu implicaciones tiene esto.
Work rea:
Viene siendo cmo la estructura de una tabla, pero que almacenar un slo registro
de la misma. Hay dos opciones o ms para declarar work rea. Las dos ms usadas
son:
DATA : it_mara TYPE STANDARD TABLE OF mara.
DATA : wa_mara LIKE LINE OF it_mara.
OR
DATA : wa_mara TYPE mara.

estructura

2. PANTALLAS DE SELECCIN

Este evento define la pantalla de seleccin propiamente dicha. Las sentencias ms


importantes de este evento son:
Parameters: recoge una variable nica en la pantalla de seleccin. Se declara como si
fuese una variable global. Al fin y al cabo, no es ms que una variable que va a contener un
valor nico, el valor que le d el usuario. La forma en que lo haramos podra ser, por
ejemplo, una de las tres siguientes.
PARAMETERS p_campo TYPE tipo.
PARAMETERS p_campo TYPE elemento_de_datos.
PARAMETERS p_campo LIKE tabla-campo.
NOTA: La tercera siempre es la mejor ya que lo hacemos en referencia a una tabla y
recoge el matchcode directamente del dato del diccionario.

Select-options: mediante esta sentencia podemos declarar un rango de valores. Es un


criterio de seleccin complejo que puede contener ms de un dato a la vez.

NOTA: Internamente, mediante esta sentencia ABAP lo que est creando es una tabla
interna con cuatro campos diferentes, cada uno de ellos contendr datos diferentes.
Sign: Define si lo que el usuario ha escrito en el criterio de seleccin es un dato que debe
estar en el rango de datos o se debe excluir del rango de datos a considerar.
Option: Los valores que se introducen en el rango de seleccin pueden ser un conjunto
individual de valores o un rango del tipo desdehasta.
Low: Este campo contiene el valor inicial del rango de valores.
High: Contiene el valor final del rango de valores.

SELECT-OPTIONS s_variable FOR tabla-campo.

Selection-screen begin of block nombre_bloque selection-screen end of block


nombre_bloque: Con estas dos sentencias estamos definiendo un bloque de la pantalla de
selecccin. Le decimos a SAP que todas las sentencias que se encierren (parameters y
select-options) entre estas dos sentencias forman parte de un mismo grupo.
Por ejemplo, declaremos una pantalla de seleccin para obtener un rango de compaas
areas y un parmetro con el nmero de vuelo.

************************************************************************
*SELECTION-SCREEN
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECT-OPTIONS s_carrid FOR sflight-carrid.
PARAMETERS

p_connid LIKE sflight-connid.

SELECTION-SCREEN END OF BLOCK b1.

El resultado de esta pantalla en SAP sera algo as:

At selection-screen:
El evento at selection-screen permite definir varias situaciones que sucedern durante
(antes o despus de) la ejecucin de la pantalla de seleccin. Se utiliza la sentencia atselection screen seguida de alguna de sus clusulas. En este ejemplo slo voy a mostrar la
setencia at selection-screen sin clusulas que nos permite validar los datos de la pantalla de
seleccin una vez el usuario ha entrado algn dato.

************************************************************************
*AT SELECTION SCREEN
************************************************************************
AT SELECTION-SCREEN.
IF p_connid = '0017'.
MESSAGE 'Vuelo no permitido' TYPE 'E'.
ENDIF.

En este caso, si el usuario introdujese el vuelo 0017 en el parmetro de vuelo p_connid al


intentar ejecutar el programa SAP enviara un mensaje de error y no dejara continuar.

Mensaje de error "Vuelo no permitido"

3. CONSULTAS
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.

Notas: Con la sentencia CLEAR limpiamos la cabecera y la dejamos lista para el siguiente
registro.
El inconveniente de 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.

Nota: 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.
Otra variaion de SELECT:
SELECT carrid connid fldate planetype FROM sflight
INTO TABLE i_vuelos
WHERE carrid IN s_carrid.
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.

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.