*&---------------------------------------------------------------------*
*& Generates the ALV on the Selection Screen itself
*&
*&---------------------------------------------------------------------*
REPORT  zalv_on_sel_screen.
*
*----------------------------------------------------------------------*
*  Local class for report
*----------------------------------------------------------------------*
CLASS lcl_report DEFINITION.
  PUBLIC SECTION.
    DATA: t_data   TYPE STANDARD TABLE OF sflight,  " Output dat
          r_carrid TYPE RANGE OF sflight-carrid.    " Select Option
    METHODS:
      get_data,
      generate_output.
ENDCLASS.                    "lcl_report DEFINITION

DATA: lo_report TYPE REF TO lcl_report.
DATA: w_carrid TYPE sflight-carrid.

** Selection Screen
SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE aaa.
SELECT-OPTIONS: s_carrid FOR w_carrid.
SELECTION-SCREEN: END   OF BLOCK blk1.

** Initialization
INITIALIZATION.
  aaa = 'Selection Criteria'.
* object for the report
  CREATE OBJECT lo_report.
* generate output
  lo_report->generate_output( ).
** Start of Selection
START-OF-SELECTION.
* Get data
  lo_report->r_carrid = s_carrid[].
  lo_report->get_data( ).
*----------------------------------------------------------------------*
* Local Class Implementation
*----------------------------------------------------------------------*
CLASS lcl_report IMPLEMENTATION.
  METHOD get_data.
    SELECT * FROM sflight
           INTO  TABLE me->t_data
           WHERE carrid IN s_carrid.
    IF sy-dbcnt IS INITIAL.
      MESSAGE s398(00) WITH 'No data selected'.
    ENDIF.
    EXPORT data = me->t_data TO MEMORY ID sy-cprog.
  ENDMETHOD.                    "get_data

  METHOD generate_output.
    DATA: lo_dock TYPE REF TO cl_gui_docking_container,
          lo_cont TYPE REF TO cl_gui_container,
          lt_fcat             type lvc_t_fcat,
          gr_grid_d1001        type ref to cl_gui_alv_grid.
    IMPORT data = me->t_data FROM MEMORY ID sy-cprog.
    FREE MEMORY ID sy-cprog.
    CHECK me->t_data IS NOT INITIAL.
    CHECK lo_dock IS INITIAL.
    CREATE OBJECT lo_dock
      EXPORTING
        repid     = sy-cprog
        dynnr     = sy-dynnr
        ratio     = 80
        side      = cl_gui_docking_container=>dock_at_bottom
        name      = 'DOCK_CONT'.
    IF sy-subrc <> 0.
      MESSAGE 'Error in the Docking control' TYPE 'S'.
    ENDIF.
    CHECK gr_grid_d1001 IS INITIAL.
    lo_cont ?= lo_dock.
    create object gr_grid_d1001
                  exporting i_parent = lo_cont.

  call function 'LVC_FIELDCATALOG_MERGE'
    exporting
      i_buffer_active              = space
      i_structure_name             = 'SFLIGHT'
      i_client_never_display       = 'X'
      i_bypassing_buffer           = space
    changing
      ct_fieldcat                  = lt_fcat
    exceptions
      inconsistent_interface       = 1
      program_error                = 2
      others                       = 3.

    call method gr_grid_d1001->set_table_for_first_display
      exporting
        i_buffer_active     = space
        i_bypassing_buffer  = space
      changing
        it_outtab           = me->t_data
        it_fieldcatalog     = lt_fcat.
  ENDMETHOD.                    "generate_output
  ENDCLASS.                    "lcl_report IMPLEMENTATION