ABAP:ALV中自定义搜索帮助
生活随笔
收集整理的這篇文章主要介紹了
ABAP:ALV中自定义搜索帮助
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如果希望ALV中某字段具有搜索幫助,第一種辦法當然是對表中某字段的引用,設置ref_table、ref_field,將自動觸發該字段所帶的搜索幫助。
可不可以直接設置Searh Help呢?應該不可以,找遍了field catalog的結構也沒發現有可以設置的字段。
第二種辦法就是利用自定義代碼來實現ALV的搜索幫助,顯然它的功能更強大、更靈活。針對在OO ALV中實現搜索幫助,其主要步驟有:
1,在ALV的事件處理類中添加個Method,其DEFINITION如下:
handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid
????? IMPORTING e_fieldname es_row_no er_event_data. 其IMPLEMENTATION中就是我們希望執行的代碼,用來彈出可選擇對話框。e_fieldname代表用戶點擊了ALV的哪個字段來觸發搜索幫助,es_row_no代表了當前行信息, es_row_no-row_id就是ALV中內表記錄的INDEX。er_event_data代表了當前用戶對ALV進行了哪些編輯的信息。在Method的最后,記得加上 er_event_data->m_event_handled = 'X'. 通知系統搜索事件處理完畢,這樣就不會調用系統標準的Search Help。 2,那就是對需要自定義搜索幫助的字段,設置其field catalog時: ls_fieldcat-f4availabl = 'X'. 這一步往往容易被忽略。 3,在創建ALV對象之后,要對需要自定義搜索幫助的字段進行注冊。 DATA: lt_f4 TYPE lvc_t_f4 WITH HEADER LINE. CLEAR lt_f4.
????lt_f4-fieldname = 'FIELD_NAME'.
??? lt_f4-register = 'X'.
??? lt_f4-chngeafter = 'X'.
??? APPEND lt_f4.
??? CALL METHOD mygrid->register_f4_for_fields
????? EXPORTING
??????? it_f4 = lt_f4[]. lvc_s_f4中的字段getbefore和changeafter應該代表是否觸發data_changed事件。 然后我們為其指定事件處理類(假設go_evt_receiver是自定義事件處理類的一個對象): CREATE OBJECT go_evt_receiver. SET HANDLER go_evt_receiver->handle_onf4 FOR go_alv_grid. 至此,主要的設置步驟都介紹完畢。 下面貼一段Handle_onf4的代碼供參考: METHOD handle_onf4.
??? DATA:?ls_modi TYPE lvc_s_modi, lt_ret_tab TYPE TABLE OF ddshretval WITH HEADER LINE. FIELD-SYMBOLS <modtab> TYPE lvc_t_modi. IF e_fieldname = 'FIELD_NAME'. "我們自定義搜索的字段名
????? READ TABLE gt_alv_data INDEX es_row_no-row_id.
????? CHECK sy-subrc = 0.
**? 這里可以添加代碼以對lt_hitlist內表進行填充
????? CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
??????? EXPORTING
????????? retfield??????? = 'HIT_FIELD'
????????? value_org?????? = 'S'
??????? TABLES
????????? value_tab?????? = lt_hitlist
????????? return_tab????? = lt_ret_tab
??????? EXCEPTIONS
????????? parameter_error = 1
????????? no_values_found = 2
????????? OTHERS????????? = 3.
????? IF sy-subrc?= 0.
**??Update the value in ALV cell
????????READ TABLE lt_ret_tab INDEX 1.
????????IF sy-subrc = 0. " User didn't cancel
????????? ls_modi-row_id = es_row_no-row_id.
????????? ls_modi-fieldname = e_fieldname.
????????? ls_modi-value = lt_ret_tab-fieldval.
????????? ASSIGN er_event_data->m_data->* TO <modtab>.
????????? APPEND ls_modi TO <modtab>.
????????ENDIF.
????? ENDIF. **??Inform ALV Grid that event 'onf4' has been processed
????? er_event_data->m_event_handled = 'X'.
??? ENDIF.
? ENDMETHOD.??????????????????? "handle_onf4
????? IMPORTING e_fieldname es_row_no er_event_data. 其IMPLEMENTATION中就是我們希望執行的代碼,用來彈出可選擇對話框。e_fieldname代表用戶點擊了ALV的哪個字段來觸發搜索幫助,es_row_no代表了當前行信息, es_row_no-row_id就是ALV中內表記錄的INDEX。er_event_data代表了當前用戶對ALV進行了哪些編輯的信息。在Method的最后,記得加上 er_event_data->m_event_handled = 'X'. 通知系統搜索事件處理完畢,這樣就不會調用系統標準的Search Help。 2,那就是對需要自定義搜索幫助的字段,設置其field catalog時: ls_fieldcat-f4availabl = 'X'. 這一步往往容易被忽略。 3,在創建ALV對象之后,要對需要自定義搜索幫助的字段進行注冊。 DATA: lt_f4 TYPE lvc_t_f4 WITH HEADER LINE. CLEAR lt_f4.
????lt_f4-fieldname = 'FIELD_NAME'.
??? lt_f4-register = 'X'.
??? lt_f4-chngeafter = 'X'.
??? APPEND lt_f4.
??? CALL METHOD mygrid->register_f4_for_fields
????? EXPORTING
??????? it_f4 = lt_f4[]. lvc_s_f4中的字段getbefore和changeafter應該代表是否觸發data_changed事件。 然后我們為其指定事件處理類(假設go_evt_receiver是自定義事件處理類的一個對象): CREATE OBJECT go_evt_receiver. SET HANDLER go_evt_receiver->handle_onf4 FOR go_alv_grid. 至此,主要的設置步驟都介紹完畢。 下面貼一段Handle_onf4的代碼供參考: METHOD handle_onf4.
??? DATA:?ls_modi TYPE lvc_s_modi, lt_ret_tab TYPE TABLE OF ddshretval WITH HEADER LINE. FIELD-SYMBOLS <modtab> TYPE lvc_t_modi. IF e_fieldname = 'FIELD_NAME'. "我們自定義搜索的字段名
????? READ TABLE gt_alv_data INDEX es_row_no-row_id.
????? CHECK sy-subrc = 0.
**? 這里可以添加代碼以對lt_hitlist內表進行填充
????? CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
??????? EXPORTING
????????? retfield??????? = 'HIT_FIELD'
????????? value_org?????? = 'S'
??????? TABLES
????????? value_tab?????? = lt_hitlist
????????? return_tab????? = lt_ret_tab
??????? EXCEPTIONS
????????? parameter_error = 1
????????? no_values_found = 2
????????? OTHERS????????? = 3.
????? IF sy-subrc?= 0.
**??Update the value in ALV cell
????????READ TABLE lt_ret_tab INDEX 1.
????????IF sy-subrc = 0. " User didn't cancel
????????? ls_modi-row_id = es_row_no-row_id.
????????? ls_modi-fieldname = e_fieldname.
????????? ls_modi-value = lt_ret_tab-fieldval.
????????? ASSIGN er_event_data->m_data->* TO <modtab>.
????????? APPEND ls_modi TO <modtab>.
????????ENDIF.
????? ENDIF. **??Inform ALV Grid that event 'onf4' has been processed
????? er_event_data->m_event_handled = 'X'.
??? ENDIF.
? ENDMETHOD.??????????????????? "handle_onf4
總結
以上是生活随笔為你收集整理的ABAP:ALV中自定义搜索帮助的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP FICO PA 模拟题
- 下一篇: ABAP:List中回写CheckBox