系列文章目录
SAP之FPM卷一:FPM是什么
SAP之FPM卷二:FPM开发实例-创建WDA应用
SAP之FPM卷三:FPM开发实例-设想需求与优化
SAP之FPM卷五:FPM开发实例-完成主页面功能(1)
SAP之FPM卷六:FPM开发实例-完成主页面功能(2)
SAP之FPM卷七:FPM开发实例-完成主页面功能(通过EXCEL上载数据)
文章目录
- 系列文章目录
- 前言
- 一、创建表、结构
- 二、实现搜索页面
- 1.添加属性
- 2.转到方法页签
- 1. 进入INITIALIZE方法
- 2. 进入GUIBB_FORM对应GET_DEFINITION,粘贴如下代码,保存激活
- 3. 进入GUIBB_FORM对应FLUSH方法,粘贴如下代码并激活
- 5. 进入GUIBB_LIST的GET_DEFINITION
- 6. 进入工作台,可以把字段放出来看看效果了
- 7. 回到OVP:ZTEST_WDC_APPLICATION,进到LIST的UIBB中
- 8. 现在打开应用程序的网址
- 9. 继续回到代码,操作时不免有手误,我们为删除按钮做一个操作冗余空间,避免误操作直接把数据标记删除了,稍后会看到效果
- 10. 回到网页,刷新页面,点击删除按钮会出现如图对话框
- 11. 能看到查询结果里并没有数据,点击删除按钮,按理应该报错,未选择行数据才对,不能删空气吧?哈哈 展示和调整也是同理 需要先确认已选择了一条数据
- 12. 到这里搜索界面的代码已经完成,整体激活就可以了
- 总结
前言
本章创建程序所需的表、结构等,完成搜索页面的代码
一、创建表、结构
搜索界面用到的结构(搜索抬头用),并以此创建对应表类型(展示搜索结果用)
其中,项目定义与其对应描述字段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.
- 进入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. 下一章开始写主界面的代码,有点多,可能会分好几篇,稍等几天,最近有点忙