Filter 从ALV检索筛选的数据

Filter 从ALV检索筛选的数据,filter,abap,alv,Filter,Abap,Alv,当ALV上也使用了过滤器时,是否有一种简单的方法来检索显示的ALV数据 所使用的ALV是CL\u GUI\u ALV\u GRID的对象。向用户显示时,默认情况下会在其上放置一个过滤器。用户还有一个按钮,用于处理ALV中的数据。即使用户在ALV上放置了自己的过滤器,我如何确保该过程仅对显示的数据起作用 e、 g:一个ALV是从一个有10行的itab创建的,但是由于在ALV上还传递了一个过滤器,所以只显示了8行。按下按钮时,我只想处理当前显示给用户的8行 我已经试着为此寻找一个功能模块,但我只能找

当ALV上也使用了过滤器时,是否有一种简单的方法来检索显示的ALV数据

所使用的ALV是
CL\u GUI\u ALV\u GRID
的对象。向用户显示时,默认情况下会在其上放置一个过滤器。用户还有一个按钮,用于处理ALV中的数据。即使用户在ALV上放置了自己的过滤器,我如何确保该过程仅对显示的数据起作用

e、 g:一个ALV是从一个有10行的itab创建的,但是由于在ALV上还传递了一个过滤器,所以只显示了8行。按下按钮时,我只想处理当前显示给用户的8行

我已经试着为此寻找一个功能模块,但我只能找到一个与ALV中选定行一起工作的FM

EDIT:此外,还有一个名为
get\u filtered\u entries
的方法,但它只检索未显示的条目。使用此选项将相当耗时地对显示的条目进行翻译


提前感谢。

GET\u FILTERED\u 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.
“复制原始表
数据(lit_缓冲区)=输出[]。
“获取被排除的行
o\u网格->获取\u筛选的\u条目(
进口
et_筛选的_条目=数据(lit_索引)
).
相反的顺序来保持正确的指示;thnx futu
按降序对索引进行排序。
“从缓冲区中删除排除的行
在lit_索引处循环分配字段-SYMBOL()。
删除lit_缓冲区索引。
结束循环。


EDIT:我调试了一点
cl\u gui\u alv\u grid
,看起来根本不存在原始表的过滤版本。这些行被过滤、排序、分组并立即传输到单元格表中。如果没有性能缺陷,几乎不可能获得显示的行。

您认为最有效的方法是什么?加载itab中所有未显示的条目,复制源itab,循环复制副本并删除未显示itab中也存在的条目?我需要一个可以传递给其他函数的显示项表。@Erik复制和修改原始表似乎是唯一的选择。我在回答中添加了一些代码。我也不知道用表删除的另一种方法indices@Erik
APPEND
下还有一些有趣的选项(
从…到…的行
)。我以后会测试的,我实现了代码来测试。我必须在delete语句中从更改为索引。工作起来很有魅力。非常感谢你!我从来没有足够的勇气这样做。。。当您循环它并删除条目时,您确定它可以工作并且不会弄乱表的索引吗?示例:第1、2、3、4、5行。第一个循环删除2。在第二个循环中,索引是1,2,3,4。(3 = 2, 4 = 3, 5 = 4)? 明白我的担心吗?至少我希望你把你的lit_索引按降序排序。。。?有人能澄清一下吗?