lunes, 18 de agosto de 2014

Query 2 Report. Construye Reports en solo 2 minutos

En este post os voy a hablar de un programa que he descrubierto para generar listados de forma rápida en SAP. Podeis consultarlo en el SCN de SAP si quereis.

Voy a comentarlo con un ejemplo y finalmente dejaré el código de la transacción. Esta herramienta permite crear informes en 2 minutos. La pantalla de selección, los textos de selección y el código se genera automáticamente.

Lo primero de todo es descargarse el código de la transacción ZQ2R.

Una vez lo hayamos descargado y creado ejecutaremos ZQ2R. Pulsamos el botón QuickViewer

 
Como ejemplo vamos a crear la típica query en la que consultaremos los vuelos desde uns ciudad.
 

Después de introducir el nombre de la consulta (FlightsFrom_NY) pulsamos el botón Crear.
En este ejemplo vamos a utilizar la fuente de datos "Table Join", con la que podremos enlazar varias tablas.


Pulse el botón insertar tabla para agregar las siguientes tablas: SPFLI (horarios de vuelos), SFLIGHT (Vuelos) y SCARR (aerolíneas).

 

Una vez seleccionadas las tabla volvemos hacia atrás (F3).


Seleccionamos los campos que se mostrarán en el listado, y los campos que formarán parte de la pantalla de selección.

 
Podemos seleccionar la forma de ordenación de las columnas.
 

Finalmente grabamos la query y damos un nombre al report.

 
 
 
Tras realizar estos pasos volvemos a la pantalla inicial de la transacción ZQ2R y copiamos el código que hemos asignado al report (AQ01SYSTQV000001FLIGHTSFROM_NY) y Ejecutamos.

 
 
 
Podemos definir diferentes características de los parámetros de selección.
 





Incluso marcar valores por defecto si es necesario


Podemos definir los Textos de selección para los diferentes campos.


Finalmente presionamos volver y ya tenemos generado el programa que ejecutará el report.

 
Si lo ejecutamos desde la transacción SE38 veremos que el programa se ha generado correctamente.
 
 
 
 
Y para mi lo mas interensate, el código del programa generado está muy bien estructurado. A partir de este código podemos meter al report mucha mas funcionalidad y nos habremos ahorrado un bien tiempo de programación. Os dejo el código de ejemplo.
 
*&-----------------------------------------------------------------*
*& Report ZQ2R_FLIGHTSFROM_NY
*&-----------------------------------------------------------------*
REPORT zq2r_flightsfrom_ny.
 
*&-----------------------------------------------------------------*
*&  Include ZQ2R_FLIGHTSFROM_NY_TOP
*&-----------------------------------------------------------------*
CONSTANTS:
  c_cityfr TYPE spfli-cityfrom VALUE 'NEW YORK'.
 
TABLES:
  spfli,
  sflight.
 
TYPES:
  tyr_carrid TYPE RANGE OF spfli-carrid,
  tyr_fldate TYPE RANGE OF sflight-fldate,
 
  BEGIN OF ty_data,
    cityfrom TYPE spfli-cityfrom,
    cityto   TYPE spfli-cityto,
    carrname TYPE scarr-carrname,
    fldate   TYPE sflight-fldate,
  END OF ty_data,
  tyt_data TYPE STANDARD TABLE OF ty_data.
 
DATA t_data TYPE STANDARD TABLE OF ty_data.
*&-----------------------------------------------------------------*
*&  Include ZQ2R_FLIGHTSFROM_NY_SEL
*&-----------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME.
 
PARAMETER p_cityfr TYPE spfli-cityfrom DEFAULT c_cityfr.
SELECT-OPTIONS s_carrid FOR spfli-carrid MEMORY ID car.
SELECT-OPTIONS s_fldate FOR sflight-fldate MEMORY ID day OBLIGATORY.
 
SELECTION-SCREEN END OF BLOCK a.
*&-----------------------------------------------------------------*
*&  Include ZQ2R_FLIGHTSFROM_NY_F01
*&-----------------------------------------------------------------*
*&-----------------------------------------------------------------*
*&      Form  SET_SELECTION_FIELD_DISABLED
*&-----------------------------------------------------------------*
FORM set_selection_field_disabled USING p_spname TYPE aqs_spname.
 
  DATA lv_spname_length TYPE i.
 
  lv_spname_length = strlen( p_spname ).
 
  LOOP AT SCREEN.
    IF screen-name(lv_spname_length) = p_spname.
      screen-input = 0.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
 
ENDFORM.                    " SET_SELECTION_FIELD_DISABLED
 
*&-----------------------------------------------------------------*
*&      Form  GET_DATA
*&-----------------------------------------------------------------*
FORM get_data USING p_cityfr TYPE spfli-cityfrom
                    s_carrid TYPE tyr_carrid
                    s_fldate TYPE tyr_fldate
           CHANGING t_data   TYPE tyt_data.
 
 
  SELECT spfli~cityfrom
         spfli~cityto
         scarr~carrname
         sflight~fldate
    FROM ( spfli
           INNER JOIN sflight
           ON  sflight~carrid = spfli~carrid
           AND sflight~connid = spfli~connid
           INNER JOIN scarr
           ON  scarr~carrid = sflight~carrid )
    INTO TABLE t_data
         WHERE spfli~cityfrom = p_cityfr
           AND spfli~carrid IN s_carrid
           AND sflight~fldate IN s_fldate .
 
ENDFORM.                    " GET_DATA
 
*&-----------------------------------------------------------------*
*&      Form  ALV
*&-----------------------------------------------------------------*
FORM alv USING t_data TYPE tyt_data.
 
  DATA:
    o_sorts     TYPE REF TO cl_salv_sorts,
    o_columns   TYPE REF TO cl_salv_columns,
    o_display   TYPE REF TO cl_salv_display_settings,
    o_functions TYPE REF TO cl_salv_functions_list,
    o_layout    TYPE REF TO cl_salv_layout,
    ls_key      TYPE        salv_s_layout_key,
    o_alv       TYPE REF TO cl_salv_table.
 
* Gel ALV object
  TRY.
      cl_salv_table=>factory(
        IMPORTING
          r_salv_table = o_alv
        CHANGING
          t_table      = t_data ).
    CATCH cx_salv_msg.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDTRY.
 
* ALV Sort
  o_sorts = o_alv->get_sorts( ).
  TRY.
      o_sorts->add_sort( 'CITYFROM' ).
      o_sorts->add_sort( 'CITYTO' ).
      o_sorts->add_sort( 'CARRNAME' ).
      CALL METHOD o_sorts->add_sort
        EXPORTING
          columnname = 'FLDATE'
          sequence   = if_salv_c_sort=>sort_down.
    CATCH cx_salv_not_found
          cx_salv_existing
          cx_salv_data_error.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
         WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDTRY.
 
* Get columns
  o_columns = o_alv->get_columns( ).
* Set the column optimization
  o_columns->set_optimize( ).
 
  o_display = o_alv->get_display_settings( ).
  o_display->set_striped_pattern( abap_true ).
 
* Generic ALV functions
  o_functions = o_alv->get_functions( ).
  o_functions->set_all( ).
 
* Layout
  o_layout = o_alv->get_layout( ).
  ls_key-report = sy-repid.
  o_layout->set_key( ls_key ).
  o_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).
 
  o_alv->display( ).
 
ENDFORM.                    " ALV
 
AT SELECTION-SCREEN OUTPUT.
  PERFORM set_selection_field_disabled: USING 'P_CITYFR'.
 
START-OF-SELECTION.
  PERFORM get_data USING p_cityfr
                         s_carrid[]
                         s_fldate[]
                CHANGING t_data.
 
END-OF-SELECTION.
  PERFORM alv USING t_data.

 


No hay comentarios:

Publicar un comentario