cancel
Showing results for 
Search instead for 
Did you mean: 

Event handler erorr

Shivam6
Newcomer
0 Kudos

I want to create a report that will print the data of vbak table with the hyperlink on vbeln.

when double click on vbeln it will show new table of vbap for the same value of vbeln and it should be done with docking by splliting the screen in 50% ration once someone double click on vbeln of vbak by showing vbak table on 50% and vbap table on other 50%.

this is the code i have written.

DATAlt_vbak TYPE TABLE OF vbak.

CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODSon_double_click FOR EVENT double_click OF cl_gui_alv_grid
      IMPORTING e_row e_column.
ENDCLASS.

CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD on_double_click.
    DATAlv_vbeln   TYPE vbak-vbeln,
          lt_vbap    TYPE TABLE OF vbap,
          lv_row     TYPE i,
          lv_vbeln_c TYPE abap_bool.
*          lo_alv   TYPE REF TO cl_gui_alv_grid.

    lv_row e_row + sy-tabix 2.
    FIELD-SYMBOLS<fs_data> TYPE LINE OF zzz_vbak.
    READ TABLE lt_vbak INDEX lv_row ASSIGNING <fs_data>.
    IF sy-subrc 0.
*    ASSIGN er_data->* TO <fs_data>.
      lv_vbeln <fs_data>-vbeln.

      SELECT FROM vbap INTO TABLE lt_vbap WHERE vbeln lv_vbeln.

        CALL SCREEN 200.
        DATA:lo_alv      TYPE REF TO cl_gui_docking_container,
             go_splitter TYPE REF TO cl_gui_splitter_container.
        CREATE OBJECT lo_alv
          EXPORTING
            parent         cl_gui_container=>screen0
            ratio          90.

         CREATE OBJECT go_splitter
    EXPORTING
      parent            lo_alv.
     endif.
      ENDMETHOD.
ENDCLASS.

DATAlo_event_receiver TYPE REF TO lcl_event_receiver.

START-OF-SELECTION.
  SELECT FROM vbak INTO TABLE lt_vbak.

    PERFORM display_alv USING lt_vbak.

*&---------------------------------------------------------------------*
*&      Form  display_alv
*&---------------------------------------------------------------------*
FORM display_alv USING it_data TYPE table.
  DATAlo_alv_grid TYPE REF TO cl_gui_alv_grid,
        lo_events   TYPE REF TO cl_gui_custom_container.

  CREATE OBJECT lo_events
    EXPORTING
      container_name 'ALV_CONTAINER'.

  CREATE OBJECT lo_alv_grid
    EXPORTING
      i_parent lo_events.

  SET HANDLER lo_event_receiver->on_double_click FOR lo_alv_grid.

  lo_alv_grid->set_table_for_first_display(
    EXPORTING
      i_structure_name  'VBAK'
    CHANGING
      it_outtab         it_data ).
ENDFORM.

Accepted Solutions (0)

Answers (1)

Answers (1)

javier_alonso
Participant
0 Kudos

I have made a quick sample code.

CLASS split_alv DEFINITION FINAL.
  PUBLIC SECTION.
    METHODS constructor.

  PRIVATE SECTION.
    DATA: purchase_orders TYPE STANDARD TABLE OF vbak WITH KEY vbeln,
          purchase_items  TYPE STANDARD TABLE OF vbap WITH KEY vbeln posnr.

    DATA: salv_vbak TYPE REF TO cl_salv_table,
          salv_vbap TYPE REF TO cl_salv_table.

    METHODS on_link_click FOR EVENT link_click OF cl_salv_events_table IMPORTING row column.
ENDCLASS.

CLASS split_alv IMPLEMENTATION.
  METHOD constructor.
    SELECT * FROM vbak UP TO 10 ROWS INTO TABLE @purchase_orders.

    DATA(split) = NEW cl_gui_splitter_container( parent = cl_gui_custom_container=>default_screen
                                                 no_autodef_progid_dynnr = abap_true
                                                 rows = 2
                                                 columns = 1 ).

    DATA(spl_1) = split->get_container( row = 1 column = 1 ).
    DATA(spl_2) = split->get_container( row = 2 column = 1 ).

    cl_salv_table=>factory( EXPORTING r_container  = spl_1
                            IMPORTING r_salv_table = salv_vbak
                            CHANGING  t_table      = purchase_orders ).

    cl_salv_table=>factory( EXPORTING r_container  = spl_2
                            IMPORTING r_salv_table = salv_vbap
                            CHANGING  t_table      = purchase_items ).

    CAST cl_salv_column_table( salv_vbak->get_columns( )->get_column( 'VBELN' ) )->set_cell_type( if_salv_c_cell_type=>hotspot ).
    SET HANDLER on_link_click FOR salv_vbak->get_event( ).

    salv_vbak->display( ).
    salv_vbap->display( ).

    WRITE space.
  ENDMETHOD.

  METHOD on_link_click.
    CASE column.
      WHEN 'VBELN'.
        TRY.
            DATA(document_number) = purchase_orders[ row ]-vbeln.

            CLEAR purchase_items.
            SELECT * FROM vbap INTO TABLE @purchase_items WHERE vbeln EQ @document_number.

            salv_vbak->refresh( ).
            salv_vbap->refresh( ).
          CATCH cx_sy_itab_line_not_found.
            RETURN.
        ENDTRY.
    ENDCASE.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  NEW split_alv( ).

This will create an ALV with the header documents. When you click on the document ID, it will display the document items in another ALV.

javier_alonso_0-1714048138949.png

I have used hotspot link event, although double click could be an option as well. Hope this helps you as a reference.