2017-03-09 1 views
2

背景:cl_salv_tableクラスを使用して、ALVを生成および変更しています。このALVは、タイプzpm_et_qual_notif_sのテーブルを表示します。すべての偶数行は、CHAR長さ1のデリミタフィールドで、名前はDELIM1DELIM2 ...などです。区切り文字列をALVに表示する理由はないので、削除したいと思います。データタイプ別にALV列を動的に非表示

注:ABAPディクショナリ構造体または私が定義する内部テーブルから列の数を決定するかどうかは関係ありませんので、タイトルに「ABAPディクショナリ/内部構造体」の総称を置きました。現在、15個の区切りフィールドがあるよう


私のために簡単な解決策は、これらの15個の文を持っているだろう:

lv_alv->get_columns()->get_column('DELIM1')->set_visible(if_salv_c_bool_sap=>false). 
lv_alv->get_columns()->get_column('DELIM2')->set_visible(if_salv_c_bool_sap=>false). 
lv_alv->get_columns()->get_column('DELIM3')->set_visible(if_salv_c_bool_sap=>false). 
lv_alv->get_columns()->get_column('DELIM4')->set_visible(if_salv_c_bool_sap=>false). 
lv_alv->get_columns()->get_column('DELIM5')->set_visible(if_salv_c_bool_sap=>false). 
... 

これで問題は、新しいフィールドがテーブルに追加された場合、私のプログラムも更新する必要があります。この理由から、このアプローチでは多くの重複した行が必要になりますが、これはちょっとした解決策であることがわかります。私はクリーンなソリューションであると信じる何


が動的ので同様に区切り文字列のすべての可視性を設定することです:

" Dynamically hide delimiter columns 
DATA lv_idx TYPE syst_index VALUE 1. 
WHILE lv_idx < 16. " Number of delimiters 
    lv_alv->get_columns()->get_column(|DELIM{ lv_idx }|)->set_visible(if_salv_c_bool_sap=>false). 
    lv_idx = lv_idx + 1. 
ENDWHILE. 

それは簡単な解決策と紹介ですので、これはいいです最小のオーバーヘッド。しかし、私はまだ区切り文字列の数をハードコードする必要があるという問題があります。理想的な解決策は、私にこれをさせてくれるでしょう:

" Dynamically hide delimiter columns 
DATA lv_idx TYPE syst_index VALUE 1. 
WHILE lv_idx < (columns('ZPM_ET_QUAL_NOTIF_S')/2). " Number of delimiters 
    lv_alv->get_columns()->get_column(|DELIM{ lv_idx }|)->set_visible(if_salv_c_bool_sap=>false). 
    lv_idx = lv_idx + 1. 
ENDWHILE. 

...もちろん、それは事ではありません。

内部テーブルまたはそれに基づいているABAPディクショナリ構造の列数を動的に取得する方法を教えてください。確かにこれにはいくつかの解決策があります。この問題を自分自身で解決しようとすると、cl_abap_structdescrcl_abap_tabledescrと一緒に周りを回るようになりましたが、大きなものはありませんでした。私のアプローチ全体が悪い場合、私は良い習慣に従うためにそれを変更することに満足しています。

+0

このテーブルを埋めるためにファイルからデータをアップロードしようとしていますか? – jhamu

+0

@ jhamuいいえ、入力データは顧客データベーステーブルから取得されました。 – gkubed

答えて

4

まず、完全に表示されないように、これらの列にset_technicalというタグを付けます。 set_visible(abap_false)は現在/初期表示からそれらを非表示にしますが、ユーザーはこれらの列を表示するように選択することができ、混乱する可能性があります。

次に、これらの列を位置ではなくデータ要素で区別しようとします。

DATA(columns) = my_alv->get_columns(). 
DATA(column_list) = columns->get(). 
LOOP AT column_list ASSIGNING FIELD-SYMBOL(<column>). 
    IF <column>-r_column->get_ddic_rollname() = 'Z_IRRELEVANT_DELIMITER'. 
    <column>-r_column->set_technical(). 
    ENDIF. 
ENDLOOP. 
+0

多くの素晴らしいアイデアがあります - ありがとうございます。私は 'set_technical()'を使用するようにコードを修正しました。そして、区切りフィールドのデータ型を長さ '1 'の' CHAR'ではなく 'DELIM'に変更しました。場所)。 'my_alv-> get_columns()'はテーブルではなく 'TYPE REF TO CL_SALV_COLUMNS_TABLE'のオブジェクトを返すので、実際にカラムをループする方法を理解しようとしています。 – gkubed

+2

は、元のコードは、 ')'(GETへの呼び出しが欠落しているように見え、これは –

+1

うんCL_SALV_COLUMNS_TABLE'するために 'TYPE REFからテーブルを取得します - 私はヘッドアップしてくれてありがとう:-)書いたように、テストされていないが、私はしましたコールを追加しました。 – vwegert

1

次のコードスニペットは、データ辞書構造またはテーブルのアクティブバージョンの列数を決定します。

SELECT COUNT(*) INTO @DATA(num_cols) 
        FROM dd03l 
        WHERE tabname EQ @p_struct 
        AND as4local EQ 'A'. " Active 

他の解決策は、RTTS frameworkを使用して、またはASSIGN COMPONENTを用いて作製することができます。

+3

APIが存在する場合、リポジトリ/ディクショナリテーブルに直接アクセスすることをお勧めします。この場合、複数の選択肢が存在します。また、(この特定の質問とは関係ありませんが)表示がDDIC構造に基づくのではなく、プログラムのローカルタイプであれば、これは失敗します。 – vwegert