2007 Sep 25 6:04 PM
Hi,
I have an editable grid. The scenario goes like this. Say data records with item numbers 10 and 20 are shown on the screen. The user changes some data in 10 and clicks on delete on 20. Delete is application event in my case.
On pressing delete, control goes to data_changed handler. Here I check the changes. Say the deletion was valid but the change in item 10 was valid. I add a protocol entry for item 10.
Now, if I delete 20 from my table and do a refresh_table_display, 20 gets deleted. But if user presses enter without making any change in 10, it should be validated again because it has incorrect data. But now that we called refresh_table_display, data_changed handler will not be called.
If I donot want to do a refresh, I need a way to delete rows from ALV without calling refresh_table_display.
I am looking forward to your ideas on it.
Thanks.
Srinivas.
Hi,
I have an editable grid. The scenario goes like this. Say data records with item numbers 10 and 20 are shown on the screen. The user changes some data in 10 and clicks on delete on 20. Delete is application event in my case.
On pressing delete, control goes to data_changed handler. Here I check the changes. Say the deletion was valid but the change in item 10 was valid. I add a protocol entry for item 10.
Now, if I delete 20 from my table and do a refresh_table_display, 20 gets deleted. But if user presses enter without making any change in 10, it should be validated again because it has incorrect data. But now that we called refresh_table_display, data_changed handler will not be called.
If I donot want to do a refresh, I need a way to delete rows from ALV without calling refresh_table_display.
I am looking forward to your ideas on it.
Thanks.
Srinivas.
2007 Sep 25 8:09 PM
I am also having same problem...appreciate you help if you find a solution.
Thanks
Bhavani Prasad.
2007 Sep 25 8:32 PM
Hello Srinivas
Simply call the event handler method directly. If the validation fails you could save a flag within your event handler class and only let the user save the data if VALID_DATA = 'X'.
Have a look at my sample report <b>ZUS_SDN_ALVGRID_EDITABLE_2</b>:
*&---------------------------------------------------------------------*
*& Report ZUS_SDN_ALVGRID_EDITABLE_2
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zus_sdn_alvgrid_editable_2.
TYPE-POOLS: abap.
DATA:
gd_repid type syrepid,
gd_okcode TYPE ui_func,
*
gs_layout TYPE lvc_s_layo,
gt_fcat TYPE lvc_t_fcat,
go_docking TYPE REF TO cl_gui_docking_container,
go_grid TYPE REF TO cl_gui_alv_grid.
TYPES: BEGIN OF ty_s_outtab.
INCLUDE TYPE bkpf.
TYPES: celltab TYPE lvc_t_styl.
TYPES: END OF ty_s_outtab.
DATA:
gs_outtab TYPE ty_s_outtab,
gt_outtab TYPE STANDARD TABLE OF ty_s_outtab
WITH DEFAULT KEY.
*---------------------------------------------------------------------*
* CLASS lcl_eventhandler DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_eventhandler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING
er_data_changed
e_onf4
e_onf4_before
e_onf4_after
e_ucomm
sender.
ENDCLASS. "lcl_eventhandler DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_eventhandler IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_eventhandler IMPLEMENTATION.
METHOD handle_data_changed.
* define local data
DATA:
ls_outtab LIKE LINE OF gt_outtab,
lo_data_changed TYPE REF TO cl_alv_changed_data_protocol.
IF ( er_data_changed IS NOT BOUND ).
CREATE OBJECT lo_data_changed
EXPORTING
* I_CONTAINER =
i_calling_alv = sender.
ELSE.
lo_data_changed = er_data_changed.
ENDIF.
LOOP AT gt_outtab INTO ls_outtab
WHERE ( gjahr < '2000' ).
CALL METHOD lo_data_changed->add_protocol_entry
EXPORTING
i_msgid = '8I'
i_msgty = 'E'
i_msgno = '751'
i_msgv1 = ls_outtab-gjahr
i_msgv2 = '>= 2000'
* I_MSGV3 =
* I_MSGV4 =
i_fieldname = 'GJAHR'
* I_ROW_ID =
* I_TABIX =
.
ENDLOOP.
IF ( syst-subrc = 0 ).
lo_data_changed->display_protocol( ).
ENDIF.
ENDMETHOD. "handle_data_changed
ENDCLASS. "lcl_eventhandler IMPLEMENTATION
START-OF-SELECTION.
SELECT * FROM bkpf INTO CORRESPONDING FIELDS OF
TABLE gt_outtab UP TO 100 ROWS.
LOOP AT gt_outtab INTO gs_outtab.
gs_outtab-gjahr = '1980' + syst-tabix.
MODIFY gt_outtab FROM gs_outtab.
ENDLOOP.
PERFORM validate_output.
* 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 ALV grid
CREATE OBJECT go_grid
EXPORTING
i_parent = go_docking
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.
* Build fieldcatalog
PERFORM build_fieldcatalog.
PERFORM set_layout.
SET HANDLER:
lcl_eventhandler=>handle_data_changed FOR go_grid.
* Display data
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
is_layout = gs_layout
CHANGING
it_outtab = gt_outtab
it_fieldcatalog = gt_fcat
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
gd_repid = syst-repid.
CALL METHOD go_docking->link
EXPORTING
repid = gd_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.
* ok-code field = GD_OKCODE
CALL SCREEN '0100'.
* Flow logic (no elements on screen):
* 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'.
* SET TITLEBAR 'xxx'.
** CALL METHOD go_grid1->refresh_table_display
*** EXPORTING
*** IS_STABLE =
*** I_SOFT_REFRESH =
** EXCEPTIONS
** FINISHED = 1
** 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.
TRANSLATE gd_okcode TO UPPER CASE.
go_grid->check_changed_data( ).
CASE gd_okcode.
WHEN 'BACK' OR
'END' OR
'CANC'.
SET SCREEN 0. LEAVE SCREEN.
WHEN OTHERS.
ENDCASE.
PERFORM handle_changed_data.
PERFORM validate_output.
CALL METHOD go_grid->refresh_table_display
* EXPORTING
* IS_STABLE =
* I_SOFT_REFRESH =
EXCEPTIONS
finished = 1
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.
CLEAR: gd_okcode.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCATALOG_KNB1
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM build_fieldcatalog .
* define local data
DATA:
ls_fcat TYPE lvc_s_fcat.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
* I_BUFFER_ACTIVE =
i_structure_name = 'BKPF'
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_BYPASSING_BUFFER =
* I_INTERNAL_TABNAME =
CHANGING
ct_fieldcat = gt_fcat
EXCEPTIONS
inconsistent_interface = 1
program_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.
LOOP AT gt_fcat INTO ls_fcat
WHERE ( fieldname = 'GJAHR' ).
ls_fcat-edit = abap_true.
MODIFY gt_fcat FROM ls_fcat.
ENDLOOP.
ENDFORM. " BUILD_FIELDCATALOG_KNB1
*&---------------------------------------------------------------------*
*& Form VALIDATE_OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM validate_output .
* define local data
CONSTANTS:
lc_red TYPE int4 VALUE '00000087'.
DATA:
ls_cell TYPE lvc_s_styl,
lt_celltab_nok TYPE lvc_t_styl,
lt_celltab_ok TYPE lvc_t_styl.
ls_cell-fieldname = 'GJAHR'.
ls_cell-style = lc_red.
INSERT ls_cell INTO TABLE lt_celltab_nok.
ls_cell-fieldname = 'GJAHR'.
ls_cell-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT ls_cell INTO TABLE lt_celltab_ok.
LOOP AT gt_outtab INTO gs_outtab.
IF ( gs_outtab-gjahr < '2000' ).
gs_outtab-celltab = lt_celltab_nok.
ELSE.
gs_outtab-celltab = lt_celltab_ok.
ENDIF.
MODIFY gt_outtab FROM gs_outtab INDEX syst-tabix.
ENDLOOP.
ENDFORM. " VALIDATE_OUTPUT
*&---------------------------------------------------------------------*
*& Form SET_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_layout .
CLEAR: gs_layout.
gs_layout-cwidth_opt = abap_true.
gs_layout-zebra = abap_true.
gs_layout-stylefname = 'CELLTAB'.
ENDFORM. " SET_LAYOUT
*&---------------------------------------------------------------------*
*& Form HANDLE_CHANGED_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM handle_changed_data .
lcl_eventhandler=>handle_data_changed( sender = go_grid ).
ENDFORM. " HANDLE_CHANGED_DATARegards
Uwe
| User | Count |
|---|---|
| 3 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |