前兩天有個打印需求變更,需要在ALV顯示列表中添加兩個字段,可編輯,而我自己用的是函數:REUSE_ALV_GRID_DISPLAY_LVC
因為之前做可編輯基本都是固定套路,定義類,畫屏幕。。。。
很是麻煩,所以才看看能不能不用屏幕,不用定義方法,結果是可以的,分享給大家!
前提:ALV使用自定義的工具欄(工具欄引用標准的工具按鈕,有個小技巧,有空的自己研究)
一:只是做編輯,修改,自動更新內表:
只需添加幾行代碼即可:
在SET_STATUS里加入:
FORM prm_set_status USING rt_extab TYPE slis_t_extab. SET PF-STATUS 'ZSTAT'. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = lr_grid. CALL METHOD lr_grid->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified. IF sy-subrc <> 0. ENDIF. ENDFORM.
這樣系統用自己的modify事件,修改數據,回車的時候就會觸發更新內表
這種方式結合字段目錄中定義的參考表和字段,就可以輕松實現F4功能,簡單使用。
二:用自定義的修改邏輯:
給ALV添加事件和FORM
REFRESH:lt_event. ls_event-form = 'DATA_CHANGED_METHOD'. ls_event-name = 'DATA_CHANGED'. APPEND ls_event TO lt_event. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = 'PRM_SET_STATUS' i_callback_user_command = 'PRM_USER_COMMAND' is_layout_lvc = ls_layout it_fieldcat_lvc = gt_fieldcat[] i_default = 'X' i_save = 'A' it_events = lt_event[] TABLES t_outtab = gt_show[] EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. ENDIF.
注意:用此方法,也需要一中的代碼
然后在程序中添加自己的代碼處理內表就可以了,用這種方法可以做數據更新,關聯更新
FORM data_changed_method USING pa_data_changed TYPE REF TO cl_alv_changed_data_protocol . DATA: l_it_data TYPE lvc_t_modi, l_wa_data LIKE LINE OF l_it_data. FIELD-SYMBOLS:<lv_field> TYPE any. l_it_data = pa_data_changed->mt_mod_cells. CHECK l_it_data IS NOT INITIAL. LOOP AT pa_data_changed->mt_mod_cells INTO l_wa_data. READ TABLE gt_show INTO gw_show INDEX l_wa_data-row_id. IF sy-subrc = 0. ASSIGN COMPONENT l_wa_data-fieldname OF STRUCTURE gw_show TO <lv_field>. IF sy-subrc = 0. <lv_field> = l_wa_data-value. MODIFY gt_show FROM gw_show INDEX l_wa_data-row_id. ENDIF. ENDIF. ENDLOOP. CALL METHOD lr_grid->refresh_table_display. ENDFORM. " DATA_CHANGED_METHOD
