De la multitud de sentencias que se pueden utilizar en ABAP
para controlar la salida por pantalla de nuestros datos yo me voy a limitar a
únicamente dos, la sentencia loop...endloop y la sentencia write. Sólo con estas
dos sentencias ya podemos crear reports sencillos. Y todo lo haremos en el evento
end-of-selection.
Imagen propiedad de PublicDomainPictures en Pixabay |
La sentencia loop...endloop.
Esta sentencia nos permite recorrer uno a uno todos los
registros que hemos guardado previamente en nuestra tabla interna. La forma en
que la tratamos varía dependiendo de si hemos declarado nuestra tabla interna
con cabecera o sin cabecera.
La sentencia loop...endloop en tablas internas con cabecera
No necesitan de ninguna variable adicional. Simplemente
llamamos a nuestra interna mediante la sentencia loop...endloop. En ese mismo
momento, todos los registros de cada línea se cargan sobre la cabecera de la
propia tabla interna.
LOOP AT <tabla_interna>.
* Acción sobre <tabla_interna>
ENDLOOP.
La sentencia loop...endloop en tablas internas sin cabecera
Necesitan de una variable estructructura adicional donde se
contenga el valor de cada registro de la tabla interna. Al hacer una llamada
loop...endloop, el valor del registro por el que pasa se ha de traspasar a esta
variable adicional.
LOOP AT <tabla_interna> into <estructura>.
* Acción sobre <estructura>
ENDLOOP.
La sentencia write
Sirve para "escribir" los datos de cada uno de los registros de
nuestra tabla interna en la pantalla del ordenador y que sean visibles por el
usuario. Por ejemplo, dentro de nuestra sentencia loop...enloop, cada uno de los
registros se irían escribiendo uno a uno en pantalla gracias a la sentencia
write.
LOOP AT <tabla_interna>.
write: <tabla_interna>
ENDLOOP.
Sin embargo, si lo que queremos no es escribir todos los campos de cada
registro, sino sólo algunos campos de cada registro entonces lo haríamos del
siguiente modo: LOOP AT <tabla_interna>.
write: / <tabla_interna>-campo1,
<tabla_interna>-campo2.
<tabla_interna>-campo3.
...
ENDLOOP.
La clásula "/" indica a SAP que todos los registros que siguen a continuación
se han de escribir en una línea diferente. De otro modo, cada registro se
montaría uno encima de otro y sólo se vería impreso en pantalla el último
registro.
Por supuesto, la sentencia write tiene muchas y variadas cláusulas. Algunas de ellas son:
- write <variable> DD/MM/YYYY: formatea las variables de tipo fecha para que el campo de salida se vea en la forma día/mes/año.
- write <variable> unit <unidad>: si el campo <variable> es una cantidad se imprimirá en pantalla según la unidad definida.
- write <variable> left-justified | centered | right-justified: escribe el campo a la izquierda, derecha o centro.
- write <variable> no-zero: elimina los ceros a la izquierda del campo.
El report clásico
Al final, nuestro report quedaría del siguiente modo:
*&---------------------------------------------------------------------*
*& Report ZBCFLIGHTS
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zbcflights.
************************************************************************
* Tablas SAP
************************************************************************
TABLES:
sflight,
saplane,
scarr.
************************************************************************
*Type pools
************************************************************************
*type-pools:
************************************************************************
*Constantes
************************************************************************
CONSTANTS:
c_vuelo(5) TYPE c VALUE 'Vuelo',
c_fecha TYPE d VALUE '20121231'.
************************************************************************
*Variables globales
************************************************************************
DATA:
g_vuelo(4) TYPE n, "Número de vuelo
g_fecha TYPE s_date, "Fecha del vuelo
g_precio LIKE sflight-price. "Precio del vuelo
************************************************************************
*Estructuras
************************************************************************
DATA:
BEGIN OF e_aviones,
planetype LIKE saplane-planetype, "Tipo de avión
seatsmax LIKE saplane-seatsmax, "Capacidad máxima del avión
END OF e_aviones.
************************************************************************
*Tablas internas
************************************************************************
* Tabla de vuelos: primera forma de declaración de tablas internas
DATA:
BEGIN OF i_vuelos OCCURS 0,
carrid LIKE sflight-carrid, "Código de aerolínea
connid LIKE sflight-connid, "Número de vuelo
fldate LIKE sflight-fldate, "Fecha de vuelo
planetype LIKE sflight-planetype, "Tipo de avión
END OF i_vuelos.
* Tabla de aviones: segunda forma de declaración de tablas internas
TYPES:
BEGIN OF ty_aviones,
planetype LIKE saplane-planetype, "Tipo de avión
seatsmax LIKE saplane-seatsmax, "Capacidad máxima del avión
END OF ty_aviones.
DATA:
i_aviones TYPE STANDARD TABLE OF ty_aviones.
************************************************************************
*SELECTION-SCREEN
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECT-OPTIONS s_carrid FOR sflight-carrid.
PARAMETERS p_planet LIKE saplane-planetype.
SELECTION-SCREEN END OF BLOCK b1.
************************************************************************
*AT SELECTION SCREEN
************************************************************************
AT SELECTION-SCREEN.
************************************************************************
*** START-OF-SELECTION
************************************************************************
START-OF-SELECTION.
SELECT * FROM sflight
INTO CORRESPONDING FIELDS OF TABLE i_vuelos
WHERE carrid IN s_carrid.
SELECT planetype seatsmax FROM saplane
INTO table i_aviones
WHERE planetype = p_planet.
************************************************************************
*** END-OF-SELECTION
************************************************************************
END-OF-SELECTION.
LOOP AT i_vuelos.
WRITE: / i_vuelos-carrid,
i_vuelos-connid,
i_vuelos-fldate,
i_vuelos-planetype.
ENDLOOP.
SKIP 1.
LOOP AT i_aviones INTO e_aviones.
WRITE: / e_aviones-planetype,
e_aviones-seatsmax.
ENDLOOP.
Y al ejecutar el programa la pantalla de selección quedaría así:Y el resultado serían dos listados, uno después del otro, cada uno corresponde a cada uno de los loops lanzados en el programa:
Tremendo, el material que tienes aquí. Además con un gusto exquisito. Mi más sinceras felicitaciones por este blog y por el otro de viaje.
ResponderEliminar¿A qué nivel está Sap en estos momentos? ¿conocen ellos este blog?
Coméntame un poco,
Gracias por unirte a Todo Blogger en Español
Jesús González
Gracias por el comentario Jesús. Te respondo a través de Todo Blogger.
EliminarSoy funcional y estoy teniendo una capacitación ABAP en el trabajo para tener una visión más amplia de los desarrollos y este material me ha servido de sobremanera.
ResponderEliminarSos un Dios.
Tanks for this :3
ResponderEliminarMe estoy iniciando en sap como abap y este material me ha caído como anillo al dedo. Muy agradecida de que lo publicaras.
ResponderEliminarmaravilloso todos tus acotaciones gracias
ResponderEliminar