这个问题只需要重定义字段的V方法就行。如果可选的值比较少,想换成下拉框的效果,可以在P方法里面这样写。
METHOD get_p_<字段名>. CASE iv_property. WHEN if_bsp_wd_model_setter_getter=>fp_fieldtype. rv_value = cl_bsp_dlc_view_descriptor=>field_type_picklist. ENDCASE. ENDMETHOD.
回到正题,V方法的模板见下面。
METHOD get_v_<字段名>. DATA:lv_str_index TYPE string, lv_fname_prefix TYPE string, lv_idx_string TYPE string. DATA: lt_inmap TYPE if_bsp_wd_valuehelp_f4descr=>gtype_param_mapping_tab, ls_map LIKE LINE OF lt_inmap, <span style="white-space:pre"> </span>lt_outmap TYPE if_bsp_wd_valuehelp_f4descr=>gtype_param_mapping_tab . * determine prefix in case the F4 is called from a table view IF iv_index IS INITIAL. lv_fname_prefix = 'STRUCT'. "#EC NOTEXT ELSE. lv_idx_string = iv_index. CONDENSE lv_idx_string NO-GAPS. CONCATENATE 'TABLE[' lv_idx_string ']' INTO lv_fname_prefix. "#EC NOTEXT ENDIF. CONCATENATE lv_fname_prefix '<span style="font-family: Arial, Helvetica, sans-serif;"><字段名></span>' INTO ls_map-context_attr SEPARATED BY '.'. "#EC NOTEXT ls_map-f4_attr = '<span style="font-family: Arial, Helvetica, sans-serif;"><另一字段名></span>'."实现页面字段取值联动 APPEND ls_map TO:lt_outmap. CREATE OBJECT rv_valuehelp_descriptor TYPE cl_bsp_wd_valuehelp_f4descr EXPORTING iv_help_id = '<搜索帮助名>' iv_help_id_kind = if_bsp_wd_valuehelp_f4descr=>help_id_kind_comp iv_input_mapping = lt_inmap iv_output_mapping = lt_outmap iv_object_ref = me iv_trigger_submit = 'X'. ENDMETHOD.
这个是标准的把SAP的搜索帮助搬到UI上面。系统标准UI组件一般不用担心,SAP已经把这一步做好。
对于自建的组件,如果没有建搜索帮助或者其他什么原因,还有更简单粗暴的办法,直接抓数据,如下面的示例。
METHOD get_v_<字段名>. DATA lt_ddlb TYPE bsp_wd_dropdown_table. DATA ls_ddlb LIKE LINE OF lt_ddlb. DATA lt_xxx TYPE TABLE OF xxx. DATA ls_xxx LIKE LINE OF lt_xxx. DATA lr_ddlb TYPE REF TO cl_crm_uiu_ddlb. CREATE OBJECT lr_ddlb EXPORTING iv_source_type = 'T'. ls_ddlb-key = ''. ls_ddlb-value = ''. APPEND ls_ddlb TO lt_ddlb."空行可选 SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_xxx FROM xxx WHERE aaa = bbb. IF lt_xxx[] IS NOT INITIAL. SORT lt_xxx BY aaa. ENDIF. LOOP AT lt_xxx INTO ls_xxx. ls_ddlb-key = ls_xxx-ccc. ls_ddlb-value = ls_xxx-ddd. APPEND ls_ddlb TO lt_ddlb. ENDLOOP. IF sy-subrc = 0. lr_ddlb->set_selection_table( it_selection_table = lt_ddlb ). ENDIF. rv_valuehelp_descriptor = lr_ddlb. ENDMETHOD.