Hi!
I've three containers with three alv grids on my screen.
I've a self made save-button on the toolbar of the first grid.
Now i insert data in grid2 and grid3 ...
When i press now the save-button from grid1 there's no data in the internal tables from grid2 and grid3.
When i first press the refresh-buttons on the toolbars from grid2 and grid3 and then the save-button from grid1 the internal tables from grid2 and grid3 are filled.
Is it possible to simulate first the pressed refresh-buttons from grid2/grid3 when pressing the save-button from grid1?
I've tried to set a "call method grid2->refresh_table_display" and "call method grid2->refresh_table_display" before the code for the save-button but this doesn't work.
Is there any help for me?
Thanks a lot in advance!
Ingo
Hello Ingo
Apparently my previous solution did not convince you. I have adjusted my sample report to come closer to your scenario. However, technically there is no difference between the solutions.
*&---------------------------------------------------------------------* *& Report ZUS_SDN_TWO_ALV_GRIDS_3 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zus_sdn_two_alv_grids_3. type-pools: icon. 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_knb1 TYPE STANDARD TABLE OF knb1, gt_knvv TYPE STANDARD TABLE OF knvv. *---------------------------------------------------------------------* * 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_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm sender, handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object e_interactive sender. ENDCLASS. "lcl_eventhandler DEFINITION *---------------------------------------------------------------------* * CLASS lcl_eventhandler IMPLEMENTATION *---------------------------------------------------------------------* * *---------------------------------------------------------------------* CLASS lcl_eventhandler IMPLEMENTATION. METHOD handle_user_command. * define local data DATA: ls_row TYPE lvc_s_row, ls_knb1 TYPE knb1. CHECK ( sender = go_grid1 ). CHECK ( e_ucomm = 'SAVE' ). CALL METHOD go_grid1->get_current_cell IMPORTING es_row_id = ls_row. READ TABLE gt_knb1 INTO ls_knb1 INDEX ls_row-index. CHECK ( ls_knb1-kunnr IS NOT INITIAL ). PERFORM entry_show_details. * Triggers PAI of the dynpro with the specified ok-code CALL METHOD cl_gui_cfw=>set_new_ok_code( 'DETAIL' ). ENDMETHOD. "handle_user_command METHOD handle_toolbar. * define local data DATA: ls_button TYPE stb_button. ls_button-function = 'SAVE'. ls_button-icon = icon_system_save. INSERT ls_button INTO e_object->mt_toolbar index 1. ENDMETHOD. "handle_toolbar ENDCLASS. "lcl_eventhandler IMPLEMENTATION START-OF-SELECTION. SELECT * FROM knb1 INTO TABLE gt_knb1 WHERE bukrs = '1000'. * 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_user_command FOR go_grid1, lcl_eventhandler=>handle_toolbar 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 = 'Customers'. CALL METHOD go_grid1->set_table_for_first_display EXPORTING i_structure_name = 'KNB1' is_layout = gs_layout CHANGING it_outtab = gt_knb1 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. go_grid1->set_toolbar_interactive( ). gs_layout-grid_title = 'Customers Details (Sales Areas)'. CALL METHOD go_grid2->set_table_for_first_display EXPORTING i_structure_name = 'KNVV' is_layout = gs_layout CHANGING it_outtab = gt_knvv " 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. * Simply pass PAI followed by PBO 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_knb1 TYPE knb1. CALL METHOD go_grid1->get_current_cell IMPORTING e_row = ld_row. READ TABLE gt_knb1 INTO ls_knb1 INDEX ld_row. CHECK ( syst-subrc = 0 ). SELECT * FROM knvv INTO TABLE gt_knvv WHERE kunnr = ls_knb1-kunnr. ENDFORM. " ENTRY_SHOW_DETAILS
Regards
Uwe
Hi,
In ALV, to refresh the table you have to call the method "refresh_table_display".
It has the syntax very similar to creating the table.
It has two parameters. In the first one, you can mention if you want to refresh only the data (the icons are not refreshed)
or
if you want to refresh only the icons around the grid (the data is not refreshed - this option is mostly not used in day to day applications).
the synatx is :-
call method grid (name of grid )->refresh_table_display
exporting
IS_STABLE = <STRUCT OF TYPE LVC_S_STBL> (THIS IS FOR DATA REFRESHING)
I_SOFT_REFRESH = <VARIABLE OF CHAR 01> (THIS IS FOR ICON REFRESHING).
Regards
Sudheer
Is the data ready in the internal table for grid2, by the time you have called
call method grid2->refresh_table_display?
Regards,
Ravi
Hello Ingo
It is important to realise that pushing a toolbar button does <b>NOT </b>trigger PAI of the dynpro where the ALV list is displayed.
In order to refresh the display of the other two ALV grids you need to pass PAI (followed by PBO). How to do that? There are at least two possible ways:
(1) You handle the SAVE command in your method HANDLE_USER_COMMAND. Within this method you update the internal tables for grid2 and grid3 depending on the contents of grid1. At the end of this method you call method CL_GUI_CFW=>set_new_ok_code( 'REFRESH' ). This will trigger PAI of the dynpro. In the PAI module (e.g. USER_COMMAND_0100) you could write the following coding:
CASE gd_okcode. WHEN 'REFRESH'. go_grid2->refresh_table_display( ). go_grid3->refresh_table_display( ). ... ENDCASE.
(2) You handle the SAVE command in your method HANDLE_USER_COMMAND and call method CL_GUI_CFW=>set_new_ok_code( 'REFRESH' ) without updating the itab2 and itab3 here. The updating of these itabs occurs in the PAI module.
The following sample report shows you the second approach. On the first ALV grid customers are displayed. If you double-click on a single customer its sales areas (if any) are displayed in the second ALV list.
*&---------------------------------------------------------------------* *& Report ZUS_SDN_TWO_ALV_GRIDS *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zus_sdn_two_alv_grids. 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_knb1 TYPE STANDARD TABLE OF knb1, gt_knvv TYPE STANDARD TABLE OF knvv. *---------------------------------------------------------------------* * 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. ENDCLASS. "lcl_eventhandler DEFINITION *---------------------------------------------------------------------* * CLASS lcl_eventhandler IMPLEMENTATION *---------------------------------------------------------------------* * *---------------------------------------------------------------------* CLASS lcl_eventhandler IMPLEMENTATION. METHOD handle_double_click. * define local data DATA: ls_knb1 TYPE knb1. CHECK ( sender = go_grid1 ). READ TABLE gt_knb1 INTO ls_knb1 INDEX e_row-index. CHECK ( ls_knb1-kunnr 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 ENDCLASS. "lcl_eventhandler IMPLEMENTATION START-OF-SELECTION. SELECT * FROM knb1 INTO TABLE gt_knb1 WHERE bukrs = '1000'. * 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. 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 = 'Customers'. CALL METHOD go_grid1->set_table_for_first_display EXPORTING i_structure_name = 'KNB1' is_layout = gs_layout CHANGING it_outtab = gt_knb1 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. gs_layout-grid_title = 'Customers Details (Sales Areas)'. CALL METHOD go_grid2->set_table_for_first_display EXPORTING i_structure_name = 'KNVV' is_layout = gs_layout CHANGING it_outtab = gt_knvv " 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_knb1 TYPE knb1. CALL METHOD go_grid1->get_current_cell IMPORTING e_row = ld_row. READ TABLE gt_knb1 INTO ls_knb1 INDEX ld_row. CHECK ( syst-subrc = 0 ). SELECT * FROM knvv INTO TABLE gt_knvv WHERE kunnr = ls_knb1-kunnr. ENDFORM. " ENTRY_SHOW_DETAILS
Regards
Uwe
Hi all,
I have one screen(100),which contains records.User can select any one record and click 'Details' button.Then it will take to screen 110.When I am coming back to screen 110 again.The previously selected row is again in selected mode only.Now if I am selecting another row and click the 'Detail' button.I am getting the error saying that 'Please select one record'.In debugging mode also I checked using the FM get_current_cell but nothing is getting selected surprisingly.
Even I used CALL METHOD grid->refresh_table_display in the PBO of screen 100.
Below is the code I used in PBO of screen 100
ODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'PF100'.
SET TITLEBAR 'TITLE'.
DATA: G_CONSISTENCY_CHECK TYPE CHAR1.
DATA: G_EXCLUDE TYPE UI_FUNCTIONS.
IF container100 IS INITIAL.
*ex_FUNCTIONS-
*-- Check execution mode (foreground/background)
IF cl_gui_alv_grid=>offline( ) IS INITIAL.
CREATE OBJECT CONTAINER100
EXPORTING CONTAINER_NAME = 'CONTAINER100'.
CREATE OBJECT GRID
EXPORTING I_PARENT = CONTAINER100.
CALL METHOD GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
I_BYPASSING_BUFFER = 'X'
I_BUFFER_ACTIVE = ''
I_CONSISTENCY_CHECK = G_CONSISTENCY_CHECK
IT_TOOLBAR_EXCLUDING = G_EXCLUDE
IT_TOOLBAR_EXCLUDING = IT_TOOLBAR
I_STRUCTURE_NAME =
IS_VARIANT = gs_layout
I_SAVE = 'A'
I_DEFAULT = 'X'
IS_LAYOUT = X_LAYOUT
IS_PRINT =
IT_SPECIAL_GROUPS =
IT_TOOLBAR_EXCLUDING = IT_TOOLBAR
IT_HYPERLINK =
IT_ALV_GRAPHICS =
IT_EXCEPT_QINFO =
CHANGING
IT_OUTTAB = IT_YAPOHDR_MAIN[]
IT_FIELDCATALOG = IT_FIELDCAT[].
IT_SORT =
IT_FILTER =
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
others = 4.
ENDIF.
*--Register enter key for data changed event
CALL METHOD grid->set_ready_for_input
EXPORTING i_ready_for_input = 0.
create object event_receiver.
Register the 'hotspot' event handler method dynamically...
set handler event_receiver->handle_hotspot_click for grid.
Register the User Command event handler method dynamically...
set handler event_receiver->handle_user_command for grid.
Register the User Command event handler method dynamically...
set handler event_receiver->handle_data_changed for grid.
else.
CALL METHOD grid->refresh_table_display.
endif.
ENDMODULE. " STATUS_0100 OUTPUT
The below is the code I used in PAI of screen 110.
MODULE USER_COMMAND_0110 INPUT.
DATA : LT_DETAILS_MAIN LIKE YAPOPLN_ITM OCCURS 0 WITH HEADER LINE,
LV_POP TYPE C,
APPROVE.
CASE SY-UCOMM.
WHEN 'BACK'.
CALL METHOD grid->REFRESH_TABLE_DISPLAY.
CALL METHOD grid->GET_FRONTEND_FIELDCATALOG.
LEAVE TO SCREEN 0.
WHEN 'EXIT'.
LEAVE TO SCREEN 0.
Please Let me know if there is any solution.
Thanks,
Balaji
Add a comment