创建FPM应用-查询
创建FPM应用步骤 – 查询集(SET)应用
第一步 创建FPM应用
T-Code:FPM_WB – 平面布置管理器工作台
- SE11创建结构
YTEST_S_SETLEAF
(用于搜索组件);创建表类型YTEST_S_SETLEAF_T
(用于列表组件)- 创建feeder类:ZCL_J4TEST03_SEARCH_LIST – 此Feeder类中同时包含了搜索组件和列表组件的接口;(当然,搜索和列表组件的feeder类也可以分别创建)
- IF_FPM_GUIBB
- IF_FPM_GUIBB_SEARCH – 用于搜索组件
- IF_FPM_GUIBB_LIST – 用于列表组件
- IF_FPM_GUIBB_LIST_EXT – 用于弹出确认对话框等事件
- 激活实现接口 GET_DEFINITION 的方法:
IF_FPM_GUIBB_SEARCH~GET_DEFINITION
METHOD IF_FPM_GUIBB_SEARCH~GET_DEFINITION.
* 通过这种方式可以在FPM_WB中进行字段的选择,选中*搜索组件*中需要作为选择条件的字段
eo_field_catalog_attr ?= cl_abap_structdescr=>describe_by_name( 'YTEST_S_SETLEAF' ).
ENDMETHOD.
IF_FPM_GUIBB_LIST~GET_DEFINITION
METHOD IF_FPM_GUIBB_LIST~GET_DEFINITION.
* 通过这种方式可以在FPM_WB中进行字段的选择,选中*列表组件*中需要显示的字段
eo_field_catalog ?= CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_NAME( 'YTEST_S_SETLEAF_T' ).
ENDMETHOD.
- FPM_WB->应用程序创建向导->用于创建空白平面布置管理器应用程序的向导
- 输入应用名称
- 选择平面布置:概览页面
- 修改应用程序配置/平面布置配置名称、添加描述
- 下一步 选择包及请求号
- 编辑配置或者从SE80中进入
- 创建基于搜索组件和列表组件的FPM GUIBB Configurations
- 配置中的feeder类均选择前面所常见的类
集合搜索框:ZT_WDCC_J4TEST03_SEARCH
查询集合结果列表:ZT_WDCC_J4TEST03_LIST
- 将7中创建的GUIBB Configurations添加到FPM应用中
- 选择 编辑->测试进行结果预览
预览结果
第二步 获取系统中的数据
前面我们已经创建了一个FPM应用,但是这个应用只有一个无数据的显示界面,下面我们开始读取系统中的数据进行显示
相关表:setleaf/setheader
相关方法:IF_FPM_GUIBB_LIST~GET_DATA
METHOD IF_FPM_GUIBB_LIST~GET_DATA.
FIELD-SYMBOLS: <ft_data> TYPE YTEST_S_SETLEAF_T.
DATA: lt_data TYPE YTEST_S_SETLEAF_T.
CASE IV_EVENTID->MV_EVENT_ID.
*if_fpm_guibb_search=>fpm_execute_search
WHEN 'FPM_EXECUTE_SEARCH'."点击执行,开始读取集合数据。这里我们只读取Z开头的集合
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_data
FROM setleaf as i INNER JOIN setheader as h
ON h~SETCLASS = i~SETCLASS AND h~SUBCLASS = i~SUBCLASS AND h~SETNAME = i~SETNAME
WHERE i~SETNAME LIKE 'Z%'.
WHEN ''.
WHEN OTHERS.
ENDCASE.
CT_DATA = LT_DATA.
EV_DATA_CHANGED = 'X'. "当CT_DATA中的数据发生变化时,EV_DATA_CHANGED必须为X,否则前台数据不会刷新。
ENDMETHOD.
前台结果如下:
第三步 添加搜索条件
此时系统查询到的时所有数据,选择条件并没有效果,接下来我们给应用添加上搜索功能
在此步骤中我们调整上面的SQL位置,放到一个单独的method:GET_RESULT_DATA
新增属性(全局变量/私有变量)
- MT_RESULT Instance Attribute Private Type YTEST_S_SETLEAF_T 查询集合列表
- MO_FPM Instance Attribute Private Type Ref To IF_FPM
新增三个method
- SET_SELECT_OPTION – 获取屏幕输入搜索条件,拼接where
- CHECK_VALUE_VALID – 校验前台数据合理性
- GET_RESULT_DATA – 执行SQL
METHOD:SET_SELECT_OPTION
IT_FPM_SEARCH_CRITERIA Importing Type FPMGB_T_SEARCH_CRITERIA
IO_SEARCH_CONVERSION Importing Type Ref To IF_FPM_GUIBB_SEARCH_CONVERSION
ET_SELECTION Exporting Type /BOBF/T_FRW_QUERY_SELPARAM
ET_WHERE Exporting Type TABLE
ER_RANGE Exporting Type Ref To DATA
ER_RANGE2 Exporting Type Ref To DATA
METHOD set_select_option.
DATA:lr_range_tab_ref TYPE REF TO data,
ls_selection TYPE /bobf/s_frw_query_selparam,
lt_selection TYPE /bobf/t_frw_query_selparam,
lt_where TYPE STANDARD TABLE OF string.
FIELD-SYMBOLS: <fs_search_criteria> TYPE fpmgb_s_search_criteria,
<fs_ranget> TYPE ANY TABLE,
<fs_value> TYPE data,
<fs_range> TYPE data.
LOOP AT it_fpm_search_criteria ASSIGNING <fs_search_criteria>.
AT NEW search_attribute.
io_search_conversion->create_abap_range_ref(
EXPORTING
iv_search_attribute = <fs_search_criteria>-search_attribute
IMPORTING
er_range_tab_ref = lr_range_tab_ref ).
io_search_conversion->fpm_attribute_into_abap_range(
EXPORTING
iv_search_attribute = <fs_search_criteria>-search_attribute
IMPORTING
et_range_tab_ref = lr_range_tab_ref ).
IF lr_range_tab_ref IS NOT INITIAL.
ASSIGN lr_range_tab_ref->* TO <fs_ranget>.
LOOP AT <fs_ranget> ASSIGNING <fs_range>.
CLEAR: ls_selection .
ls_selection-attribute_name = <fs_search_criteria>-search_attribute.
ASSIGN COMPONENT 'SIGN' OF STRUCTURE <fs_range> TO <fs_value>.
CHECK sy-subrc = 0.
ls_selection-sign = <fs_value>.
ASSIGN COMPONENT 'OPTION' OF STRUCTURE <fs_range> TO <fs_value>.
CHECK sy-subrc = 0.
ls_selection-option = <fs_value>.
ASSIGN COMPONENT 'LOW' OF STRUCTURE <fs_range> TO <fs_value>.
IF sy-subrc = 0.
ls_selection-low = <fs_value>.
ENDIF.
ASSIGN COMPONENT 'HIGH' OF STRUCTURE <fs_range> TO <fs_value>.
IF sy-subrc = 0.
ls_selection-high = <fs_value>.
ENDIF.
IF ls_selection-low IS NOT INITIAL.
APPEND ls_selection TO lt_selection.
ENDIF.
ENDLOOP.
CALL METHOD /srmerp/cl_bopf_helper=>create_where_clause_from_param
EXPORTING
it_selection_parameters = lt_selection
iv_check_user = abap_false
IMPORTING
et_where_clause = lt_where
er_range = er_range
etr_range = er_range2.
et_selection = lt_selection.
et_where = lt_where.
ENDIF.
ENDAT.
ENDLOOP.
ENDMETHOD.
METHOD:CHECK_VALUE_VALID
参数 | 类型 | 传递值 | 可选 | 键入方法 | 关联类型 | 缺省值 | 描述 |
---|---|---|---|---|---|---|---|
IT_SELECTION | Importing | X | Type | /BOBF/T_FRW_QUERY_SELPARAM | |||
IT_WHERE | Importing | X | Type | TABLE | |||
IV_MAX_NUM_RESULTS | Importing | X | Type | I | |||
IR_RANGE | Importing | Type Ref To | DATA | ||||
IR_RANGE2 | Importing | Type Ref To | DATA | ||||
EV_RESULT | Exporting | Type | FPM_EVENT_RESULT | FPM 事件结果 | |||
ET_MESSAGES | Exporting | Type | FPMGB_SEARCH_T_T100_MESSAGE |
METHOD check_value_valid.
* DATA:"lt_dyncs_rp TYPE TABLE OF yrre_cds_sd_pay,
* lt_key TYPE /bobf/t_frw_key,
* ls_key TYPE /bobf/s_frw_key,
* lv_where TYPE string,
* lt_where TYPE TABLE OF string.
*
* FIELD-SYMBOLS:<fs_value> TYPE data,
* <ft_range> LIKE /srmerp/cl_bopf_helper=>gt_range,
* <ls_range> TYPE data.
*
* ASSIGN ir_range->* TO <ls_range>.
* ASSIGN ir_range2->* TO <ft_range>.
*
* IF <ls_range> IS ASSIGNED.
* ASSIGN ('<LS_RANGE>-AOXM') TO FIELD-SYMBOL(<fr_aoxm>).
* IF <fr_aoxm> IS ASSIGNED AND <fr_aoxm> IS NOT INITIAL.
*
* ELSE.
*
* ENDIF.
* ENDIF.
ENDMETHOD.
METHOD:GET_RESULT_DATA
参数 | 类型 | 传递值 | 可选 | 键入方法 | 关联类型 | 缺省值 | 描述 |
---|---|---|---|---|---|---|---|
IT_SELECTION | Importing | X | Type | /BOBF/T_FRW_QUERY_SELPARAM | |||
IT_WHERE | Importing | X | Type | TABLE | |||
IV_MAX_NUM_RESULTS | Importing | X | Type | I | |||
IR_RANGE | Importing | Type Ref To | DATA | ||||
IR_RANGE2 | Importing | Type Ref To | DATA | ||||
ET_RESULT | Exporting | Type | YTEST_S_SETLEAF_T | 查询集合列表 |
METHOD get_result_data.
DATA:lt_root TYPE YTEST_S_SETLEAF_T,
lt_key TYPE /bobf/t_frw_key,
ls_key TYPE /bobf/s_frw_key,
lv_where TYPE string,
lt_where TYPE TABLE OF string.
FIELD-SYMBOLS:<fs_value> TYPE data,
<ft_range> LIKE /srmerp/cl_bopf_helper=>gt_range,
<ls_range> TYPE data.
ASSIGN ir_range->* TO <ls_range>.
ASSIGN ir_range2->* TO <ft_range>.
LOOP AT it_where INTO lv_where.
REPLACE FIRST OCCURRENCE OF '<LS_RANGE>' IN lv_where WITH '@<LS_RANGE>'.
REPLACE FIRST OCCURRENCE OF 'SETNAME' IN lv_where WITH 'h~SETNAME'.
APPEND lv_where TO lt_where.
ENDLOOP.
"变量名不能变
* DATA(ls_abs_xm) = zcl_tr_abs_helper=>get_abs_xm( iv_uname = sy-uname ).
* DATA(lr_hcode_c) = zcl_tr_abs_helper=>get_hcode_c_all( it_bukrs = ls_abs_xm-bukrs_all ).
* DATA(lv_sql) = | ( HCODE IN @LR_HCODE_C ) |.
* "
SELECT * INTO CORRESPONDING FIELDS OF TABLE @lt_root
UP TO @iv_max_num_results ROWS
FROM setleaf as i INNER JOIN setheader as h
ON h~SETCLASS = i~SETCLASS AND h~SUBCLASS = i~SUBCLASS AND h~SETNAME = i~SETNAME
WHERE (lt_where).
IF sy-subrc = 0.
mt_result = lt_root.
ENDIF.
ENDMETHOD.
method:IF_FPM_GUIBB_LIST~GET_DATA – 此方法内容发生了变化
METHOD IF_FPM_GUIBB_LIST~GET_DATA.
FIELD-SYMBOLS: <ft_data> TYPE YTEST_S_SETLEAF_T.
DATA: lt_data TYPE YTEST_S_SETLEAF_T.
CASE IV_EVENTID->MV_EVENT_ID.
WHEN 'FPM_EXECUTE_SEARCH'."点击执行,开始读取集合数据。这里我们只读取Z开头的集合
* SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_data
* FROM setleaf as i INNER JOIN setheader as h
* ON h~SETCLASS = i~SETCLASS AND h~SUBCLASS = i~SUBCLASS AND h~SETNAME = i~SETNAME
* WHERE i~SETNAME LIKE 'Z%'.
CT_DATA = mt_result.
WHEN ''.
WHEN OTHERS.
ENDCASE.
EV_DATA_CHANGED = 'X'. "当CT_DATA中的数据发生变化时,EV_DATA_CHANGED必须为X,否则前台数据不会刷新。
ENDMETHOD.
结果如下:如图所示,搜索条件已经生效
第四步 给列表添加Filter
修改 IF_FPM_GUIBB_LIST~GET_DEFINITION 内容,添加允许排序/过滤等条件
然后在页面配置过程中选择合适的排序/过滤方式
METHOD IF_FPM_GUIBB_LIST~GET_DEFINITION.
DATA:lo_structdescr TYPE REF TO cl_abap_structdescr, "设置界面字段
lo_abap_str TYPE REF TO cl_abap_structdescr,
lt_comp_tab TYPE abap_component_tab, "界面字段名
ls_comp_tab TYPE abap_componentdescr. "界面字段名
FIELD-SYMBOLS:<fs_field_des> TYPE fpmgb_s_listfield_descr.
eo_field_catalog ?= CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_NAME( 'YTEST_S_SETLEAF_T' ).
" 界面字段的设置
lo_structdescr ?= eo_field_catalog->get_table_line_type( ).
LOOP AT lo_structdescr->components INTO DATA(ls_component).
APPEND INITIAL LINE TO et_field_description ASSIGNING <fs_field_des>.
<fs_field_des>-name = ls_component-name.
<fs_field_des>-allow_sort = abap_true.
<fs_field_des>-allow_aggregation = abap_false.
<fs_field_des>-allow_filter = abap_true.
<fs_field_des>-null_as_blank = abap_true.
<fs_field_des>-read_only = abap_true.
CASE <fs_field_des>-name.
WHEN 'Field1' or 'PLSTA' or 'PLTYP'.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDMETHOD.
结语
至此,一个完整的FPM应用就完成了,此应用只是FPM的一个基础应用,功能简单。接下来我们将继续深入,对此应用的进行改造工作,使之能完成更强大的功能。