选择屏幕搜索帮助
在选择屏幕事件
at SELECTION-SCREEN on VALUE-REQUEST FOR p_mon."搜索帮助 P_MON是定义的屏幕字段 PERFORM set_search_help. FORM SET_SEARCH_HELP . "step1 填充数据 DO 12 TIMES. GT_MON = sy-index. append gt_mon. ENDDO. " step2 调用F4函数 CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING * DDIC_STRUCTURE = ' ' RETFIELD = 'MONTH' * PVALKEY = ' ' DYNPPROG = SY-CPROG DYNPNR = SY-DYNNR DYNPROFIELD = 'P_MON' * STEPL = 0 * WINDOW_TITLE = * VALUE = ' ' VALUE_ORG = 'S' * MULTIPLE_CHOICE = ' ' * DISPLAY = ' ' * CALLBACK_PROGRAM = ' ' * CALLBACK_FORM = ' ' * CALLBACK_METHOD = * MARK_TAB = * IMPORTING * USER_RESET = TABLES VALUE_TAB = GT_MON[] * FIELD_TAB = * RETURN_TAB = * DYNPFLD_MAPPING = * EXCEPTIONS * PARAMETER_ERROR = 1 * NO_VALUES_FOUND = 2 * OTHERS = 3 . IF SY-SUBRC <> 0. * Implement suitable error handling here ENDIF. ENDFORM.
目前发现dialog实现搜索帮助有2种办法,一种是代码,另一种就是去SE11里创建搜索帮助,然后给dialog。
因为日期是常用的,系统有标准的日期搜索帮助,所以在dialog里日期搜索帮助我们可以直接使用。
三,代码方式
在PBO,PAI后加POV。
PROCESS BEFORE OUTPUT.
"MODULE STATUS_4000. * PROCESS AFTER INPUT. MODULE user_command_3000.
PROCESS ON VALUE-REQUEST . FIELD p_mon MODULE frm_F4_mon.
例如我这里只需要年月的搜索帮助
因为有系统标准的年月函数,所以
MODULE frm_f4_mon INPUT. DATA l_date TYPE isellist-month. l_date = sy-datum+0(6). CALL FUNCTION 'POPUP_TO_SELECT_MONTH' EXPORTING actual_month = l_date IMPORTING selected_month = p_mon EXCEPTIONS factory_calendar_not_found = 1 holiday_calendar_not_found = 2 month_not_found = 3 OTHERS = 4. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. CLEAR:l_date. ENDMODULE.
那如果没有标准的,就需要用的F4搜索帮助函数了。
例如年份的,
MODULE f4_p_year INPUT. DATA:BEGIN OF ls_year, year TYPE char4, END OF ls_year. DATA lt_year LIKE TABLE OF ls_year. ls_year-year = 1970. DO 100 TIMES. ls_year-year = ls_year-year + 1. APPEND ls_year TO lt_year. ENDDO. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'YEAR' dynpnr = sy-dynnr dynpprog = sy-repid dynprofield = 'P_YEAR' value_org = 'S' TABLES value_tab = lt_year EXCEPTIONS parameter_error = 1 no_values_found = 2 OTHERS = 3. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. " CLEAR:ls_year,lt_year.. ENDMODULE.
还有一点要注意,点击搜索帮助后,显示的值还没经过PAI,所以有时需要调用函数DYNP_VALUES_READ来读取屏幕字段值。也可以按回车,但是客户不希望这样吧,
比如这种情况,屏幕上有2个关联字段,NAME1和NAME2,当字段NAME2触发搜索帮助的时候,必须参照用户在NAME1中的录入值。由于PAI尚未被执行,屏幕字段NAME1的字符串值尚未更新到程序变量NAME1。
此时我们可以在NAME2搜索帮助module的F4函数前调用DYNP_VALUES_READ来实现。
DATA: dynpfields TYPE TABLE OF dynpread WITH HEADER LINE. CLEAR: dynpfields, dynpfields[]. dynpfields-fieldname = 'NAME1'. "填入需要读值的字段名 APPEND dynpfields. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-repid dynumb = sy-dynnr translate_to_upper = 'X' TABLES dynpfields = dynpfields EXCEPTIONS OTHERS = 9. IF sy-subrc = 0. READ TABLE dynpfields WITH KEY fieldname = 'NAME1'. name1 = dynpfields-fieldvalue. "备注 ENDIF.
二,使用现成或SE11创建的搜索帮助(非代码方式)
可以进layout里填,也可以在SE80界面填(比较方便)