从 ALV 检索过滤数据

Eri*_*rik 4 abap filter alv

当该 ALV 上还使用了过滤器时,是否有一种简单的方法可以检索显示的 ALV 数据?

使用的 ALV 是CL_GUI_ALV_GRID. 向用户展示时,默认情况下会在其上放置一个过滤器。用户还有一个按钮来处理 ALV 中的数据。即使用户将自己的过滤器放在 ALV 上,我如何确保该过程仅适用于显示的数据?

例如:一个 ALV 是从一个有 10 行的 itab 创建的,但是因为在 ALV 上还有一个过滤器,所以只显示了 8 行。按下按钮时,我只想处理当前向用户显示的 8 行。

我曾尝试为此目的找到一个功能模块,但我只能找到一个适用于 ALV 中选定行的 FM。

编辑:此外,有一个方法叫做get_filtered_entries,但它只检索那些未显示的条目。使用它来翻译显示的条目将非常耗时。get_filtered_entries

提前致谢。

小智 5

GET_FILTERED_ENTRIES返回一个排除行索引的表。您只需要跳过处理中的那些。

" Copy original table
DATA(lit_buffer) = it_out[]. 

" Get excluded rows
o_grid->get_filtered_entries(
  IMPORTING
    et_filtered_entries = DATA(lit_index)
).

" Reverse order to keep correct indizes; thnx futu
SORT lit_index DESCENDING.

" Remove excluded rows from buffer
LOOP AT lit_index ASSIGNING FIELD-SYMBOL(<index>).
  DELETE lit_buffer INDEX <index>.
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

编辑:我调试cl_gui_alv_grid了一点,似乎根本不存在原始表的过滤版本。这些行被过滤、排序、分组并立即转移到一个单元格表中。看起来几乎不可能在没有性能缺陷的情况下获得显示的行。

  • 我从来没有足够的勇气这样做...你确定它有效并且当你循环它并删除条目时它不会弄乱表的索引吗?示例:第 1、2、3、4、5 行。第一个循环删除 2。在第二个循环中,您的索引是 1、2、3、4。(3 = 2, 4 = 3, 5 = 4)?明白我的顾虑吗?至少我希望你对你的 lit_index DESCENDING 进行排序......?有人可以澄清这一点吗? (3认同)