如果使用了TABBED BLOCK,则忽略强制字段检查

时间:2017-08-07 06:54:21

标签: abap

我有以下程序。

REPORT zz_tab_strip_obligatory.

SELECTION-SCREEN BEGIN OF TABBED BLOCK tab FOR 20 LINES.
SELECTION-SCREEN TAB (54) tab1 USER-COMMAND tab1 DEFAULT SCREEN 100.
SELECTION-SCREEN TAB (54) tab2 USER-COMMAND tab2 DEFAULT SCREEN 200.
SELECTION-SCREEN END OF BLOCK tab.

SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
PARAMETERS:
  p1 TYPE i.
SELECTION-SCREEN END OF SCREEN 100.

SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN.
PARAMETERS:
  p2 TYPE i OBLIGATORY.
SELECTION-SCREEN END OF SCREEN 200.

INITIALIZATION.
  tab1 = 'Tab1'.
  tab2 = 'Tab2'.

第一个标签没有必填字段。另一方面,第二个是。

我遇到的问题是,如果用户没有进入第二个标签而不是立即使用F8启动程序,则根本不会执行参数p2的强制检查。看起来像AT SELECTION-SCREEN这样的所有事件只针对显示的子屏幕的当前标签执行。

有什么方法可以解决这个问题吗?我现在的解决方案很遗憾地摆脱OBLIGATORY关键字并在START-OF-SELECTION之后进行检查(我的真实程序有很多标签)。

1 个答案:

答案 0 :(得分:1)

我不认为选择屏幕的强制性问题有直接的解决方案。 Here是一个类似的主题。但是,您可以将所有必需参数存储在内部表中。在选择开始时,循环访问它们并检查它们。

DATA: BEGIN OF gt_obl_fields OCCURS 0,
    fname TYPE char10,
    ftext type char50,
END OF gt_obl_fields.

INITIALIZATION.
 tab1 = 'Tab1'.
 tab2 = 'Tab2'.

 gt_obl_fields-fname = 'P2'.
 gt_obl_fields-ftext = text-001.
 APPEND gt_obl_fields.
 "...
START-OF-SELECTION.
  LOOP AT gt_obl_fields .
    ASSIGN (gt_obl_fields-fname) TO FIELD-SYMBOL(<fs_field>).
    IF <fs_field> IS ASSIGNED AND <fs_field> IS INITIAL..
      CONCATENATE gt_obl_fields-ftext 'field must be filled!' INTO data(lv_message).
      MESSAGE lv_message TYPE 'E'.
    ENDIF.
  ENDLOOP.