たまにはABAP ALV List その2

引き続き。今回は、ラジオボタンを表示するところまでいってみましょう。

REUSE_ALV_FIELDCATALOG_MERGEを使ってみる

前回のソースコードでは、FIELDCATをI_STRUCTURE_NAMEで自動生成したのだけれど、ラジオボタンを表示しようと思うと、自動生成されるFIELDCATじゃ足りないんですよ。ということで、REUSE_ALV_FIELDCATALOG_MERGEを使うことにしあす。
この汎用モジュールは、基本的にREUSE_ALV_GRID_DISPLAYのI_STRUCTURE_NAMEパラメータと一緒で、構造を渡してやるとFIELDCATを自動生成し、その結果をCHANGINGパラメータに返します。この返ってきたFIELDCATに細工して、REUSE_ALV_GRID_DISPLAYに渡してやることで、ラジオボタンを表示させませう、というお話ですな。
ラジオボタンの表示のさせ方は、
・構造にCHAR4桁の項目を追加する
・表示用データの該当項目部分に、表示させたいアイコンのコードを放り込む
・該当項目のFIELDCATのiconパラメータをONにする
こんな感じ。

じゃ、やってみるべ。第二回ソースコード

まず、構造「YTEST_ALV_LIST」をABAPディクショナリでつくりあす。最初に「ICON」というCHAR4桁の項目を作り、その後ろはsflightの項目と一緒にします。
その構造を使って、REUSE_ALV_FIELDCATALOG_MERGEを呼び出し、FIELDCATを自動生成します。FORM SET_FEILDCATがその部分で、 I_STRUCTURE_NAMEにYTEST_ALV_LISTを指定し、自動生成したFIELDCATをitab_feildcat_alvに入れています。
itab_feildcat_alvの中身そのままだと、ICONの項目は4桁の文字としてFEILDCATが作られています。そこで、ICONの項目に対するFEILDCATパラメータ内iconパラメータに「X」を入れ、アイコン表示を指定します。これで、表示する内部テーブル内の値に応じた、アイコンを表示する設定になります。
で、表示用の内部テーブル側に、表示するアイコンの値を入れます。
FORM DATA_GETをちょっと変え、データの取得結果は、構造「YTEST_ALV_LIST」を参照したitab_outに入れます。項目iconは、各レコードブランクになっているので、ラジオボタンを表示させるコードをセットします。

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

REPORT  YTEST_ALV_LIST.


type-pools:slis .
type-POOLS:icon .

data : itab_feildcat_alv type slis_t_fieldcat_alv .

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_feildcat.

  PERFORM set_variant.

  PERFORM display_alv .

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

  data : l_out type YTEST_ALV_LIST .

  select * from sflight into CORRESPONDING FIELDS OF table  itab_out.

  l_out-icon = ICON_WD_RADIO_BUTTON_EMPTY .

  MODIFY itab_out
    FROM l_out
    TRANSPORTING icon
    WHERE icon is INITIAL .


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                       = itab_feildcat_alv
*   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
*&---------------------------------------------------------------------*
*&      Form  SET_FEILDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SET_FEILDCAT .

  data: l_str_fieldcat type slis_fieldcat_alv ,
         l_tabix like sy-tabix .

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
     EXPORTING
       I_PROGRAM_NAME               = sy-repid
*   I_INTERNAL_TABNAME           =
       I_STRUCTURE_NAME             = 'YTEST_ALV_LIST'
*   I_CLIENT_NEVER_DISPLAY       = 'X'
*   I_INCLNAME                   =
*   I_BYPASSING_BUFFER           =
*   I_BUFFER_ACTIVE              =
    CHANGING
      CT_FIELDCAT                  = itab_feildcat_alv
* EXCEPTIONS
*   INCONSISTENT_INTERFACE       = 1
*   PROGRAM_ERROR                = 2
*   OTHERS                       = 3
            .
  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  READ TABLE itab_feildcat_alv INTO l_str_fieldcat
    WITH KEY fieldname = 'ICON' .

  l_tabix = sy-tabix .

  l_str_fieldcat-icon = 'X'.

  MODIFY itab_feildcat_alv index l_tabix
    FROM l_str_fieldcat
    TRANSPORTING icon .


ENDFORM.                    " SET_FEILDCAT