2017-09-19 45 views
3

そのALVでフィルタが使用されている場合に表示されるALVデータを簡単に取得する方法はありますか?ABAPのALVからフィルタリングされたデータを取得する

使用されるALVは、CL_GUI_ALV_GRIDのオブジェクトです。ユーザーに表示するときは、デフォルトでフィルタが配置されています。ユーザーには、ALV内のデータを処理するボタンもあります。ユーザーがALVに独自のフィルタを配置した場合でも、表示されるデータでのみプロセスが機能することを確認するにはどうすればよいですか?

例:10行のitabからALVが作成されますが、ALVに渡されるフィルタもあるため、8行しか表示されません。ボタンを押すと、私は現在、ユーザーに現在表示されている8行だけを扱いたいと思う。

私はこの目的のための汎用モジュールを見つけようとしましたが、ALV内の選択された行で動作するFMしか見つかりませんでした。

** EDIT:**さらに、get_filtered_entriesと呼ばれるメソッドがありますが、これは表示されないエントリだけを取得します。これを使用すると、表示されたエントリに翻訳するのにかなりの時間がかかります。 get_filtered_entries

ありがとうございます。

答えて

4

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. 

EDIT:私はcl_gui_alv_gridを少しデバッグし、元のテーブルのフィルタされたバージョンが全く存在しているように思えるしません。これらの行は、フィルタリングされ、ソートされ、グループ化され、すぐにセルの表に転送されます。表示された行をパフォーマンスの欠点なしに取得することはほぼ不可能なように見えます。

+0

最も効率的なやり方は何でしょうか? itabに表示されていないすべてのエントリをロードし、ソースitabをコピーし、コピーをループして、表示されていないitabにも存在するエントリを削除しますか?私は他の機能に渡すことができる表示されたエントリのテーブルが必要です。 – Erik

+0

@Erik元のテーブルをコピーして変更することは唯一の選択肢のようです。私は私の答えにいくつかのコードを追加しました。私はインデックスのテーブルで削除する別の方法も知らない。 –

+0

@Erik 'APPEND'(' LINES OF ... FROM ... TO ... ')の中に興味深いオプションがいくつかある。私は後でこれをテストするつもりです –

関連する問題