创建FPM应用步骤 – 查询集(SET)应用

第一步 创建FPM应用

T-Code:FPM_WB – 平面布置管理器工作台

  1. SE11创建结构YTEST_S_SETLEAF(用于搜索组件);创建表类型YTEST_S_SETLEAF_T(用于列表组件)
  2. 创建feeder类:ZCL_J4TEST03_SEARCH_LIST – 此Feeder类中同时包含了搜索组件和列表组件的接口;(当然,搜索和列表组件的feeder类也可以分别创建)
  • IF_FPM_GUIBB
  • IF_FPM_GUIBB_SEARCH – 用于搜索组件
  • IF_FPM_GUIBB_LIST – 用于列表组件
  • IF_FPM_GUIBB_LIST_EXT – 用于弹出确认对话框等事件
  1. 激活实现接口 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.
  1. FPM_WB->应用程序创建向导->用于创建空白平面布置管理器应用程序的向导
  • 输入应用名称
  • 选择平面布置:概览页面
  • 修改应用程序配置/平面布置配置名称、添加描述

创建FPM

  1. 下一步 选择包及请求号
  2. 编辑配置或者从SE80中进入
  3. 创建基于搜索组件列表组件的FPM GUIBB Configurations
  • 配置中的feeder类均选择前面所常见的类

集合搜索框ZT_WDCC_J4TEST03_SEARCH

ZT_WDCC_J4TEST03_SEARCH

查询集合结果列表ZT_WDCC_J4TEST03_LIST

ZT_WDCC_J4TEST03_LIST

  1. 将7中创建的GUIBB Configurations添加到FPM应用中
  2. 选择 编辑->测试进行结果预览

ZT_WDCC_J4TEST03_LIST

预览结果

ZT_WDCC_J4TEST03_LIST

第二步 获取系统中的数据

​ 前面我们已经创建了一个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.

前台结果如下:

IF_FPM_GUIBB_LIST~GET_DATA

第三步 添加搜索条件

此时系统查询到的时所有数据,选择条件并没有效果,接下来我们给应用添加上搜索功能

在此步骤中我们调整上面的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.

结果如下:如图所示,搜索条件已经生效

IF_FPM_GUIBB_LIST~GET_DATA

第四步 给列表添加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的一个基础应用,功能简单。接下来我们将继续深入,对此应用的进行改造工作,使之能完成更强大的功能。