SAP之FPM卷四:FPM开发实例- 创建程序所需表,结构并完成搜索页面主要代码

系列文章目录

SAP之FPM卷一:FPM是什么
SAP之FPM卷二:FPM开发实例-创建WDA应用
SAP之FPM卷三:FPM开发实例-设想需求与优化
SAP之FPM卷五:FPM开发实例-完成主页面功能(1)
SAP之FPM卷六:FPM开发实例-完成主页面功能(2)
SAP之FPM卷七:FPM开发实例-完成主页面功能(通过EXCEL上载数据)



前言

本章创建程序所需的表、结构等,完成搜索页面的代码


一、创建表、结构

搜索界面用到的结构(搜索抬头用),并以此创建对应表类型(展示搜索结果用)
其中,项目定义与其对应描述字段POST1是根据事业部筛选的,我这里做了单独的搜索帮助,各位可以选择自己熟悉的业务场景写DEMO程序
其中STATUS内是一个域,内设置有保存,删除,审批通过等状态
我们对于删除的处理尽量不要物理删除,标记删除即可

在这里插入图片描述
在这里插入图片描述
创建抬头表并激活(引入刚才创建的结构)
在这里插入图片描述
创建明细用结构,或者直接建表都可(我在这里选择直接建表了),明细类可参此表创建表类型
打码的数据元素建同名的就可以,记得为QUAN数据类型的字段添加货币/数量参考字段AREA_UNT
在这里插入图片描述

二、实现搜索页面

1.添加属性

进入类ZCL_TEST_DEMO_SCH_HEAD
在属性页签中添加MO_FPM TYPE REF TO IF_FPM
选择条件用MS_SEL;查询结果用MT_RESULT(参考上面所建结构表类型)
在这里插入图片描述
转到类型标签维护
先创建一个TS类型,参考底表ZTEST_DEMO_SCH
在这里插入图片描述
进入私有:添加TT_RESULT

PRIVATE SECTION.

  TYPES ts_result TYPE ztest_demo_sch .
  TYPES:
    tt_result TYPE TABLE OF ztest_demo_sch .

2.转到方法页签

1. 进入INITIALIZE方法

在这里插入图片描述
添加代码,获取对象实例
保存激活

    mo_fpm ?= cl_fpm=>get_instance( ).

2. 进入GUIBB_FORM对应GET_DEFINITION,粘贴如下代码,保存激活

  METHOD if_fpm_guibb_form~get_definition.
    DATA:
      ls_action_def  TYPE         fpmgb_s_actiondef,
      ls_fixed_value TYPE         wdr_context_attr_value,
      ls_field_descr LIKE LINE OF et_field_description,
      lt_component   TYPE         abap_component_tab.

    DATA:ls_value TYPE wdr_context_attr_value,
         lt_value TYPE wdr_context_attr_value_list.

    FIELD-SYMBOLS:
      <ls_component>  LIKE LINE OF lt_component,
      <fs_field_desc> TYPE         fpmgb_s_formfield_descr.

    eo_field_catalog ?= cl_abap_structdescr=>describe_by_data( ms_sel ).
    lt_component = eo_field_catalog->get_components( ).

*    为字段设置属性
    LOOP AT lt_component ASSIGNING <ls_component>.
      CLEAR ls_field_descr.

      ls_field_descr-name = <ls_component>-name.

      "设置必输
      IF <ls_component>-name = 'ZSYBM'.

*        事业部准备设置成下拉框 所以必须要有fixed_value
        ls_value-value = '01'.
        ls_value-text = '北京事业部'.
        APPEND ls_value TO lt_value.
        ls_value-value = '02'.
        ls_value-text = '上海事业部'.
        APPEND ls_value TO lt_value.

        ls_field_descr-fixed_values = lt_value.
        CLEAR:lt_value.

        ls_field_descr-mandatory = 'X'.
        APPEND ls_field_descr TO et_field_description.
      ELSE.
        APPEND ls_field_descr TO et_field_description.
      ENDIF.

    ENDLOOP.

*    CHANGE SYB
*    这里添加的响应事件是隐藏在事业部改变中的,所以不需要设置描述与图标
    CLEAR: ls_action_def-extended.
    ls_action_def-id = 'CHG_SYB'.
    ls_action_def-enabled = abap_true.
    APPEND ls_action_def TO et_action_definition.

  ENDMETHOD.

eo_field_catalog 生成查询的结构对象必不可少的东西,此外下面还可以设置字段属性(必填,只读,FIX_VALUE,可用等),et_field_description是方法中自带的参数,所以我们只需设置想要的效果,具体怎么实现的不用管。其中ls_field_descr内可设置的属性如下图:(可见,能设置的属性是很多的)
在这里插入图片描述
在这里插入图片描述

3. 进入GUIBB_FORM对应FLUSH方法,粘贴如下代码并激活

  METHOD if_fpm_guibb_form~flush.
    FIELD-SYMBOLS: <fs> TYPE any.

    IF it_change_log IS NOT INITIAL.
      ASSIGN is_data->* TO <fs>.
      ms_sel = <fs>.
    ENDIF.
  ENDMETHOD.
  1. 进入GUIBB_FORM的GET_DATA方法
    在这里插入图片描述
    粘贴代码并激活(请阅读我的注释,实际场景中都会用到的):
  METHOD if_fpm_guibb_form~get_data.

*  EV_FIELD_USAGE_CHANGED = ABAP_TRUE 时
*  代表字段属性改变过,比如更改某字段的只读性,必填性等等
*  在这里依然可以设置字段属性,只需LOOP内表CT_FIELD_USAGE     MODIFY或使用FIELD-SYMBOLS
*  如果我们改过字段属性,EV_FIELD_USAGE_CHANGED必须设置成ABAP_TRUE  不然更改不会生效

*  EV_ACTION_USAGE_CHANGED = ABAP_TRUE时
*  代表事件(按钮)属性更改过  LOOP内表EV_ACTION_USAGE_CHANGED即可改变按钮属性
*  ENABLED 是否可用  VISIBLE 是否显示

*  对于事件处理 可以在属性中先定义其属性名  例 GC_CHG_SYB  TYPE FPM_EVENT_ID 其默认值为 : 'CHG_SYB'

*    ET_MESSAGES是报错消息   如果在程序运行过程中遇到错误 可直接把报错消息append进这个内表

*    所有的活动都依赖于对象(IO_EVENT) 这也是此方法中自带的参数
    CASE io_event->mv_event_id.
      WHEN 'FPM_START'.
*        这是进入程序捕获的第一个且是标准的事件 

      WHEN gc_chg_syb.   "'CHG_SYB'."这里可以用属性名代替

        CLEAR:ms_sel-pspid,ms_sel-post1.

      WHEN OTHERS.
    ENDCASE.

    cs_data = ms_sel.

*    数据有更改  系统会刷新页面的值 默认必写
    ev_data_changed = abap_true.

  ENDMETHOD.

在属性页签中设置EVENT_ID,如果不设置也可用开始设置的事件标识,也就是初始值中的值
在这里插入图片描述
GUIBB_FORM的PROCESS_EVENT,粘贴如下代码
CREATE方法代码在文章末

  METHOD if_fpm_guibb_form~process_event.

    DATA:lv_result TYPE fpm_event_result.

    CASE io_event->mv_event_id.

      WHEN gc_create.   "CREATE     创建数据

        CLEAR:lv_result.
        CALL METHOD me->check_before_create
          CHANGING
            cv_result   = lv_result    " FPM 事件结果
            ct_messages = et_messages.

        CHECK lv_result NE 'FAILED'.

        CALL METHOD me->create_data( ).

      WHEN OTHERS.
    ENDCASE.

  ENDMETHOD.

5. 进入GUIBB_LIST的GET_DEFINITION

这里我们需要添加按钮(处理事件)并展示在网页,所以我们把文本和图标(icon)都添加上
粘贴如下代码并激活

  METHOD if_fpm_guibb_list~get_definition.

    DATA:
      lo_field_catalog TYPE REF TO cl_abap_structdescr,

      ls_field_descr   TYPE        fpmgb_s_listfield_descr,
      ls_action_def    TYPE        fpmgb_s_actiondef,
      ls_fpm           TYPE        fpm_s_runtime_info,
      lt_component     TYPE        abap_component_tab.


    DATA:ls_value TYPE wdr_context_attr_value,
         lt_value TYPE wdr_context_attr_value_list.

    FIELD-SYMBOLS:
      <ls_component>  LIKE LINE OF lt_component,
      <fs_field_desc> TYPE         fpmgb_s_listfield_descr.

    eo_field_catalog ?= cl_abap_structdescr=>describe_by_data( mt_result ).
    lo_field_catalog ?= eo_field_catalog->get_table_line_type( ).
    lt_component = lo_field_catalog->get_components( ).

    LOOP AT lt_component ASSIGNING <ls_component>.
      CLEAR ls_field_descr.
      ls_field_descr-name = <ls_component>-name.
      ls_field_descr-allow_sort = 'X'.
      ls_field_descr-allow_filter = 'X'.
      ls_field_descr-read_only = 'X'.
      IF ls_field_descr-name EQ 'ZSYBM'.
*        事业部设置成下拉框 必须要有fixed_value
        ls_value-value = '01'.
        ls_value-text = '北京事业部'.
        APPEND ls_value TO lt_value.
        ls_value-value = '02'.
        ls_value-text = '上海事业部'.
        APPEND ls_value TO lt_value.

        ls_field_descr-fixed_values = lt_value.
        CLEAR:lt_value.
      ENDIF.

      APPEND ls_field_descr TO et_field_description.
      CLEAR ls_field_descr.
    ENDLOOP.

*   添加EVENT(按钮)
*   查看
    CLEAR: ls_action_def-extended.
    ls_action_def-id = 'DISPLAY'.
    ls_action_def-imagesrc = '~Icon/Display'.
    ls_action_def-text = '查看'.
    ls_action_def-enabled = abap_true.
    APPEND ls_action_def TO et_action_definition.

*   调整按钮
    CLEAR: ls_action_def-extended.
    ls_action_def-id = 'ADJUST'.
    ls_action_def-imagesrc = '~Icon/EditChangedItem'.
    ls_action_def-text = '调整'.
    ls_action_def-enabled = abap_true.
    APPEND ls_action_def TO et_action_definition.

*    删除按钮
    CLEAR: ls_action_def-extended.
    ls_action_def-id = 'DELETE'.
    ls_action_def-text = '删除'.
    ls_action_def-imagesrc = '~Icon/Delete'.
    ls_action_def-enabled = abap_true.
    APPEND ls_action_def TO et_action_definition.

  ENDMETHOD.

6. 进入工作台,可以把字段放出来看看效果了

选中uibb,进入配置,或者点击UIBB右上方的扳手都可以进入
在这里插入图片描述
根据图示把三个字段添加到“当前级别”
在这里插入图片描述
按住CTRL键,添加三个字段,确定
在这里插入图片描述
选中ZSYBM元素,把其显示类型改为下拉列表框
在这里插入图片描述
如果下方没有属性页面,在图所示地方点击一下即可
在这里插入图片描述
页面往上拉,就能看到这样的效果了
在这里插入图片描述
但是这样页面不美观,我们对其适当调整下各自所占单元格,保存
在这里插入图片描述

7. 回到OVP:ZTEST_WDC_APPLICATION,进到LIST的UIBB中

找到下方添加列,还是按住CTRL,按照我们上一章中规划的顺序点击,最后确定
在这里插入图片描述
把事业部和状态(底层设置的是域)的显示类型设置为下拉列表,效果如下
列标题我们可以自行更改,自动带出来的描述不一定符合实际业务场景
在这里插入图片描述
切换到工具栏标签,添加我们在GET_DEFINITION中定义的三个按钮。
在这里插入图片描述
我们已经在方法中设置了按钮各自的图标,所以有如下效果,保存
在这里插入图片描述

8. 现在打开应用程序的网址

我们的查询界面已经和上一篇设计的样式一样了
在这里插入图片描述

在这里插入图片描述

9. 继续回到代码,操作时不免有手误,我们为删除按钮做一个操作冗余空间,避免误操作直接把数据标记删除了,稍后会看到效果

先在类的接口页签中加上IF_FPM_GUIBB_LIST_EXT这个接口,有了这个接口后,可以为删除添加一个确认对话框,内容为“是否确认删除?”,当点击了对话框中的确认按钮才会继续往下走删除的逻辑,点击取消就会停下来。
在这里插入图片描述
切换到方法页签,打开LIST_EXT的NEEDS_CONFIRMATION方法,粘贴如下代码,保存激活
其对应的其他两个方法也进去激活一下,无需填任何代码,这里面很多参数都是可以自定义的,可以简单研究一下

METHOD if_fpm_guibb_list_ext~needs_confirmation.

  DATA  lv_selected_row TYPE i.
  DATA  lo_confirm TYPE REF TO cl_fpm_confirmation_request.
  DATA  lt_confirmation_text TYPE string_table.
  DATA  lv_text TYPE string.

  IF io_event->mv_event_id = 'DELETE'.

    lv_text = '是否确认删除?'.
    APPEND lv_text TO  lt_confirmation_text.
    CREATE OBJECT lo_confirm
      EXPORTING
        it_confirmation_text = lt_confirmation_text.
    eo_confirmation_request = lo_confirm.
  ENDIF.

ENDMETHOD.

10. 回到网页,刷新页面,点击删除按钮会出现如图对话框

在这里插入图片描述

11. 能看到查询结果里并没有数据,点击删除按钮,按理应该报错,未选择行数据才对,不能删空气吧?哈哈 展示和调整也是同理 需要先确认已选择了一条数据

进入类GUIBB_LIST的PROCESS_EVENT方法中
复制粘贴如下代码

  METHOD if_fpm_guibb_list~process_event.

  DATA:
    ls_result       TYPE         ztest_demo_sch,
    ls_message      TYPE         fpmgb_s_t100_message,
    lv_selected_row TYPE         int4,
    lt_app_params   TYPE         apb_lpd_t_params,
    ls_app_param    LIKE LINE OF lt_app_params,
    lv_status       TYPE         zde_apv_status.

  CASE io_event->mv_event_id.
    WHEN gc_display_data OR gc_adjust_data OR gc_delete_data.

*   选择数据检查    必须选择一条数据
      io_event->mo_event_data->get_value(
      EXPORTING
        iv_key   = if_fpm_guibb_list=>gc_event_par_row
      IMPORTING
        ev_value = lv_selected_row ).

      IF lv_selected_row IS INITIAL OR lv_selected_row < 0.

        ls_message-msgid = 'ZTEST'.
        ls_message-msgno = '000'.
        ls_message-severity = 'E'.
        APPEND ls_message TO et_messages.
        ev_result = 'FAILED'.
        EXIT.

      ENDIF.

      CLEAR:ls_result.

*    读选取的行数据
*    读到了才进行下一步
      READ TABLE mt_result INTO ls_result INDEX lv_selected_row.
      IF sy-subrc EQ 0.
*        删除按钮
        IF io_event->mv_event_id EQ gc_delete_data.
        
*          只有保存状态才能删除
          SELECT SINGLE status INTO lv_status
            FROM ztest_demo_sch
            WHERE guid EQ ls_result-guid
            AND status EQ '4'."我设置的4为保存状态
          IF sy-subrc EQ 0.

*      把选中数据更新为删除状态
            UPDATE ztest_demo_sch SET status = '6' WHERE guid EQ ls_result-guid.
            IF sy-subrc EQ 0.
              DELETE mt_result INDEX lv_selected_row.
            ENDIF.

*          未找到保存状态的数据
          ELSE.

            ls_message-msgid = 'ZTEST'.
            ls_message-msgno = '004'.
            ls_message-severity = 'E'.
            ls_message-parameter_1 = '选择数据非保存状态,不能删除!'.
            APPEND ls_message TO et_messages.
            ev_result = 'FAILED'.
            EXIT.

          ENDIF.

*        展示按钮   调整按钮
        ELSE.
*           展示按钮
          IF io_event->mv_event_id EQ gc_display_data.

*   Set edit mode
            ls_app_param-key = 'FPM_EDIT_MODE'.
            ls_app_param-value = 'R'.    "只读模式
            APPEND ls_app_param TO lt_app_params[].

*        调整按钮   生成新版数据
          ELSEIF io_event->mv_event_id EQ gc_adjust_data.

*   Set change mode
            ls_app_param-key = 'CHANGE_MODE'.
            ls_app_param-value = 'C'.
            APPEND ls_app_param TO lt_app_params[].
*   Set edit mode
            ls_app_param-key = 'FPM_EDIT_MODE'.
            ls_app_param-value = 'E'.   "编辑模式
            APPEND ls_app_param TO lt_app_params[].

          ENDIF.

*      设置选中数据的唯一guid,为了使主页面方便获取数据
          ls_app_param-key = 'GUID'.
          ls_app_param-value = ls_result-guid.
          APPEND ls_app_param TO lt_app_params[].

*      当前是什么操作传递给主页面
          ls_app_param-key = 'ACTION'.
          ls_app_param-value = io_event->mv_event_id.
          APPEND ls_app_param TO lt_app_params[].

*      跳过初始界面
          ls_app_param-key = 'SKIP_INITIAL_SCREEN'.
          ls_app_param-value = abap_true.
          APPEND ls_app_param TO lt_app_params[].

*            跳转到主页面
          zgld_cl_fpm_navigation=>launch_webdynpro_abap(
          iv_wda  = 'ZTEST_WDA_APPLICATION'
          iv_wdac = 'ZTEST_WDC_APPLICATION'
          it_parameter = lt_app_params ).

        ENDIF.
      ENDIF.

    WHEN OTHERS.
  ENDCASE.

ENDMETHOD.

这是页面跳转的代码,自己稍微改动一下就可用

  method LAUNCH_WEBDYNPRO_ABAP.
    DATA: lr_navigate_to   TYPE REF TO  if_fpm_navigate_to,
          lr_fpm           TYPE REF TO  if_fpm,

          ls_webdynpro_fld TYPE         fpm_s_launch_webdynpro,
          ls_add_param     TYPE         apb_lpd_s_add_wd_parameters,
          lt_message       TYPE         fpm_t_t100_messages,
          ls_message       LIKE LINE OF lt_message,
          lv_error         TYPE         boole_d,
          ls_parameter     TYPE         apb_lpd_s_params,
          lt_parameter     TYPE         apb_lpd_t_params
          .
    lr_fpm = cl_fpm_factory=>get_instance( ).
    lr_navigate_to = lr_fpm->get_navigate_to( ).

    IF it_parameter IS NOT INITIAL.
      lt_parameter = it_parameter.
    ENDIF.
    ls_parameter-key = 'sap-language'.
    ls_parameter-value = sy-langu.
    APPEND ls_parameter TO  lt_parameter.

    ls_webdynpro_fld-wd_application   = iv_wda.
    ls_webdynpro_fld-wd_configuration = iv_wdac.
    ls_webdynpro_fld-system_alias     = sy-sysid.
    ls_webdynpro_fld-wd_namespace     = 'sap'.
    ls_webdynpro_fld-parameter = lt_parameter.
    IF is_additional_parameters IS INITIAL.
      ls_add_param-navigation_mode = 'EXTERNAL'.
    ELSE.
      ls_add_param = is_additional_parameters.
    ENDIF.

    lr_navigate_to->launch_webdynpro_abap(
      EXPORTING
        is_webdynpro_fields      = ls_webdynpro_fld
        is_additional_parameters = ls_add_param
      IMPORTING
        et_messages              = lt_message
        ev_error                 = lv_error ).

    LOOP AT lt_message INTO ls_message.
      lr_fpm->mo_message_manager->report_t100_message(
        EXPORTING
          io_component                 = lr_fpm
          iv_msgid                     = ls_message-msgid
          iv_msgno                     = ls_message-msgno
          iv_severity                  = ls_message-severity
          iv_lifetime                  = ls_message-lifetime
          iv_parameter_1               = ls_message-parameter_1
          iv_parameter_2               = ls_message-parameter_2
          iv_parameter_3               = ls_message-parameter_3
          iv_parameter_4               = ls_message-parameter_4 ).
    ENDLOOP.
  endmethod.

进入GUIBB_LIST的GET_DATA方法,粘贴如下代码

  METHOD if_fpm_guibb_list~get_data.

    DATA:lv_result TYPE fpm_event_result.

    CASE iv_eventid->mv_event_id.
*      获取数据
      WHEN gc_search.   "SEARCH      "查询

        CLEAR:lv_result.
*		 获取数据
        CALL METHOD me->get_data
          CHANGING
            ct_result   = mt_result
            cv_result   = lv_result
            ct_messages = et_messages.

        CHECK lv_result NE 'FAILED'.

      WHEN OTHERS.
    ENDCASE.

    ct_data = mt_result.
    ev_data_changed = abap_true.

  ENDMETHOD.

创建三个私有方法,维护参数
在这里插入图片描述

GET_DATA的参数设置,都是CHANGING
在这里插入图片描述
GET_DATA代码:

  METHOD get_data.

    DATA:ls_crit      TYPE         rsdsselopt,
         ls_frange    TYPE         rsds_frange,
         lt_frange    TYPE         rsds_frange_t,
         ls_range     TYPE         rsds_range,
         lt_range     TYPE         rsds_trange,
         lt_where     TYPE         rsds_twhere,
         ls_where     LIKE LINE OF lt_where,
         lt_where_tab TYPE         rsds_where_tab,

         ls_proj      TYPE         proj,
         ls_message   TYPE         fpmgb_s_t100_message.

*    事业部设置了必填,所以在获取数据时,事业部必不为空
    CLEAR:ls_crit,ls_frange-selopt_t.
    ls_crit-sign = 'I'.
    ls_crit-option = 'EQ'.
    ls_crit-low = ms_sel-zsybm.
    APPEND ls_crit TO ls_frange-selopt_t.
    ls_frange-fieldname = 'ZSYBM'.
    APPEND ls_frange TO lt_frange.

    IF NOT ms_sel-pspid IS INITIAL.

      SELECT SINGLE * INTO ls_proj
        FROM proj
        WHERE pspid EQ ms_sel.
      IF sy-subrc NE 0.

*        在项目表PROJ中不存在报错
        cv_result = 'FAILED'.
        ls_message-msgid = 'ZTEST'.
        ls_message-msgno = '002'.
        ls_message-severity = 'E'.
        APPEND ls_message TO ct_messages.
        EXIT.

      ENDIF.

      CLEAR:ls_crit,ls_frange-selopt_t.
      ls_crit-sign = 'I'.
      ls_crit-option = 'EQ'.
      ls_crit-low = ms_sel-pspid.
      APPEND ls_crit TO ls_frange-selopt_t.
      ls_frange-fieldname = 'PSPID'.
      APPEND ls_frange TO lt_frange.

    ENDIF.

*    设置动态SQL
    IF lt_frange IS NOT INITIAL.

      APPEND LINES OF lt_frange TO ls_range-frange_t.
      APPEND ls_range TO lt_range.
      CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_WHERE'
        EXPORTING
          field_ranges  = lt_range
        IMPORTING
          where_clauses = lt_where.

      READ TABLE lt_where INTO ls_where INDEX 1.
      lt_where_tab = ls_where-where_tab.

    ENDIF.

    SELECT * INTO CORRESPONDING FIELDS OF TABLE mt_result
      FROM ztest_demo_sch
      WHERE (lt_where_tab).
    IF mt_result IS NOT INITIAL.

      cv_result = 'OK'.

    ENDIF.

  ENDMETHOD.

CREATE_DATA无需设置参数
粘贴如下代码:

  METHOD create_data.

    DATA:lt_app_params TYPE         apb_lpd_t_params,
         ls_app_param  LIKE LINE OF lt_app_params.
*   Set change mode
    ls_app_param-key = 'CHANGE_MODE'.
    ls_app_param-value = 'C'.
    APPEND ls_app_param TO lt_app_params[].
*   Set edit mode
    ls_app_param-key = 'FPM_EDIT_MODE'.
    ls_app_param-value = 'E'.
    APPEND ls_app_param TO lt_app_params[].

    ls_app_param-key = 'SKIP_INITIAL_SCREEN'.
    ls_app_param-value = abap_true.
    APPEND ls_app_param TO lt_app_params[].

*   Transfer division for new create one
    ls_app_param-key = 'ZSYBM'.
    ls_app_param-value = ms_sel-zsybm.
    APPEND ls_app_param TO lt_app_params[].

    ls_app_param-key = 'PSPID'.
    ls_app_param-value = ms_sel-pspid.
    APPEND ls_app_param TO lt_app_params[].

    ls_app_param-key = 'ACTION'.
    ls_app_param-value = 'CREATE'.
    APPEND ls_app_param TO lt_app_params[].

    zgld_cl_fpm_navigation=>launch_webdynpro_abap(
    iv_wda  = 'ZTEST_WDA_APPLICATION'
    iv_wdac = 'ZTEST_WDC_APPLICATION'
    it_parameter = lt_app_params ).

  ENDMETHOD.

CHECK_BEFORE_CREATE方法参数
在这里插入图片描述
代码:

  METHOD check_before_create.

    DATA:ls_proj    TYPE          proj,
         lt_prps    TYPE TABLE OF prps,
         ls_message TYPE          fpmgb_s_t100_message.

    cv_result = 'OK'.

    IF ms_sel-pspid IS INITIAL.

      CLEAR:ls_message.
      ls_message-msgid = 'ZTEST'.
      ls_message-msgno = '004'.   "004在SE91中是&1 &2 &3 &4
      ls_message-severity = 'E'.
      ls_message-parameter_1 = '请输入一个项目'.
      APPEND ls_message TO ct_messages.

    ENDIF.

    SELECT SINGLE * INTO CORRESPONDING FIELDS OF ls_proj
      FROM proj
      WHERE zsybm EQ ms_sel-zsybm
      AND pspid EQ ms_sel-pspid.
    IF sy-subrc NE 0.

      CLEAR:ls_message.
      ls_message-msgid = 'ZTEST'.
      ls_message-msgno = '004'.
      ls_message-severity = 'E'.
      ls_message-parameter_1 = '项目不存在!不能创建数据'.
      APPEND ls_message TO ct_messages.

    ELSE.

      SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_prps
        FROM prps
        WHERE psphi EQ ls_proj-pspnr
        AND stufe = 3.
      IF sy-subrc NE 0.

        CLEAR:ls_message.
        ls_message-msgid = 'ZTEST'.
        ls_message-msgno = '004'.
        ls_message-severity = 'E'.
        ls_message-parameter_1 = '楼栋不存在!不能创建数据'.
        APPEND ls_message TO ct_messages.

      ENDIF.

    ENDIF.

    READ TABLE ct_messages WITH KEY severity = 'E' TRANSPORTING NO FIELDS.
    IF sy-subrc EQ 0.
      cv_result = 'FAILED'.
    ENDIF.

  ENDMETHOD.

12. 到这里搜索界面的代码已经完成,整体激活就可以了


总结

1. 关于响应按钮事件的代码写在何处的问题,点击按钮或触发事件都会走PRECESS_EVENT和GET_DATA,但PRECESS_EVENT响应先于GET_DATA
2. 在FPM中,第一次进入程序主要的方法执行顺序是 INITIALIZE(进程序只运行一次) -> GET_DEFINITION(进程序只运行一次) -> GET_DATA,点击按钮或触发事件主要的方法执行顺序是 PRECESS_EVENT -> GET_DATA ,实际业务场景中也是和上述几个方法打交道最多的,利用好这些机制可以事半功倍
3. 如果这时候从网页进入程序有错,看不到页面内容,检查一下是否类中的所有方法都是激活状态,有问题也可以在评论区讨论,看到就会回复的
4. 下一章开始写主界面的代码,有点多,可能会分好几篇,稍等几天,最近有点忙

  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ggreekn

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值