ABAP 基於Function ALV 實現單元格自定義搜索幫助

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.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章