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

如何实现基于screen0/screen1的SALV控件切换及返回按钮功能?

SALV基于Screen0/Screen1切换显示的解决方案

核心问题根因

用cl_gui_container=>screen0或screen1创建SALV时,WRITE space仅在首次执行时会激活对应屏幕的上下文环境。后续切换时,单纯创建新SALV实例不会触发SAP自动切换屏幕上下文,导致SALV2的容器无法被渲染到前台。

无需自定义Dynpro的解决方法

方法1:用CALL SCREEN强制切换屏幕上下文

不需要创建自定义屏幕,直接调用SAP标准空屏幕切换上下文,切换前务必释放旧SALV实例避免容器冲突:

* SALV1按钮的切换逻辑
IF lo_salv1 IS BOUND.
  lo_salv1->free( ). " 释放旧SALV实例,释放容器占用
  CLEAR lo_salv1.
ENDIF.

gv_target_salv = 'SALV2'. " 全局变量标记要创建的SALV类型
CALL SCREEN 1. " 强制切换到screen1上下文

* 屏幕1的PBO事件逻辑(可通过全局变量控制创建)
MODULE screen_1_pbo OUTPUT.
  IF gv_target_salv = 'SALV2'.
    cl_salv_table=>factory(
      EXPORTING r_container = cl_gui_container=>screen1
      IMPORTING r_salv_table = lo_salv2
      CHANGING t_table = gt_salv2_data->*
    ).
    lo_salv2->display( ).
  ENDIF.
ENDMODULE.

* SALV2返回按钮逻辑
IF lo_salv2 IS BOUND.
  lo_salv2->free( ).
  CLEAR lo_salv2.
ENDIF.
gv_target_salv = 'SALV1'.
CALL SCREEN 0. " 切回screen0

方法2:复用screen0容器,动态替换SALV实例

放弃使用screen1,始终基于screen0创建SALV,每次切换时销毁当前实例再重建新的:

* 切换到SALV2的按钮事件方法
METHOD switch_to_salv2.
  IF lo_current_salv IS BOUND.
    lo_current_salv->free( ). " 释放当前SALV,清空容器
    CLEAR lo_current_salv.
  ENDIF.

  * 创建并显示SALV2
  cl_salv_table=>factory(
    EXPORTING r_container = cl_gui_container=>screen0
    IMPORTING r_salv_table = lo_current_salv
    CHANGING t_table = gt_salv2_data->*
  ).
  lo_current_salv->display( ).
  WRITE space. " 触发屏幕刷新
ENDMETHOD.

* 返回SALV1的逻辑同理,销毁SALV2后重建SALV1

关键注意点

  • 必须调用free()方法释放旧SALV实例,否则容器会被占用,新SALV无法正常渲染。
  • 若坚持使用screen0和screen1两个容器,CALL SCREEN是唯一无需自定义Dynpro的方案,它能强制切换屏幕上下文,让SAP识别到要渲染的目标屏幕容器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 13:25:00