たまには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