Tutorial ABAP básico (y V): hola mundo

martes, 22 de enero de 2013

Y llegamos al último artículo de la serie sobre ABAP básico, a nuestro programa "hola mundo". Hemos llegado hasta aquí después de crear nuestro report, declarar las variables, crear la pantalla de selección y hacer la búsqueda de datos en las tablas de diccionario. Ahora ya estamos preparados para mostrar la información en la pantalla de nuestro ordenador.

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 hola mundo
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í:

Pantalla de seleccion


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:

Listado del programa de vuelos



4 comentarios:

  1. 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.

    ¿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

    ResponderEliminar
    Respuestas
    1. Gracias por el comentario Jesús. Te respondo a través de Todo Blogger.

      Eliminar
  2. Soy 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.
    Sos un Dios.

    ResponderEliminar