如何实现基于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
相关产品推荐
相关产品推荐

