如何实现可复制粘贴直接运行的SAP控件框架Demo分享?
如何让带Dynpro控件的ABAP Demo一键复制运行?
对于需要依赖Dynpro屏幕、GUI状态的ABAP控件Demo(比如cl_gui_textedit、cl_gui_alv_grid、cl_gui_html_viewer),可以通过动态生成所有非代码元素的方式,把整个Demo浓缩到单一REPORT中,让用户复制粘贴后直接运行,无需手动创建屏幕、GUI状态等对象。
通用实现思路
核心是用ABAP标准API在程序运行时动态创建:
- 带自定义控件的Dynpro屏幕
- 包含功能按钮的GUI状态
- 屏幕流逻辑(PBO/PAI绑定)
所有依赖的非代码元素都由代码自动生成,无需用户手动操作。
针对cl_gui_textedit的完整可运行Demo
以下是改写后的完整代码,复制后直接执行即可:
REPORT zdemo_cl_gui_textedit_dynamic. DATA: go_custom_container TYPE REF TO cl_gui_custom_container, go_textedit TYPE REF TO cl_gui_textedit, lv_dynpro_num TYPE sy-dynnr VALUE '100', lv_status TYPE sy-pfkey VALUE '0100'. START-OF-SELECTION. " 1. 动态创建GUI状态(含EXIT退出按钮) PERFORM create_dynamic_pf_status USING lv_status. " 2. 动态创建Dynpro屏幕(含自定义控件) PERFORM create_dynamic_dynpro USING lv_dynpro_num. " 3. 调用动态生成的屏幕 CALL SCREEN lv_dynpro_num. *&---------------------------------------------------------------------* *& Form CREATE_DYNAMIC_PF_STATUS *&---------------------------------------------------------------------* FORM create_dynamic_pf_status USING iv_status TYPE sy-pfkey. DATA: lt_functions TYPE TABLE OF rsmpe, ls_function TYPE rsmpe. " 定义EXIT按钮属性 ls_function-fcode = 'EXIT'. ls_function-text = '退出(E)'. ls_function-type = 'E'. " 退出命令类型 ls_function-icon = 'ICON_EXIT'. APPEND ls_function TO lt_functions. " 动态创建GUI状态 CALL FUNCTION 'RS_SET_STATUS' EXPORTING status = iv_status program = sy-repid TABLES functions = lt_functions EXCEPTIONS status_not_activated = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE 'GUI状态创建失败' TYPE 'E'. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form CREATE_DYNAMIC_DYNPRO *&---------------------------------------------------------------------* FORM create_dynamic_dynpro USING iv_dynpro_num TYPE sy-dynnr. DATA: lt_elements TYPE TABLE OF dynpobj, ls_element TYPE dynpobj, lt_flowlog TYPE TABLE OF dynpflow, ls_flowlog TYPE dynpflow. " 1. 创建屏幕元素:自定义控件CUSTOM_CONTAINER ls_element-name = 'CUSTOM_CONTAINER'. ls_element-type = 'C'. " 自定义控件类型 ls_element-length = 80. ls_element-rows = 15. ls_element-left = 10. ls_element-top = 5. APPEND ls_element TO lt_elements. " 2. 设置屏幕流逻辑(PBO/PAI) " PBO模块 ls_flowlog-statement = 'PROCESS BEFORE OUTPUT.'. APPEND ls_flowlog TO lt_flowlog. ls_flowlog-statement = ' MODULE _0100_PBO.'. APPEND ls_flowlog TO lt_flowlog. " PAI模块(退出命令) ls_flowlog-statement = 'PROCESS AFTER INPUT.'. APPEND ls_flowlog TO lt_flowlog. ls_flowlog-statement = ' MODULE _0100_PAI AT EXIT-COMMAND.'. APPEND ls_flowlog TO lt_flowlog. " 3. 动态创建Dynpro屏幕 CALL FUNCTION 'RS_CREATE_DYNPRO' EXPORTING program = sy-repid dynpro = iv_dynpro_num title = '动态生成的TextEdit演示' TABLES dynpobj = lt_elements dynpflow = lt_flowlog EXCEPTIONS duplicate = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE 'Dynpro屏幕创建失败' TYPE 'E'. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Module _0100_PBO OUTPUT *&---------------------------------------------------------------------* MODULE _0100_pbo OUTPUT. SET PF-STATUS lv_status. IF go_textedit IS NOT BOUND. CREATE OBJECT go_custom_container EXPORTING container_name = 'CUSTOM_CONTAINER'. CREATE OBJECT go_textedit EXPORTING parent = go_custom_container. ENDIF. ENDMODULE. *&---------------------------------------------------------------------* *& Module _0100_PAI INPUT *&---------------------------------------------------------------------* MODULE _0100_pai INPUT. IF sy-ucomm = 'EXIT'. SET SCREEN 0. ENDIF. ENDMODULE.
适配其他控件的方法
对于cl_gui_alv_grid、cl_gui_html_viewer等其他控件,只需调整以下部分:
- 控件实例化代码:在PBO模块中替换为对应控件的创建逻辑(比如
cl_gui_alv_grid需要传入内表结构、字段目录等) - GUI状态:根据需求添加更多功能按钮(比如ALV的刷新、导出按钮),只需在
CREATE_DYNAMIC_PF_STATUS中追加对应的函数条目即可 - 屏幕元素:大部分控件仅需自定义容器,若需其他元素可在
CREATE_DYNAMIC_DYNPRO中添加对应定义
注意事项
- 确保用户有足够权限执行
RS_SET_STATUS、RS_CREATE_DYNPRO等函数(通常开发权限即可) - 动态生成的屏幕和GUI状态为临时对象,程序退出后不会残留系统中
内容的提问来源于stack exchange,提问作者Sandra Rossi
相关产品推荐
相关产品推荐

