当我点击“İptal”按钮时,我希望它跳过必填字段。
但我不想控制没有“必填”的必填字段。我想在屏幕截图等文本框中看到复选标记。
通常,当没有必填字段时,“İptal”按钮会调用不同的屏幕。
注意:屏幕是标准选择屏幕。
我解决这个问题的方式不是在布局中使字段成为强制性字段,而是在您的代码中创建一些条件示例我的输入输出字段名为 ekpo-ebeln:
IF ekpo-ebeln IS INITIAL.
CASE ok_code.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'BACK'.
CALL SCREEN 100.
ENDCASE.
MESSAGE 'Fill both of the fields' TYPE 'I'.
这解决了我的问题,并且有效!
您需要做的是为屏幕上具有“退出”功能类型的按钮分配一个功能代码。
然后您可以AT SELECTION-SCREEN ON EXIT-COMMAND
在报告中使用该事件(我假设您在谈论报告,因为您谈论选择屏幕)。在验证屏幕上的字段之前,系统会调用此事件。在这里,您可以实现所有必要的逻辑。
但是,我能想到的唯一方法是将标准 GUI 状态%_00
从程序复制RSSYSTDB
到您的程序并添加您的功能代码并使其成为“退出”类型。然后,AT SELECTION-SCREEN OUTPUT
您可以使用该SET PF-STATUS
命令覆盖标准 GUI 状态。(否则如果你给你的按钮分配了一个功能码,但它不会受到特殊处理来触发ON EXIT-COMMAND
事件)。
编辑:
我刚刚尝试过它并且它有效,但在将功能代码分配给按钮时(使用SELECTION-SCREEN PUSHBUTTON
)无效。相反,我必须将功能代码添加为工具栏上的按钮。然后它触发AT SELECTION-SCREEN OUTPUT
事件)。
编辑 2:( 刚刚将我的评论从下面复制到这里,因为需要注意)顺便说一下,当我复制它时,我必须将 %_00 GUI 状态重命名为其他名称。否则,即使在 SET PF-STATUS 中指定了 FROM PROGRAM,它仍然会使用 RSSYSTDB 中的旧 GUI 状态。
您可以执行以下技巧来实现您的要求。
先决条件:
首先也是最重要的!不要使用子句声明您的参数OBLIGATORY
。此约束在选择屏幕处理期间覆盖所有内部检查和验证。
在这里,我假设您使用标准 GUI 状态并在应用程序工具栏上激活按钮。标准执行按钮具有标准ONLI
fcode,而 İptal 具有IPT
.
要操作目标字段,我们需要分配给它们的 ID:
PARAMETERS: p_matnr TYPE mara-matnr MODIF ID OBL,
p_mtart TYPE mara-mtart MODIF ID OBL.
解决方案详情:
声明 AT SELECTION-SCREEN OUTPUT 事件,其中字段的属性将被编辑。
AT SELECTION-SCREEN OUTPUT.
SET PF-STATUS 'SSCR'. "<<- our GUI-status
LOOP AT SCREEN.
IF screen-group1 = 'OBL'.
screen-required = '2'. "<<- default obligatory-like field appearance
MODIFY SCREEN.
ENDIF.
ENDLOOP.
IF sy-ucomm = 'ONLI'. "<<- making fields really obligatory
LOOP AT SCREEN.
IF screen-group1 = 'OBL'.
screen-required = '1'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
处理 AT SELECTION-SCREEN 事件中的功能代码。
AT SELECTION-SCREEN.
IF sy-ucomm = 'ONLI'.
LEAVE TO SCREEN 1000.
ENDIF.
IF sy-ucomm = 'IPT'.
"<do whatever you want>
ENDIF.
说明:在程序启动时,您的字段的required
属性设置为 2,这意味着它们具有强制性刻度,但实际上并不像 obligatory 那样,即这正是您所需要的。您可以完美地按下您的 İptal 按钮并运行任何其他程序。
但是,如果您想启用强制约束,您只需按标准执行,它会再次调用我们的选择屏幕 ( LEAVE TO SCREEN 1000
),但使用另一个 ONLI fcode,其required
属性被覆盖,瞧!在填写这些字段之前,不可能更进一步。