ABAP ALV 过滤设置后,内表数据还是全部的处理(ALV备忘六)

本文档介绍了在ABAP中处理ALV(List Viewer)数据过滤的问题。当用户通过ALV界面应用过滤后,内表仍然包含全量数据,这可能导致批量操作错误。解决方案是利用`get_filtered_entries`方法获取过滤后的数据,并在执行更新操作前检查数据是否被过滤。在批量删除场景中,只有不在过滤表中的记录才会被真正处理,确保了操作的准确性。

问题:当用户在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.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值