无法在 ABAP 选择屏幕中编辑参数?

问题描述

这是代码

REPORT zwof_test_parameters.

ParaMETERS:
  p_a  TYPE c LENGTH 10 OBLIGATORY,p_b  TYPE c LENGTH 10,p_c  TYPE c LENGTH 10.

AT SELECTION-SCREEN ON p_a.
  p_b = p_a.
  p_c = p_a.

AT SELECTION-SCREEN ON p_b.
  p_c = p_b.

START-OF-SELECTION.
  WRITE:/ p_a,p_b,p_c.

END-OF-SELECTION.
  1. 当我填充 p_a 时,b_p 和 p_c 也被填充了 - 到目前为止一切都很好。如果我更改 p_b,p_c 的值也应设置为该值。 - 但这不会发生。为什么?

  2. 为什么 p_b 的代码也会因事件“on p_a”而触发。填充参数p_b会触发吗?

  3. 如果我在“at selection-screen on p_b”事件中放置一个“call selection-screen 1000”,它就可以工作。但是现在 F8 不会触发“开始选择”。为什么?

解决方法

当您在选择屏幕中按 Enter 键时,您将始终通过 “在选择屏幕”事件。你与否都无所谓 完全改变了领域。这些事件由 selection-screen 将值从前端传递给参数。 有一个例外:当参数是初始的并且不是 自上次触发事件以来发生了变化。在这种情况下它 不会将值传递给参数。

(需要注意的一点:是否为 程序中的事件,或您编写它们的顺序。这 selection-screen 将从屏幕的顶部到底部执行此操作 每个输入字段。另外:当你有这些事件时不会触发 未填充的强制参数)

因此,由于异常,第一种情况似乎有效。但是如果你 首先为“p_b”放入一些东西,而不是为“p_a”放入一些东西 (当然,由于强制性参数,您不能这样做)。 “p_c”没有 从“p_b”获取值,因为它在“on p_c”时被覆盖 从前端传递值。

对于第三点: 当您在那里调用选择屏幕时,它会跳过“on p_c”事件并转到 您调用的选择屏幕。所以事件没有通过 参数,似乎一切都很好。除了没有。 “在 selection-screen" 事件也会在你按下 F8 时被触发。所以它到达 再次“呼叫选择屏幕 1000”并转到屏幕。还 你只是重叠屏幕。注意你必须如何按 F3 好几次想回车的时候就输入一堆。

所以我已经解决了这个问题,这就是我想出的:

data: gv_a type char10.
data: gv_b type char10.
data: gv_c type char10.

parameters: p_a  type c length 10.
parameters: p_b  type c length 10.
parameters: p_c  type c length 10.

initialization.
  gv_a = p_a.
  gv_b = p_b.
  gv_c = p_c.

at selection-screen on p_b.
  if p_a <> gv_a.
    p_b = p_a.
  endif.

at selection-screen on p_c.
  if p_b <> gv_b.
    p_c = p_b.
  elseif p_a <> gv_a.
    p_c = p_a.
  endif.

at selection-screen.
  gv_a = p_a.
  gv_b = p_b.
  gv_c = p_c.

基本上我记得上次它引发的参数值 “在选择屏幕”事件并检查参数是否 被改变了。如果是,我按照定义复制它。还有,我只 从前端传递后更改参数。我喜欢 在“on [param]”事件中执行此操作。这样我就可以改变 在屏幕上订购,不要搞乱逻辑。

而且我不知道当 p_a 和 p_b 都是 改变了。不管怎样,也许你学到了一些关于选择屏幕的知识 从此。