たまにはABAP ALV List その4

前回までで、ラジオボタンを使ったALV Listを作ってみたので、今回はCheck BOXを使ったALVリストを作ってみようと思いあす、はい。
しかし、のっけからなんですが・・・

Internal use onlyなんですよ、これが

今回、FIELDCATのEDITオプションを使ってみるわけなんですが、型の定義を見てみると、このオプション、「Internal use only」ってコメントに書いてあるんですな。なので、うまくいかなくても、おまいらのせいだよ〜って、独逸人は言ってるのかしら、という気がします。
実際、ちょっと挙動が変なんですよね〜このオプションを使った項目は。
今回のチェックボックスネタでは問題ないんですが、純粋な編集項目として使おうとすると、最後の変更が表示用内部テーブルに反映されない感じなんですよ。Enterをおしたり(前提としてI_GRID_SETTINGSのedt_cll_cbオプションをONにすることが必要。後述します)、リフレッシュを押したりすると反映されるんですが、項目を変更し、Enterも何も押さずに何かのボタンを押した際、I_CALLBACK_USER_COMMANDで指定されているサブルーチンで表示用内部テーブルを取得すると、その項目の変更が反映されていない。ググったりしてみたものの、これといった解法がなく、素直にクラスを使って実装しろ、っつう話なのかしら、という感じでございます。BCALV_TEST_FULLSCREEN_EDITっていうテストプログラムが普通の環境ならあるはずなので、これを本格的に解析すれば、何かわかるのかもしれませぬが・・・ちょっと動かしてみた感じでは、項目単位での編集は、なんだかうまく動かなかったし。
なので、今回のやり方で今現在うまくいったとしても、将来的にはNGになる可能性あり、ということを前提に、見てもらいたいな〜という感じです。
ちなみに、将来的にもOKじゃなきゃヤダ!!という方は、ラジオボタンのやり方と同じやり方で、チェックボックスにhotspotをつけて、おされたらOnにする、というソースコードを、I_CALLBACK_USER_COMMANDで指定されているサブルーチンで書けばOKでございます。

チェックボックス対応 変更するところ

まず、構造を変更します。ラジオボタンの表示用にICONという項目を追加していましたが、これをCHAR1桁の項目に変更です。CHECK_BOXという項目名にして、新しい構造YTEST_ALV_LIST_1を今回のテストプログラムでは、事前に作ってみました。
このままREUSE_ALV_FIELDCATALOG_MERGEにこの構造を入れてやると、当然1桁の項目として認識されてFIELDCATができます。この項目はチェックボックスだよ〜ということを明示するため、fieldcatのcheckboxオプションをOnにします。そうすると、チェックボックスとして表示されるわけですな。
表示されたチェックボックスをON/OFFできるようにするために、editオプションもONにします。先に書いたんですが、Internal use onlyが気持ち悪い人は、editオプションではなく、hotspotオプションをONにして、自前でこの項目の内容をON/OFFしてくださいませ。ついでに、表示長も4文字分にして、チェックボックスの表示がつぶれてしまうのを回避しておきます。
このままだと、チェックボックスの変更がI_CALLBACK_USER_COMMANDで指定されているサブルーチンで認識されないので、I_GRID_SETTINGSのedt_cll_cbオプションをONにします。これをしておくと、正直なんでかわからないんですが、チェックボックスの変更が表示用内部テーブルに反映されるようになったりいたします。

サンプルソースコード

上記のような修正をしまして、実行ボタンを押すと、押されているチェックボックスの数を数え、POPUP表示するようにしてみました。iconのtype-poolはいらないような気がしますが、まあついでということで・・・

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

REPORT  YTEST_ALV_LIST_1.

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

data : itab_feildcat_alv type slis_t_fieldcat_alv .

data : itab_out type TABLE OF YTEST_ALV_LIST_1.

data : str_variant like DISVARIANT.

data : pre_index like sy-tabix .


PARAMETERS p_title type sy-title .

START-OF-SELECTION .

  PERFORM data_get .

  PERFORM set_feildcat.

  PERFORM set_variant.

  PERFORM 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_1'
*   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 = 'CHECK_BOX' .

  l_tabix = sy-tabix .

  l_str_fieldcat-checkbox = 'X'.
  l_str_fieldcat-edit = 'X'.
  l_str_fieldcat-outputlen  = 4.
*  l_str_fieldcat-hotspot = 'X' .

  MODIFY itab_feildcat_alv index l_tabix
    FROM l_str_fieldcat
    TRANSPORTING checkbox edit outputlen .



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

  data : l_out type YTEST_ALV_LIST_1 .

  select * from sflight into CORRESPONDING FIELDS OF table  itab_out.


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

  data : str_grid TYPE lvc_s_glay.

  str_grid-edt_cll_cb = 'X' .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*   I_INTERFACE_CHECK                 = ' '
*   I_BYPASSING_BUFFER                = ' '
*   I_BUFFER_ACTIVE                   = ' '
     I_CALLBACK_PROGRAM                = sy-repid
     I_CALLBACK_PF_STATUS_SET          = 'SET_PF_STATUS'
     I_CALLBACK_USER_COMMAND           = 'USER_COMMAND'
*   I_CALLBACK_TOP_OF_PAGE            = ' '
*   I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*   I_CALLBACK_HTML_END_OF_LIST       = ' '
*   I_STRUCTURE_NAME                  =
*   I_BACKGROUND_ID                   = ' '
    I_GRID_TITLE                      = p_title
    I_GRID_SETTINGS                   = str_grid
*   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_VARIANT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SET_VARIANT .

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


ENDFORM.                    " SET_VARIANT
*&---------------------------------------------------------------------*
*&      Form  SET_PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SET_PF_STATUS USING rt_extab TYPE slis_t_extab.

  SET PF-STATUS 'Y_TEST_STATUS' .

ENDFORM.                    "SET_PF_STATUS
*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM USER_COMMAND
         USING
           u_c_ucomm     LIKE sy-ucomm
           u_str_field   TYPE slis_selfield.

  data : l_out type YTEST_ALV_LIST_1  .
  data: ct_checkbox type i ,
        l_message type SYMSGV .

  case u_c_ucomm .
    when 'EXE'.
      clear : ct_checkbox .

      loop at itab_out into l_out .

        if l_out-check_box = 'X' .
          ct_checkbox = ct_checkbox + 1.
        endif.

      endloop.

      l_message = ct_checkbox .

      CALL FUNCTION 'POPUP_DISPLAY_MESSAGE'
        EXPORTING
        TITEL         = 'TEST_POPUP'
          MSGID         = '00'
          MSGTY         = 'I'
          MSGNO         = '001'
         MSGV1         = 'チェックされた数'
         MSGV2         = l_message
*   MSGV3         =
*   MSGV4         =
                .

    when OTHERS .

  ENDCASE .

ENDFORM.                    "USER_COMMAND