共计 2480 个字符,预计需要花费 7 分钟才能阅读完成。
有敌人向我征询,SAP ABAP 报表输出字段,如何实现联动成果?
所谓联动成果,如下图所示,咱们有三个输入框,类型都是 Checkbox:
- 激活缓存
- 应用共享内存
- 应用二级缓存
默认状况下,应用共享内存和应用二级缓存这两个 Checkbox 处于禁用状态。只有当咱们选中 激活缓存
时,这两个 Checkbox 才容许编辑:
当咱们选中了应用共享内存和应用二级缓存后,如果将激活缓存的勾去掉:
那么应用共享内存和应用二级缓存的两个勾也应该主动被去掉。
这就是 Checkbox 的联动成果,即 Checkbox 1 须要管制 Checkbox 2 和 3 的编辑状态。同时,如果 Checkbox 1 被勾销抉择,那么 Checkbox 2 和 3 的选中状态也应该被勾销。
本文余下局部介绍这个联动成果的具体实现。
咱们首先把待实现的联动逻辑用自然语言书写进去:
- 如果激活缓存未勾选,则应用共享内存和应用二级缓存也不能勾选,并且不可编辑
- 如果激活缓存被勾选,则应用共享内存和应用二级缓存能够别离编辑
剩下的事件就是把下面两句话用 ABAP 编程语言实现进去。
咱们首先应用 PARAMETERS
关键字定义三个输出参数,如下图红色高亮下划线所示。每个输出参数的类型都是 abap_bool, 再通过 AS CHECKBOX 将其润饰成 checkbox 外观。其中 p_active 即文本为 激活缓存
的输出参数,因为在它上的点击还要负责起另外两个输出参数的联动成果,所以这个参数咱们还必须加上 USER-COMMAND p
来润饰,这里的 p 能够任意换成其余的字母。
咱们双击上图的 TEXT-001 和 002,在弹出的页面能够给这两个 Text Symbol 保护对应的文本,如下图所示:
点击 Selection Texts
,给三个输出参数也别离保护对应的文本:
- P_ACTIVE: 激活缓存
- P_PER_SA:应用二级缓存
- P_SHM:应用共享内存
上面咱们须要把这两段伪代码,用 ABAP 编程实现。
- 如果激活缓存未勾选,则应用共享内存和应用二级缓存也不能勾选,并且不可编辑
- 如果激活缓存被勾选,则应用共享内存和应用二级缓存能够别离编辑
因为 P_SHM 和 P_PER_SA 的可编辑性是受 P_ACTIVE 动态控制的,这个动态控制的代码,须要书写在 AT SELECTION-SCREEN OUTPUT
这个事件上,也就是抉择屏幕行将输入之前。
咱们首先用一个 ABAP 变量 lv_screen_input 来保护 P_SHM 和 P_PER_SA 的可编辑状态,1 代表能够编辑,0 代表不可编辑,即禁用状态。
如果 P_ACTIVE 值为 abap_false, 阐明其未被选中,则 P_SHM 和 P_PER_SA 应该处于禁用状态,lv_screen_input 应该被赋值为 0.
计算了 lv_screen_input 之后,咱们还应设法将这个值的内容,写入 P_SHM 和 P_PER_SA 对应的数据结构中去。
这个数据结构就是上图 LOOP AT SCREEN 循环里的 screen. 能够看到,拜访这个变量之前咱们并没有显式申明它,双击第 30 行的 screen,就能够在 ABAP 数据字段里看到这个全局的数据对象:
ABAP 报表里每个输出参数都有一个专属于本人的 SCREEN 变量,通过 NAME 来辨别。
咱们能够在第 31 行设置断点。运行时当执行到这行语句时,阐明以后 screen 变量的 name 字段值曾经为 P_SHM 了,阐明 LOOP AT SCREEN 循环体内正在解决 P_SHM 输出参数了,此时把 0 赋给 screen 变量的 input 字段,而后通过 ABAP 关键字 MODIFY SCREEN, 让这个赋值操作即时失效。
本例残缺的源代码:
*&---------------------------------------------------------------------*
*& Report /IWFND/R_COF_CACHE_SETTINGS
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zscreen_test.
DATA lv_screen_input TYPE i.
SELECTION-SCREEN BEGIN OF BLOCK bl_all WITH FRAME TITLE TEXT-001.
PARAMETERS p_active TYPE abap_bool AS CHECKBOX USER-COMMAND p.
SELECTION-SCREEN BEGIN OF BLOCK bl_details WITH FRAME TITLE TEXT-002.
PARAMETERS p_shm TYPE abap_bool AS CHECKBOX.
PARAMETERS p_per_sa TYPE abap_bool AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK bl_details.
SELECTION-SCREEN END OF BLOCK bl_all.
AT SELECTION-SCREEN OUTPUT.
IF (p_active = abap_false).
lv_screen_input = 0.
p_shm = abap_false.
p_per_sa = abap_false.
ELSE.
lv_screen_input = 1.
ENDIF.
LOOP AT SCREEN.
IF screen-name = 'P_SHM'.
screen-input = lv_screen_input.
screen-color = 6.
MODIFY SCREEN.
ENDIF.
IF screen-name = 'P_PER_SA'.
screen-input = lv_screen_input.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
START-OF-SELECTION.
WRITE:/ '缓存激活状态:', p_active.
WRITE:/ '共享内存状态:', p_shm.
WRITE:/ '二级缓存状态:', p_per_sa.