たまにはABAP ALV LIst その1

以前、ALVリストの資料のリンクを紹介したのだが、REUSE_ALV_GRID_DISPLAY関係のリンクが切れているという状態であることに気が付く今日このごろ。
しょうがないので、たまには自分でやってみるか、と、思いったった次第。

書くこと・・・方針めいたもの

ALVリストの作成方法としては、ALVのクラスを使用して作るやり方と、REUSE_ALV_GRID_DISPLAYを使うやり方の二つのやりかたがございまして。
ALVのクラスを使用するやり方は、SDNにおちている「An Easy Reference for ALV Grid Control」が、いまだに最強と思われるため、ちょいとパスして、ここでは、REUSE_ALV_GRID_DISPLAYの使い方を、ちょろっと書いてみようかと思います、はい。
で、REUSE_ALV_GRID_DISPLAYなんですが、まあ、たくさんパラメータがあるわけなんですよ。EXPORTINGが38、IMPORTINGが2、Tablesが1、EXCEPTIONSが2。なんせ大量にあるEXPORTINGに何を設定していいのかわからん、というお話なんですな。
じゃあ、わたしが全部知ってるかというと、当然、そんなわけないので、今までやってきて「これでいいんじゃね?」というレベルまででいいかな、と、勝手に決める次第。具体的には、ALVリストに自作のメニューを配置し、リストにラジオボタンを表示、メニューのボタンを押すと、何かしらPOPUPで表示、というところまでやってみようかな〜と、思います。あ、表示バリンアントの保存もいるかな〜

最初の一歩。めっちゃシンプルなALVリスト

で、REUSE_ALV_GRID_DISPLAYなんですが、絶対必要なものが、
・表示するデータ
・表示するデータの型
以上、二つなわけです。
逆に、この二つを渡してやれば、表示だけはできるわけなんですよ。他のパラメータいらん。
で、表示するデータについては、TABLESパラメータのT_OUTTABに渡してやればいいわけです。
そして、表示するデータの型なんですが、表示するデータの左から順番に、型の情報を内部テーブルに登録し、IT_FIELDCATに渡してやればいいんですな。
しかし、このIT_FIELDCATに渡すデータというのが曲者で、このパラメータの一行に、すっげ〜いろんなデータを設定してやる必要があるんです。
そいつは面倒だ、というので、便利なのがI_STRUCTURE_NAMEというパラメータ。こいつに、ABAPディクショナリの構造やテーブル名を指定してやると、IT_FIELDCATの中身を自動生成してくれます。つまり、表示したい項目を構造としてABAPディクショナリに定義しておいて、T_OUTTABに渡す内部テーブルとして使い、I_STRUCTURE_NAMEにその構造名を指定すると、あっという間にリストを生成してくれるわけです。

表示バリアントの保存

ALVリストのいいところは、表示バリアントを使うことで、項目を絞ってみたり、ソートしてみたり、集計をしてみたり、ということができるところ。
なんですが、REUSE_ALV_GRID_DISPLAYでリストを作ると、最初、バリアントの保存ができませぬ。バリアントを保存するためのキー情報を定義し、保存を許可するよう、パラメータ設定してあげる必要があるのですな。
そのパラメータがIS_VARIANTとI_SAVEでございます。
IS_VARIANTには、プログラム名とハンドルをセット。ハンドルって何かというと、プログラム内で複数のALVリストを表示させたりする場合に、別々の表示バリアントが必要なわけですが、それを区別するキーです。4文字で適当なのでOK。
I_SAVEはその名の通り、表示バリアントをSAVEできるかどうか、のパラメータ。今回はSAVEさせたいので、'X'をたてます。

第一回目のソースコード

ということで、サンプルソースコードっす。
構造を定義するのも面倒なので、みんな大好き、SFLIGITのテーブルとその内容を使います。
Form data_getで、SFLIGHTのデータを全件抜いてきて、Form display_alvで表示させます。
REUSE_ALV_GRID_DISPLAYのパラメータは、data_getでとってきたデータと、I_STRUCTURE_NAME。
data_getでとってきたデータの型は、SFLIGHTなので、I_STRUCTURE_NAMEに指定するのもSFLIGHTです。
第一画面に何もないのは寂しかったので、ALVリストの真上に表示されるタイトルを指定し、I_GRID_TITLEに入れています。
表示バリアントのハンドルは、適当に「0001」なんてのを設定してみました。
type-pools:slis は、ALVリストを作るときのお決まり。
REUSE_ALV_GRID_DISPLAYを使うときのType定義の塊でございます。

*&---------------------------------------------------------------------*
*& Report  YTEST_ALV_LIST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  YTEST_ALV_LIST.


type-pools:slis .

data : itab_out type TABLE OF sflight .

data : str_variant like DISVARIANT.


PARAMETERS p_title type sy-title .

START-OF-SELECTION .

  PERFORM data_get .

  PERFORM set_variant.

  PERFORM display_alv .

*&---------------------------------------------------------------------*
*&      Form  DATA_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DATA_GET .


  select * from sflight into table  itab_out.


ENDFORM.                    " DATA_GET
*&---------------------------------------------------------------------*
*&      Form  SET_VARIANT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SET_VARIANT .

  str_variant-report = sy-repid.
  str_variant-handle = '0001'.


ENDFORM.                    " SET_VARIANT
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DISPLAY_ALV .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*   I_INTERFACE_CHECK                 = ' '
*   I_BYPASSING_BUFFER                = ' '
*   I_BUFFER_ACTIVE                   = ' '
*   I_CALLBACK_PROGRAM                = ' '
*   I_CALLBACK_PF_STATUS_SET          = ' '
*   I_CALLBACK_USER_COMMAND           = ' '
*   I_CALLBACK_TOP_OF_PAGE            = ' '
*   I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*   I_CALLBACK_HTML_END_OF_LIST       = ' '
    I_STRUCTURE_NAME                  = 'sflight'
*   I_BACKGROUND_ID                   = ' '
    I_GRID_TITLE                      = p_title
*   I_GRID_SETTINGS                   =
*   IS_LAYOUT                         =
*   IT_FIELDCAT                       =
*   IT_EXCLUDING                      =
*   IT_SPECIAL_GROUPS                 =
*   IT_SORT                           =
*   IT_FILTER                         =
*   IS_SEL_HIDE                       =
*   I_DEFAULT                         = 'X'
    I_SAVE                            = 'X'
    IS_VARIANT                        = str_variant
*   IT_EVENTS                         =
*   IT_EVENT_EXIT                     =
*   IS_PRINT                          =
*   IS_REPREP_ID                      =
*   I_SCREEN_START_COLUMN             = 0
*   I_SCREEN_START_LINE               = 0
*   I_SCREEN_END_COLUMN               = 0
*   I_SCREEN_END_LINE                 = 0
*   I_HTML_HEIGHT_TOP                 = 0
*   I_HTML_HEIGHT_END                 = 0
*   IT_ALV_GRAPHICS                   =
*   IT_HYPERLINK                      =
*   IT_ADD_FIELDCAT                   =
*   IT_EXCEPT_QINFO                   =
*   IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*   E_EXIT_CAUSED_BY_CALLER           =
*   ES_EXIT_CAUSED_BY_USER            =
    TABLES
      T_OUTTAB                          = itab_out
* EXCEPTIONS
*   PROGRAM_ERROR                     = 1
*   OTHERS                            = 2
            .
  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


ENDFORM.                    " DISPLAY_ALV