Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
estructura
2. PANTALLAS DE SELECCIN
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.
************************************************************************
*SELECTION-SCREEN
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECT-OPTIONS s_carrid FOR sflight-carrid.
PARAMETERS
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.
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.
Al no usar todos los campos mejoramos el rendimiento y con la clusulo INTO asignamos
directamente el valor al campo de la tabla interna.
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: