一、创建简单的demo
1、创建 search uibb的feeder class
2、定义search 字段
METHOD IF_FPM_GUIBB_SEARCH~GET_DEFINITION.
DATA: ls_search TYPE ysfpm_test_001,
lt_search TYPE TABLE OF ysfpm_test_001,
ls_field TYPE fpmgb_s_searchfield_descr,
lt_comp_tab TYPE abap_component_tab.
DATA: lt_fpmgb_name TYPE fpmgb_t_namevalue.
eo_field_catalog_attr ?= cl_abap_typedescr=>describe_by_data( p_data = ls_search ).
lt_comp_tab = eo_field_catalog_attr->get_components( ).
LOOP AT lt_comp_tab REFERENCE INTO DATA(lr_comp_tab).
ls_field-name = lr_comp_tab->name.
CASE ls_field-name.
WHEN 'BWKEY'.
WHEN 'WERKS'.
ENDCASE.
APPEND ls_field TO et_field_description_attr.
CLEAR: ls_field.
ENDLOOP.
ENDMETHOD.
3、创建FPM application
4、FPM_WE或者右键application + 创建更改 configuration ,添加search uibb ,输入 configuration 并配置 UIBB,填入创建的Search 的feeder class
6、添加search 的条件
7、创建 list的 feeder class ,配置输出结构的字段
METHOD if_fpm_guibb_list~get_definition.
DATA: lt_data TYPE TABLE OF ysfpm_test_001.
eo_field_catalog ?= cl_abap_typedescr=>describe_by_data( p_data = lt_data ).
ENDMETHOD.
8、创建list block,输入list 配置名称,配置 UIBB,输入创建的List Feeder Class
9、配置输出列,并配置输出描述,另加一些默认值
METHOD if_fpm_guibb_list~get_data.
DATA: lt_data TYPE TABLE OF ysfpm_test_001.
APPEND VALUE #( bwkey = 'CN01' werks = 'TPW1'
) TO lt_data.
ct_data = lt_data.
ENDMETHOD.
10、结果
二、数据交互-实现 Search UIBB 和 List UIBB的数据传递
11、之前是做默认值,list uibb 和 search uibb 之间并没有任何关联,如何通过search UIBB 得出List UIBB的结果
1)、标准的传递方式,FPM提供了 SET_VALUE 和 GET_VALUE 方法。
- search 的类中,找到process_event的方法,打上外部断点,执行前台条件。
IT_FPM_SEARCH_CRITERIA 中存放着search 中的条件参数
METHOD if_fpm_guibb_search~process_event.
DATA: lo_fpm TYPE REF TO if_fpm.
DATA(lo_fpm_para) = NEW cl_fpm_parameter( ).
IF io_event->mv_event_id = if_fpm_guibb_search=>fpm_execute_search.
" Create instance
lo_fpm = cl_fpm_factory=>get_instance( ).
" get search result
lo_fpm_para->if_fpm_parameter~set_value(
EXPORTING
iv_key = 'SEL_TAB'
iv_value = it_fpm_search_criteria
).
" raise select condition ( by range context )
lo_fpm->raise_event_by_id(
EXPORTING
iv_event_id = if_fpm_guibb_list=>gc_event_list_filter " This defines the ID of the FPM Event
io_event_data = lo_fpm_para " Property Bag
).
ENDIF.
ENDMETHOD.
2. 在list uibb 的class中get_data 方法中,使用框架提供的方法 get_value中添加如下:
METHOD if_fpm_guibb_list~get_data.
DATA: lt_search TYPE fpmgb_t_search_criteria,
lo_rtti TYPE REF TO cl_abap_datadescr,
lo_exc TYPE REF TO cx_fpmgb,
ls_selopt TYPE rsdsselopt,
ls_range TYPE rsds_frange,
lt_range TYPE TABLE OF rsds_frange,
lt_bwkey TYPE RANGE OF bukrs,
lt_werks TYPE RANGE OF werks_d.
DATA: lt_where TYPE rsds_where_tab.
DATA: lv_range TYPE string.
CASE iv_eventid->mv_event_id.
WHEN if_fpm_guibb_list=>gc_event_list_filter.
iv_eventid->mo_event_data->get_value(
EXPORTING
iv_key = 'SEL_TAB'
IMPORTING
ev_value = lt_search
* er_value = er_value
).
" get search condition
" transform condition into range context
CLEAR: lt_bwkey,lt_werks.
LOOP AT lt_search REFERENCE INTO DATA(lr_search).
TRY.
ls_selopt = cl_fpm_guibb_search_conversion=>to_abap_select_option(
is_fpm_search_row = lr_search->*
io_attr_rtti = lo_rtti
).
CATCH cx_fpmgb INTO lo_exc.
ENDTRY.
" value of range
APPEND ls_selopt TO ls_range-selopt_t.
"field name
ls_range-fieldname = lr_search->search_attribute.
"configuration range result
APPEND ls_range TO lt_range.
CASE ls_range-fieldname.
WHEN 'WERKS'.
APPEND VALUE #( sign = ls_selopt-sign
option = ls_selopt-option
low = ls_selopt-low
high = ls_selopt-high
) TO lt_werks .
WHEN 'BWKEY'.
APPEND VALUE #( sign = ls_selopt-sign
option = ls_selopt-option
low = ls_selopt-low
high = ls_selopt-high
) TO lt_bwkey.
CLEAR: ls_range.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
SELECT bwkey , werks FROM t001w INTO TABLE @DATA(lt_t001w)
WHERE werks IN @lt_werks
AND bwkey IN @lt_bwkey.
ct_data = lt_t001w[].
ev_data_changed = abap_true.
WHEN OTHERS.
ENDCASE.
ENDMETHOD.
ev_data_changed = 'X' 的语句实现数据刷新,原理和ALV相同。
2)、使用全局类的方式交互
public class