问题:当用户在ALV上使用“过滤”功能,ALV界面的数据和内表的数据就会不一致,内表还是全量数据,而ALV界面只保留了用户想要的部分数据,这时如果批量操作内表,就把把数据全部处理,而不是用户想要的只处理ALV界面上的数据。
解决:通过系统提供的过滤表功能,得到真正过滤掉的数据,批量操作的时候判断一下是否处理。
一、这是ALV没有过滤条件的数据内表:

二、设置过滤条件为保留单号181047后
ALV界面:

过滤表的数据(看来,过滤内表放的是真正过滤掉的数据):

三、Function ALV 中得到过滤数据的代码(用户回调函数中):
DATA: lo_grid TYPE REF TO cl_gui_alv_grid,
filt_table TYPE lvc_t_fidx,
l_filt_table TYPE int4 .
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lo_grid.
CALL METHOD lo_grid->get_filtered_entries
IMPORTING
et_filtered_entries = filt_table."被过滤的内表数据行
四、完整的代码实现,一般出现在用户的回调函数的批量操作中:
FORM frm_user_command USING iv_ucom TYPE sy-ucomm
iv_selfield TYPE slis_selfield.
PERFORM frm_check_change.
CASE iv_ucom.
DATA: lo_grid TYPE REF TO cl_gui_alv_grid,
filt_table TYPE lvc_t_fidx,
ls_filt_table TYPE int4 .
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lo_grid.
CALL METHOD lo_grid->get_filtered_entries
IMPORTING
et_filtered_entries = filt_table."被过滤的内表数据行
WHEN 'ALL'.
LOOP AT gt_output INTO data(gs_output_tmp).
gs_output_tmp-sel = 'X'.
MODIFY gt_output FROM gs_output_tmp.
ENDLOOP.
iv_selfield-refresh = 'X'.
WHEN 'SAL'.
LOOP AT gt_output INTO gs_output_tmp.
gs_output_tmp-sel = ''.
MODIFY gt_output FROM gs_output_tmp.
ENDLOOP.
iv_selfield-refresh = 'X'.
WHEN 'DEL'.
READ TABLE gt_output INTO gs_output WITH KEY sel = 'X' bdel = ''.
IF sy-subrc EQ 0.
DATA lv_answer TYPE c.
PERFORM frm_del_confirm CHANGING lv_answer.
IF lv_answer EQ '1'.
LOOP AT gt_output INTO gs_output WHERE sel = 'X' AND bdel = ''.
READ TABLE filt_table INTO ls_filt_table WITH KEY table_line = sy-tabix. "看该行是否在被过滤掉的内表行中
IF sy-subrc <> 0."如果不是被过滤掉的数据,才真正处理
UPDATE ztppu0043 SET bdel = 'X' euser = sy-uname edate = sy-datum etime = sy-uzeit
WHERE uuid = gs_output-uuid AND
plant = gs_output-plant AND
kdauf = gs_output-kdauf AND
kdpos = gs_output-kdpos AND
ordernr = gs_output-ordernr AND
omatnr = gs_output-omatnr AND
matnr = gs_output-matnr AND
bomid = gs_output-bomid.
COMMIT WORK.
CHECK sy-subrc EQ 0.
gs_output-bdel = 'X'.
MODIFY gt_output FROM gs_output.
ENDIF.
ENDLOOP.
IF p_del IS INITIAL.
DELETE gt_output WHERE bdel = 'X'.
ENDIF.
MESSAGE '数据删除成功' TYPE c_s .
gv_refresh = 'X'.
ENDIF.
ELSE.
MESSAGE '请选择一行进行删除。' TYPE c_s DISPLAY LIKE c_e.
ENDIF.
ENDFORM.
本文档介绍了在ABAP中处理ALV(List Viewer)数据过滤的问题。当用户通过ALV界面应用过滤后,内表仍然包含全量数据,这可能导致批量操作错误。解决方案是利用`get_filtered_entries`方法获取过滤后的数据,并在执行更新操作前检查数据是否被过滤。在批量删除场景中,只有不在过滤表中的记录才会被真正处理,确保了操作的准确性。
1848

被折叠的 条评论
为什么被折叠?



