SAP-ABAP。 ALVグリッドの合計行の変更

私は、SAPを実装している国内企業の1つでABAP開発者として働いています。



先日、コンサルタントから仕様が作成され、特別な集計行(ALV GRID)を作成するタスクが作成されました。これには、すべての種類の金額、値、名前などが含まれます。 また、この行のデータを手動で変更するユーザーの能力を認識する必要があります。



タンク内の人の場合:合計線は黄色で、合計が表示されます。この場合、債務者によって表示されます。



画像



Porakininの頭脳と同僚に尋ねて、 私はコンサルタントに 2つのオプションを受け取ったようなリクエストを地獄に送ることにしました



  1. 独自の集計行を作成します。これは内側のプレートにあります。 色、量などで出力をカスタマイズします
  2. 合計の標準行で必要な値を置き換えてみてください。


最初のオプションはすぐに投げました。 つい最近、このようなラインで開発を決定しました。hemoはありません-ALVでフィルターデータを並べ替えることができず、ラインはどこかに移動することができます。 など さらに、標準ラインには、ラインを1つまたはサブサムの階層に折りたたむなど、クールで便利な機能がたくさんあります。 唯一のネガティブ-どのように回しても、編集のために要約の標準的な行を開くことは不可能です(まあ、面倒です)。



2番目のオプション-それも可能ですか?! 問題の研究について当局から承認を受けて、彼はうろつきました、そして、最初のリンクで、良いインド人はこれが完全に合法で本当であると説明します。 CL_GUI_ALV_GRIDクラスには、プログラムで簡単に変更できるすべてのレベルの合計を含むテーブルへのリンクを返すGET_SUBTOTALSメソッドがあります。 次のようになります。



画像



ほら、仲間! タスクは明確であり、アクションプランでさえ概説されています。 左の値は、債務者の集計行にのみ挿入する必要があります。 つまり IT_SORTパラメーターをSET_TABLE_FOR_FIRST_DISPLAYメソッドに渡します。このメソッドでは、最初のレベルの並べ替え-顧客による並べ替えを示します。 第1レベルの金額のテーブルを取り出し(これらは債務者の金額になります)、そこに必要な値を代入します。



概略的には次のようになります。



FORM fill_sort CHANGING ct_sort TYPE lvc_t_sort. APPEND INITIAL LINE TO ct_sort ASSIGNING FIELD-SYMBOL(<lfs_sort>). <lfs_sort>-spos = '1'. <lfs_sort>-fieldname = 'KUNNR'. " !!!! <lfs_sort>-subtot = 'X'. <lfs_sort>-up = 'X'. ENDFORM. go_alv_grid->set_table_for_first_display( ... ). PERFORM set_subtotals. ... FORM set_subtotals . DATA: lr_collect01 TYPE REF TO data . FIELD-SYMBOLS: <lfs_tab> TYPE ANY TABLE , <lfs_line> TYPE ty_data . go_alv_grid->get_subtotals( IMPORTING ep_collect01 = lr_collect01 ). ASSIGN lr_collect01->* TO <lfs_tab>. IF <lfs_tab> IS ASSIGNED. LOOP AT <lfs_tab> ASSIGNING <lfs_line>. "     ENDLOOP. ENDIF. ENDFORM.
      
      





「それは本当に効くのだろうか!」と思い、震えながら手で報告を始めました。 うまくいきました!!! しかし、まったく正しくありません。 値は小計のみで表示され、画面の下に表示されました。 つまり 下にスクロールする必要があるもの。 このソリューションはインターネット上で非常に迅速に見つかりました。合計を変更した後にALVのソフト更新を発生させるには:



 go_alv_grid->refresh_table_display( i_soft_refresh = 'X' ).
      
      





i_soft_refreshパラメーターを指定しない場合、更新によりすべての小計が再カウントされ、データが上書きされます。



それだけですか?! 試用できますか?! まあ、それはそうではありませんでした...まあ、待って...ユーザーが並べ替えを変更したらどうなりますか? または、データをフィルタリングしますか? または、彼は私たちのテーブルで何かをします!? 更新され、すべての値が消えます! くそー...



しかし、判明したように、CL_GUI_ALV_GRIDクラスには、ALVが更新されるたびに起動されるAFTER_REFRESHという魔法の非常に便利なイベントがあります。 今回のアクションプランは次のとおりです。



1.イベントAFTER_REFRESHをキャッチします。

2.現在のALV状態をソートするための基準を取得します(これが画面に表示されます):go_alv_grid-> get_sort_criteria;

3.チェック:ソートの最初のレベルで、債務者(<lfs_sort> -spos = 1 AND <lfs_sort> -fieldname = 'KUNNR')があり、加算が有効(<lfs_sort> -subtot = 'X')である必要があります。

3.a. すべて問題なければ、必要なデータを合計行に代入するサブルーチンを実行します。PERFORMset_subtotals。;

3.b. それ以外の場合、債務者が第1レベルになり、合計が有効になるようにソート基準を変更します。

3.b.I. ソート基準に債務者がまったくいない場合、9番目のレベル(ある場合)のソートを削除し、他のすべてのレベルを+1増やし、債務者による最初のレベルのソートを挿入します。

3.b.II. 顧客による並べ替えがテーブルにあり、最初のレベルではない場合、すべての並べ替えレベルを顧客のレベルよりも+1増やし、顧客の並べ替えレベルを1ずつ変更します。



4.正しいソート基準を設定します:go_alv_grid-> set_sort_criteria(lt_sort);

5.次に、金額を再カウントしてALV更新を開始します(ここで、AFTER_REFRESHイベントが再び機能するため、無限再帰を開始しないように注意する必要があります)。

6.イベントは2回目には機能しますが、ソート基準は正しく、小計行の入力が開始されます(ところで、問題は-無限の再帰によってプログラムがフリーズしないように正しい量が設定されているかどうかを確認する必要があるためです。金額を変更した後、ソフトアップデートALVを開始する必要があります。



利益! 上司やコンサルタントから称賛を得よう! ユーザーがどのようにALVを拷問しても、ソートの最初のレベルには常に債務者がいます。彼にとっては、必要な値の合計が常にあります。



残っている問題は1つだけです。ユーザーはまだデータを手動で変更できません。 彼はしたい。 しかし、コンサルタントと話し合った後、そのような行をダブルクリックして、ユーザーが入力する入力フィールドを含むウィンドウを捨て、Enterを押すと、テーブルの必要なフィールドに移動することにしました。 合計ラインと通常のラインを区別する方法は? 回答:はい、もちろん簡単です! すべての愚かな質問は何ですか? DOUBLE_CLICKイベントには、is_row-rowtypeという優れたパラメーターがあります。 通常の行では空で、オフィスに記入されています。 通常、このタイプの行で埋められます。



 S 0101 0000000001
      
      





Sは合計行(値T-合計行)もあり、0101はソートレベル(少なくとも最後の2桁)であることが実験的に判明しました。 is_row(インデックス)構造の2番目のフィールドには、必要なレベルの合計テーブルの行番号が含まれます。 すべての情報があります! 私たちは行動します:



1.ユーザーが小計をクリックしたことを確認します。

2.第1レベルの合計のテーブルを取得します。go_alv_grid-> get_subtotals;

3.必要な行sub_total_tab [is_row-index]を読み取ります。

4.入力フィールドのあるウィンドウをユーザーに表示します(行の現在の値を入力フィールドに挿入します)。

5.ユーザーデータを取得します。

6.ユーザーデータを行に挿入します。

7. ALVをソフト更新します。



まあ、それだけです! 誰もが幸せで、すべてがうまくいきます! まあ、少なくとも私にとっては、コンサルタントが休暇中であり、まだチェックしていません。



All Articles