You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现可复制粘贴直接运行的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等其他控件,只需调整以下部分:

  1. 控件实例化代码:在PBO模块中替换为对应控件的创建逻辑(比如cl_gui_alv_grid需要传入内表结构、字段目录等)
  2. GUI状态:根据需求添加更多功能按钮(比如ALV的刷新、导出按钮),只需在CREATE_DYNAMIC_PF_STATUS中追加对应的函数条目即可
  3. 屏幕元素:大部分控件仅需自定义容器,若需其他元素可在CREATE_DYNAMIC_DYNPRO中添加对应定义

注意事项

  • 确保用户有足够权限执行RS_SET_STATUS、RS_CREATE_DYNPRO等函数(通常开发权限即可)
  • 动态生成的屏幕和GUI状态为临时对象,程序退出后不会残留系统中

内容的提问来源于stack exchange,提问作者Sandra Rossi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:50:16