Thursday, March 08, 2012

Alv events for real time scenario

It has been so long that I have not been able to update my blog. I was quite busy with left to right projects to one of our clients.

Today, I want to share with you on how to handle oop alv using events specifically if front-end data has been changed. I.e sorted, deleted or filtered. On the following scenario below, I am going to present to you my own approach on how to deal with issues regarding alv front-end changes.

Steps:

1. Create a wrapper class for " set_table_for_first_display " method of cl_gui_alv_grid to handle "changing" internal table - meaning every time there are changes on the alv front-end, we will be able to capture and to read the appropriate record or data being clicked (hotpost_click event), changed (user_command event), etc.

2. Create a constructor (class' method called during creation of an object - typically for initialization of attributes) for your wrapper class for us to be able to send the cl_gui_alv_grid object coming from our main program. Our main program should act as a caller for the wrapper class by passing the appropriate parameters for "set_table_for_first_display_ method as shown below:

  variant-report = sy-repid. "to save the alv layout
  variant-username = sy-uname. "to save the alv layout
  variant-variant = alv_var. "layout name

  CREATE OBJECT obj_alv_pir01
    EXPORTING
      i_object = grid1
      .

  CALL METHOD obj_alv_pir01->set_table_for_first_display
    EXPORTING
      is_layout       = wa_alv_layout
      is_variant      = variant "to show the alv layout button
      i_save          = 'A' "to show the alv layout button
    CHANGING
      it_outtab       =   tb_final
      it_fieldcatalog = tb_fieldcat


 3. In our wrapper class, declare a static attribute for our internal table that will handle the it_outtab of "set_table_for_first_display" method. Note: parameter "changing" means that changes of an it_table inside the called method will reflect also to the it_table of the calling program.

4. Inside our event, let us take event USER_COMMAND, we should do the below code in ordfer for us to capture the appropriate line of records being selected from the ALV front-end. "NO matter what happens to the front-end data will also reflect to our static table as shown below":

  DATA lt_selected_rows TYPE lvc_t_roid .
  DATA ls_selected_row TYPE lvc_s_roid .

  CALL METHOD grid_object->get_selected_rows
  IMPORTING
  et_row_no = lt_selected_rows .
  READ TABLE lt_selected_rows INTO ls_selected_row INDEX 1 .

  IF sy-subrc ne 0 .
    MESSAGE s000(su) WITH 'Select a row!'(203) .
    EXIT.
  ENDIF .

  READ TABLE ZCL_ALV_PIR01=>tb_final INDEX ls_selected_row-row_id INTO l_wa_final.

That's it! If you have any clarification, please don't hesitate to post a comment.

Have a nice day!