1.實現ALV 報表自定義搜索幫助
效果如下:
點擊搜索幫助按鈕,彈出框
雙擊值並填入單元格內
2.實現思路
2.1定義變量以及F4搜索幫助自定義類,並實現
" 定義ALV變量 DATA: gr_grid TYPE REF TO cl_gui_alv_grid, "用於綁定ALV事件 gs_stbl TYPE lvc_s_stbl. "用於列穩定刷新 DATA: gt_event TYPE slis_t_event WITH HEADER LINE. "定義事件 CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. "F4 METHODS: handle_f4 FOR EVENT onf4 OF cl_gui_alv_grid IMPORTING e_fieldname "列名 es_row_no "行號 er_event_data et_bad_cells. ENDCLASS. "方法實施 CLASS lcl_event_receiver IMPLEMENTATION. METHOD handle_f4. * 窗口時間參數的自定義f4檢索幫助 CASE e_fieldname. WHEN 'EMPLOYEE'. "內表字段名稱 PERFORM f4_help_employee USING e_fieldname "列名 es_row_no "行號 er_event_data. ENDCASE. * 設置後,alv穩定刷新 CLEAR:gs_stbl. gs_stbl-row = 'X'." 基於行的穩定刷新 gs_stbl-col = 'X'." 基於列穩定刷新 CALL METHOD gr_grid->refresh_table_display EXPORTING is_stable = gs_stbl. ENDMETHOD. "HANDLE_F4 ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
2.2在調用ALV函數前添加如下代碼
gt_event-name = 'CALLER_EXIT'."需要添加,不加會有問題 gt_event-form = 'FM_BUTTON'. APPEND gt_event.
完整實現代碼如下:
1 *&---------------------------------------------------------------------* 2 *& Report ZTEST_010 3 *&---------------------------------------------------------------------* 4 *&Function ALV 單元格搜索幫助 5 *&單元格是否可編輯僅適用於 Function (REUSE_ALV_GRID_DISPLAY_LVC) 6 *&---------------------------------------------------------------------* 7 REPORT ztest_010. 8 9 TABLES: spfli. 10 TYPE-POOLS: slis,kcde . 11 12 "ALV 展示結構 13 TYPES : BEGIN OF typ_alv , 14 carrid TYPE spfli-carrid , "航線代碼 15 connid TYPE spfli-connid , "航班連接編號 16 cityfrom TYPE spfli-cityfrom , "起飛城市 17 airpfrom TYPE spfli-airpfrom , "始發機場 18 cityto TYPE spfli-cityto , "到達城市 19 airpto TYPE spfli-airpto , "目標機場 20 fltime TYPE spfli-fltime , "航班時間 21 deptime TYPE spfli-deptime , "出發時間 22 arrtime TYPE spfli-arrtime , "到達時間 23 distance TYPE spfli-distance , "距離 24 distid TYPE spfli-distid , "大距離單位(公里,英里) 25 fltype TYPE spfli-fltype , "航班類型 26 employee TYPE char40, "人 27 field_style TYPE lvc_t_styl, "控制字段可編輯的參數 28 sel TYPE c, 29 END OF typ_alv . 30 31 " 定義ALV變量 32 DATA: gs_layout TYPE lvc_s_layo, "ALV 控制: 佈局結構 33 gt_fieldcat TYPE lvc_t_fcat, "字段目錄 34 gs_fieldcat TYPE lvc_s_fcat, 35 gv_repid TYPE repid. "當前程序名 36 DATA: gr_grid TYPE REF TO cl_gui_alv_grid, "用於綁定ALV事件 37 gs_stbl TYPE lvc_s_stbl. "用於列穩定刷新 38 DATA: gt_event TYPE slis_t_event WITH HEADER LINE. 39 40 41 " 內表和工作區 42 DATA : gs_alv TYPE typ_alv, 43 gt_alv TYPE TABLE OF typ_alv. 44 45 "定義結構中表結構 46 DATA:gs_edit TYPE lvc_s_styl, 47 gt_edit TYPE lvc_t_styl. "單元格的類型表 48 49 50 51 "定義事件 52 CLASS lcl_event_receiver DEFINITION. 53 PUBLIC SECTION. 54 "F4 55 METHODS: 56 handle_f4 FOR EVENT onf4 OF cl_gui_alv_grid 57 IMPORTING e_fieldname "列名 58 es_row_no "行號 59 er_event_data 60 et_bad_cells. 61 ENDCLASS. 62 63 "方法實施 64 CLASS lcl_event_receiver IMPLEMENTATION. 65 METHOD handle_f4. 66 67 * 窗口時間參數的自定義f4檢索幫助 68 CASE e_fieldname. 69 WHEN 'EMPLOYEE'. "內表字段名稱 70 PERFORM f4_help_employee USING e_fieldname "列名 71 es_row_no "行號 72 er_event_data. 73 ENDCASE. 74 * 設置後,alv穩定刷新 75 CLEAR:gs_stbl. 76 gs_stbl-row = 'X'." 基於行的穩定刷新 77 gs_stbl-col = 'X'." 基於列穩定刷新 78 CALL METHOD gr_grid->refresh_table_display 79 EXPORTING 80 is_stable = gs_stbl. 81 ENDMETHOD. "HANDLE_F4 82 83 ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION 84 85 86 *--------選擇條件 87 SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE TEXT-001. 88 89 SELECT-OPTIONS:s_carrid FOR spfli-carrid , "航線 90 s_connid FOR spfli-connid."航班 91 SELECTION-SCREEN END OF BLOCK bl01. 92 93 94 *&---------------------------------------------------------------------* 95 *& EVENT AT INITIALIZATION 96 *&---------------------------------------------------------------------* 97 INITIALIZATION . 98 99 AT SELECTION-SCREEN OUTPUT . 100 101 *----------------------------------------------------------------------* 102 * EVENT OCCURS AFTER THE SELECTION SCREEN HAS BEEN PROCESSED 103 *----------------------------------------------------------------------* 104 START-OF-SELECTION. 105 106 PERFORM frm_getdata . "獲取數據 107 PERFORM frm_set_layout . "設置顯示佈局 108 PERFORM frm_set_all_fieldcat."設置字段目錄 109 PERFORM frm_display_data. "展示ALV 110 111 END-OF-SELECTION. 112 113 114 *&---------------------------------------------------------------------* 115 *& Form frm_getdata 116 *&---------------------------------------------------------------------* 117 *& text 118 *&---------------------------------------------------------------------* 119 *& --> p1 text 120 *& <-- p2 text 121 *&---------------------------------------------------------------------* 122 FORM frm_getdata . 123 SELECT * 124 FROM spfli 125 WHERE spfli~carrid IN @s_carrid "航線 126 AND spfli~connid IN @s_connid"航班 127 INTO CORRESPONDING FIELDS OF TABLE @gt_alv. 128 IF sy-subrc = 0. 129 SORT gt_alv BY carrid connid. 130 ENDIF. 131 132 LOOP AT gt_alv INTO gs_alv. 133 IF gs_alv-carrid = 'AZ'. 134 gs_alv-employee = '單值,不需要搜索'. 135 gs_edit-fieldname = 'EMPLOYEE'."不可編輯字段名 136 gs_edit-style = cl_gui_alv_grid=>mc_style_disabled. "設置爲不可編輯 137 APPEND gs_edit TO gs_alv-field_style . 138 ENDIF. 139 MODIFY gt_alv FROM gs_alv. 140 ENDLOOP. 141 ENDFORM. 142 *&---------------------------------------------------------------------* 143 *& Form frm_display_data 144 *&---------------------------------------------------------------------* 145 *& ALV 展示 146 *&---------------------------------------------------------------------* 147 *& --> p1 text 148 *& <-- p2 text 149 *&---------------------------------------------------------------------* 150 FORM frm_display_data . 151 152 gt_event-name = 'CALLER_EXIT'."需要添加,不加會有問題 153 gt_event-form = 'FM_BUTTON'. 154 APPEND gt_event. 155 156 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' 157 EXPORTING 158 i_callback_program = sy-repid 159 i_callback_pf_status_set = 'FRM_PF_STATUS' "狀態 160 i_callback_user_command = 'FRM_ALV_USER_COMMAN' 161 is_layout_lvc = gs_layout "佈局 162 it_events = gt_event[] "事件 163 it_fieldcat_lvc = gt_fieldcat "字段顯示 164 i_save = 'A' 165 TABLES 166 t_outtab = gt_alv "顯示的內表 167 EXCEPTIONS 168 program_error = 1 169 OTHERS = 2. 170 171 IF sy-subrc <> 0. 172 MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 173 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. 174 ENDIF. 175 ENDFORM. 176 177 *&---------------------------------------------------------* 178 *& Form FRM_PF_STATUS 179 *&---------------------------------------------------------* 180 * ALV STATUS 181 *----------------------------------------------------------* 182 FORM frm_pf_status USING rt_extab TYPE slis_t_extab. 183 SET PF-STATUS 'STANDARD' EXCLUDING rt_extab. "排除按鈕 184 ENDFORM. "FRM_PF_STATUS 185 186 187 *&---------------------------------------------------------* 188 *& Form FRM_ALV_USER_COMMAN 189 *&---------------------------------------------------------* 190 * ALV USER-COMMAND 191 *----------------------------------------------------------* 192 FORM frm_alv_user_comman USING r_ucomm TYPE sy-ucomm 193 rs_selfield TYPE slis_selfield ."刷新 194 195 DATA: lr_grid TYPE REF TO cl_gui_alv_grid. 196 CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' 197 IMPORTING 198 e_grid = lr_grid. 199 CALL METHOD lr_grid->check_changed_data . 200 CASE r_ucomm. "功能按鈕 201 WHEN 'SAVE' . 202 ENDCASE. 203 ENDFORM. "USER_COMMAND 204 205 *&---------------------------------------------------------------------* 206 *& Form frm_set_fieldcat 207 *&---------------------------------------------------------------------* 208 *& 字段屬性 209 *&---------------------------------------------------------------------* 210 *& --> p1 text 211 *& <-- p2 text 212 *&---------------------------------------------------------------------* 213 FORM frm_set_fieldcat USING p_val1 214 p_val2 215 p_val3 216 p_val4 217 p_val5. 218 gs_fieldcat-fieldname = p_val1 . "字段名稱 219 gs_fieldcat-ref_table = p_val2. "參考表 220 gs_fieldcat-ref_field = p_val3. "參考字段 221 gs_fieldcat-coltext = p_val4. "描述文本 222 gs_fieldcat-edit = p_val5. "整列可編輯 223 IF gs_fieldcat-fieldname = 'EMPLOYEE'. 224 gs_fieldcat-f4availabl = 'X'. "字段尾部,添加搜索幫助的的小按鈕 225 ENDIF. 226 APPEND gs_fieldcat TO gt_fieldcat. 227 CLEAR gs_fieldcat. 228 ENDFORM. 229 230 "用於添加單元格搜索幫助按鈕 231 FORM fm_button USING e_grid TYPE slis_data_caller_exit. 232 DATA: lr_event_receiver TYPE REF TO lcl_event_receiver, 233 lt_f4 TYPE lvc_t_f4, 234 ls_f4 TYPE lvc_s_f4. 235 236 IF gr_grid IS INITIAL. 237 CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' 238 IMPORTING 239 e_grid = gr_grid. 240 ENDIF. 241 242 * 設置enter事件 243 CALL METHOD gr_grid->register_edit_event 244 EXPORTING 245 i_event_id = cl_gui_alv_grid=>mc_evt_enter 246 EXCEPTIONS 247 error = 1 248 OTHERS = 2. 249 250 "註冊事件,設置,觸發F4的搜索幫助 251 DATA(lr_event_receiver2) = NEW lcl_event_receiver( ) ."新語法 252 * CREATE OBJECT lr_event_receiver. 253 SET HANDLER lr_event_receiver2->handle_f4 FOR gr_grid. "綁定CLASS事件到ALV 254 255 ls_f4-fieldname = 'EMPLOYEE'. "窗口時間參數(需要定義F4幫助按鈕的字段) 256 ls_f4-register = 'X'. 257 ls_f4-getbefore = 'X'. 258 ls_f4-chngeafter = 'X'. 259 INSERT ls_f4 INTO TABLE lt_f4. 260 261 CALL METHOD gr_grid->register_f4_for_fields 262 EXPORTING 263 it_f4 = lt_f4[]. 264 ENDFORM. 265 266 "填充搜索幫助值,並展示回填 267 FORM f4_help_employee USING p_fieldname TYPE lvc_fname 268 p_row_no TYPE lvc_s_roid 269 er_event_data TYPE REF TO cl_alv_event_data. 270 DATA: lt_return TYPE STANDARD TABLE OF ddshretval, 271 ls_return TYPE ddshretval. 272 DATA :lv_eqart TYPE eqart."技術對象類型 273 274 CLEAR gs_alv. 275 READ TABLE gt_alv INTO gs_alv INDEX p_row_no-row_id."獲取當前行數據 276 IF sy-subrc = 0. 277 IF gs_alv-employee IS INITIAL. 278 IF p_fieldname = 'EMPLOYEE'. "展示內表字段 279 TYPES :BEGIN OF ty_aa, "搜索幫助結構 280 employee TYPE char40, 281 zaaa TYPE char40, 282 END OF ty_aa. 283 284 DATA:lt_vs TYPE TABLE OF ty_aa, "搜索幫助表 285 ls_vs TYPE ty_aa. 286 CLEAR:lt_vs,lt_return. 287 288 "每個單元格對應搜索幫助值可根據條件查找,不固定 289 ls_vs-zaaa = '10086'. 290 ls_vs-employee = '搜索幫助值1'. 291 APPEND ls_vs TO lt_vs . 292 293 ls_vs-zaaa = '10010'. 294 ls_vs-employee = '搜索幫助值2'. 295 APPEND ls_vs TO lt_vs . 296 SORT lt_vs BY employee . 297 298 CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' 299 EXPORTING 300 * DDIC_STRUCTURE = ' ' 301 retfield = 'EMPLOYEE' "這個參數爲幫助表中返回到選擇屏幕的字段的參數 302 * PVALKEY = ' ' 303 dynpprog = sy-repid "當前程序,不寫會有問題 304 dynpnr = sy-dynnr "當前屏幕,不寫會有問題 305 " dynprofield = 'P_PERSON' "選擇屏幕上需要加F4幫助的字段 306 value_org = 'S' "默認爲C但是此處不用S不行 307 callback_program = sy-repid 308 " callback_form = 'CB_FORM' 309 TABLES 310 value_tab = lt_vs "F4幫助值的表 311 return_tab = lt_return 312 EXCEPTIONS 313 parameter_error = 1 314 no_values_found = 2 315 OTHERS = 3. 316 IF sy-subrc = 0. 317 ****將選的值填入ALV字段中 318 READ TABLE gt_alv INTO gs_alv INDEX p_row_no-row_id. 319 IF sy-subrc = 0. 320 READ TABLE lt_return INTO ls_return INDEX 1. 321 IF ls_return-fieldval IS NOT INITIAL. 322 gs_alv-employee = ls_return-fieldval. 323 CLEAR:ls_return. 324 ENDIF. 325 MODIFY gt_alv FROM gs_alv INDEX p_row_no-row_id TRANSPORTING employee. 326 ENDIF. 327 "X表示事件已經處理,不會去調取系統標準搜索幫助,(不填寫參考字段參考表,也可以忽略這個標識) 328 er_event_data->m_event_handled = 'X'. 329 ENDIF. 330 ENDIF. 331 ENDIF. 332 ENDIF. 333 334 ENDFORM. 335 *&---------------------------------------------------------------------* 336 *& Form FRM_SET_LAYOUT 337 *&---------------------------------------------------------------------* 338 *& ALV佈局 339 *&---------------------------------------------------------------------* 340 FORM frm_set_layout . 341 gs_layout-cwidth_opt = 'X'."優化列寬度 342 gs_layout-zebra = 'X'."條紋展示 343 gs_layout-box_fname = 'SEL'."選擇列 344 gs_layout-stylefname = 'FIELD_STYLE'. 345 ENDFORM. 346 *&---------------------------------------------------------------------* 347 *& Form FRM_SET_ALL_FIELDCAT 348 *&---------------------------------------------------------------------* 349 *& 設置字段目錄 350 *&---------------------------------------------------------------------* 351 *& --> p1 text 352 *& <-- p2 text 353 *&---------------------------------------------------------------------* 354 FORM frm_set_all_fieldcat . 355 PERFORM frm_set_fieldcat USING 'CARRID ' 'SPFLI' 'CARRID ' '航線代碼' ''. 356 PERFORM frm_set_fieldcat USING 'CONNID ' 'SPFLI' 'CONNID ' '航班連接編號' ''. 357 PERFORM frm_set_fieldcat USING 'CITYFROM ' 'SPFLI' 'CITYFROM' '起飛城市' ''. 358 PERFORM frm_set_fieldcat USING 'AIRPFROM ' 'SPFLI' 'AIRPFROM' '始發機場' ''. 359 PERFORM frm_set_fieldcat USING 'CITYTO ' 'SPFLI' 'CITYTO ' '到達城市' ''. 360 PERFORM frm_set_fieldcat USING 'AIRPTO ' 'SPFLI' 'AIRPTO ' '目標機場' ''. 361 PERFORM frm_set_fieldcat USING 'FLTIME ' 'SPFLI' 'FLTIME ' '航班時間' ''. 362 PERFORM frm_set_fieldcat USING 'DEPTIME ' 'SPFLI' 'DEPTIME ' '出發時間' ''. 363 PERFORM frm_set_fieldcat USING 'ARRTIME ' 'SPFLI' 'ARRTIME ' '到達時間' ''. 364 PERFORM frm_set_fieldcat USING 'DISTANCE ' 'SPFLI' 'DISTANCE' '距離' ''. 365 PERFORM frm_set_fieldcat USING 'DISTID ' 'SPFLI' 'DISTID ' '大距離單位(公里,英里)' ''. 366 PERFORM frm_set_fieldcat USING 'FLTYPE ' 'SPFLI' 'FLTYPE ' '航班類型' ''. 367 PERFORM frm_set_fieldcat USING 'EMPLOYEE ' 'SPFLI' 'EMPLOYEE' '人物自定義幫助' 'X'. 368 ENDFORM.