Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Interactive reports

Former Member
0 Kudos

How to develop an interactive report to display the list of Sales Orders with their items and all other sales related information with a check box for each SO. There is a facility on the application toolbar which provides the option for displaying or changing the selected sales order by navigating to the respective transactions.

1 REPLY 1

uwe_schieferstein
Active Contributor
0 Kudos

Hello

Here is a possible solution for your problem.

*&---------------------------------------------------------------------*
*& Report  ZUS_SDN_TWO_ALV_GRIDS_4
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zus_sdn_two_alv_grids_4.




DATA:
  gd_okcode        TYPE ui_func,
*
  go_docking       TYPE REF TO cl_gui_docking_container,
  go_splitter      TYPE REF TO cl_gui_splitter_container,
  go_cell_top      TYPE REF TO cl_gui_container,
  go_cell_bottom   TYPE REF TO cl_gui_container,
  go_grid1         TYPE REF TO cl_gui_alv_grid,
  go_grid2         TYPE REF TO cl_gui_alv_grid,
  gs_layout        TYPE lvc_s_layo.


DATA:
  gt_vbak          TYPE STANDARD TABLE OF vbak,
  gt_vbap          TYPE STANDARD TABLE OF vbap.





*---------------------------------------------------------------------*
*       CLASS lcl_eventhandler DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_eventhandler DEFINITION.

  PUBLIC SECTION.
    CLASS-METHODS:
      handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING
          e_row
          e_column
          es_row_no
          sender,

      handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid
        IMPORTING
          e_row_id
          e_column_id
          es_row_no
          sender.

ENDCLASS.                    "lcl_eventhandler DEFINITION



*---------------------------------------------------------------------*
*       CLASS lcl_eventhandler IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_eventhandler IMPLEMENTATION.

  METHOD handle_double_click.
*   define local data
    DATA:
      ls_vbak      TYPE vbak.

    CHECK ( sender = go_grid1 ).

    READ TABLE gt_vbak INTO ls_vbak INDEX e_row-index.
    CHECK ( ls_vbak-vbeln IS NOT INITIAL ).

    CALL METHOD go_grid1->set_current_cell_via_id
      EXPORTING
*        IS_ROW_ID    =
*        IS_COLUMN_ID =
        is_row_no    = es_row_no.


*   Triggers PAI of the dynpro with the specified ok-code
    CALL METHOD cl_gui_cfw=>set_new_ok_code( 'DETAIL' ).



  ENDMETHOD.                    "handle_double_click



  METHOD handle_hotspot_click.
*   define local data
    DATA:
      ls_bdcdata  TYPE bdcdata,
      lt_bdcdata  TYPE bdcdata_tab,
      ls_vbak     TYPE vbak,
      ls_col_id   TYPE lvc_s_col.

    READ TABLE gt_vbak INTO ls_vbak INDEX e_row_id-index.
    CHECK ( ls_vbak-vbeln IS NOT INITIAL ).

    CASE e_column_id-fieldname.
      WHEN 'VBELN'.
        CLEAR: ls_bdcdata.
        ls_bdcdata-dynbegin = 'T'.
        ls_bdcdata-fnam     = 'VA02'.
        APPEND ls_bdcdata TO lt_bdcdata.
*
        CLEAR: ls_bdcdata.
        ls_bdcdata-program  = 'SAPMV45A'.
        ls_bdcdata-fnam     = '0102'.
        ls_bdcdata-dynbegin = 'X'.
        ls_bdcdata-fnam     = 'VBAK-VBELN'.
        ls_bdcdata-fval     = ls_vbak-vbeln.
        APPEND ls_bdcdata TO lt_bdcdata.
*
        CLEAR: ls_bdcdata.
        ls_bdcdata-fnam     = 'BDC_CURSOR'.
        ls_bdcdata-fval     = '/00'.  " ENTER
        APPEND ls_bdcdata TO lt_bdcdata.

        CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
          EXPORTING
            tcode                         = 'VA02'
*            SKIP_SCREEN                   = ' '
             MODE_VAL                      = 'A'
             UPDATE_VAL                    = 'S'
*          IMPORTING
*            SUBRC                         =
          TABLES
            using_tab                     = lt_bdcdata
*            SPAGPA_TAB                    =
*            MESS_TAB                      =
          EXCEPTIONS
            call_transaction_denied       = 1
            tcode_invalid                 = 2
            OTHERS                        = 3.
        IF sy-subrc <> 0.
*          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*                  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.


      WHEN 'ERNAM'.
*        SET PARAMETER ID 'USR' FIELD ls_knb1-ernam.
*        NOTE: no parameter id available, yet simply show the priciple

        CALL TRANSACTION 'SU01' AND SKIP FIRST SCREEN.

      WHEN OTHERS.
*       do nothing
    ENDCASE.




***   Set active cell to field BUKRS otherwise the focus is still on
***   field KUNNR which will always raise event HOTSPOT_CLICK
**    ls_col_id-fieldname = 'BUKRS'.
**    CALL METHOD go_grid1->set_current_cell_via_id
**      EXPORTING
**        is_row_id    = e_row_id
**        is_column_id = ls_col_id.



  ENDMETHOD.                    "handle_hotspot_click


ENDCLASS.                    "lcl_eventhandler IMPLEMENTATION






START-OF-SELECTION.

  SELECT        * FROM  vbak INTO TABLE gt_vbak UP TO 100 ROWS.


* Create docking container
  CREATE OBJECT go_docking
    EXPORTING
      parent                      = cl_gui_container=>screen0
      ratio                       = 90
    EXCEPTIONS
      OTHERS                      = 6.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


* Create splitter container
  CREATE OBJECT go_splitter
    EXPORTING
      parent            = go_docking
      rows              = 2
      columns           = 1
*      NO_AUTODEF_PROGID_DYNNR =
*      NAME              =
    EXCEPTIONS
      cntl_error        = 1
      cntl_system_error = 2
      OTHERS            = 3.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

* Get cell container
  CALL METHOD go_splitter->get_container
    EXPORTING
      row       = 1
      column    = 1
    RECEIVING
      container = go_cell_top.
  CALL METHOD go_splitter->get_container
    EXPORTING
      row       = 2
      column    = 1
    RECEIVING
      container = go_cell_bottom.

* Create ALV grids
  CREATE OBJECT go_grid1
    EXPORTING
      i_parent          = go_cell_top
    EXCEPTIONS
      OTHERS            = 5.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


* Set event handler
  SET HANDLER:
    lcl_eventhandler=>handle_double_click  FOR go_grid1,
    lcl_eventhandler=>handle_hotspot_click FOR go_grid1.


  CREATE OBJECT go_grid2
    EXPORTING
      i_parent          = go_cell_bottom
    EXCEPTIONS
      OTHERS            = 5.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


* Display data
  gs_layout-grid_title = 'Sales Orders'.
  CALL METHOD go_grid1->set_table_for_first_display
    EXPORTING
      i_structure_name = 'VBAK'
      is_layout        = gs_layout
    CHANGING
      it_outtab        = gt_vbak
    EXCEPTIONS
      OTHERS           = 4.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  PERFORM modify_fieldcatalog.


  gs_layout-grid_title = 'Sales Order Items'.
  CALL METHOD go_grid2->set_table_for_first_display
    EXPORTING
      i_structure_name = 'VBAP'
      is_layout        = gs_layout
    CHANGING
      it_outtab        = gt_vbap  " empty !!!
    EXCEPTIONS
      OTHERS           = 4.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


* Link the docking container to the target dynpro
  CALL METHOD go_docking->link
    EXPORTING
      repid                       = syst-repid
      dynnr                       = '0100'
*      CONTAINER                   =
    EXCEPTIONS
      OTHERS                      = 4.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


* NOTE: dynpro does not contain any elements
  CALL SCREEN '0100'.
* Flow logic of dynpro (does not contain any dynpro elements):
*
*PROCESS BEFORE OUTPUT.
*  MODULE STATUS_0100.
**
*PROCESS AFTER INPUT.
*  MODULE USER_COMMAND_0100.



END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS_0100'.  " contains push button "DETAIL"
*  SET TITLEBAR 'xxx'.


* Refresh display of detail ALV list
  CALL METHOD go_grid2->refresh_table_display
*    EXPORTING
*      IS_STABLE      =
*      I_SOFT_REFRESH =
    EXCEPTIONS
      OTHERS         = 2.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  CASE gd_okcode.
    WHEN 'BACK' OR
         'END'  OR
         'CANC'.
      SET SCREEN 0. LEAVE SCREEN.

*   User has pushed button "Display Details"
    WHEN 'DETAIL'.
      PERFORM entry_show_details.

    WHEN OTHERS.
  ENDCASE.

  CLEAR: gd_okcode.

ENDMODULE.                 " USER_COMMAND_0100  INPUT

*&---------------------------------------------------------------------*
*&      Form  ENTRY_SHOW_DETAILS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM entry_show_details .
* define local data
  DATA:
    ld_row      TYPE i,
    ls_vbak     TYPE vbak.

  CALL METHOD go_grid1->get_current_cell
    IMPORTING
      e_row = ld_row.

  READ TABLE gt_vbak INTO ls_vbak INDEX ld_row.
  CHECK ( syst-subrc = 0 ).

  SELECT        * FROM  vbap INTO TABLE gt_vbap
         WHERE  vbeln = ls_vbak-vbeln.



ENDFORM.                    " ENTRY_SHOW_DETAILS
*&---------------------------------------------------------------------*
*&      Form  MODIFY_FIELDCATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM modify_fieldcatalog .
* define local data
  DATA:
    ls_fcat    TYPE lvc_s_fcat,
    lt_fcat    TYPE lvc_t_fcat.

  CALL METHOD go_grid1->get_frontend_fieldcatalog
    IMPORTING
      et_fieldcatalog = lt_fcat.

  ls_fcat-hotspot = 'X'.
  MODIFY lt_fcat FROM ls_fcat
      TRANSPORTING hotspot
    WHERE ( fieldname = 'VBELN' ).

  go_grid1->set_frontend_fieldcatalog( lt_fcat ).
  go_grid1->refresh_table_display( ).



ENDFORM.                    " MODIFY_FIELDCATALOG

Regards

Uwe