关于sap:SAP-ABAP-报表屏幕输入字段如何实现联动效果试读版

6次阅读

共计 2480 个字符,预计需要花费 7 分钟才能阅读完成。

有敌人向我征询,SAP ABAP 报表输出字段,如何实现联动成果?

所谓联动成果,如下图所示,咱们有三个输入框,类型都是 Checkbox:

  1. 激活缓存
  2. 应用共享内存
  3. 应用二级缓存

默认状况下,应用共享内存和应用二级缓存这两个 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.
正文完
 0