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