如果使用 TABBED BLOCK,则忽略强制字段检查
Obligatory field check ignored if TABBED BLOCK used
我有以下程序。
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
之后进行检查(我的真实程序有很多选项卡)。
我认为没有直接解决选择屏幕强制性问题的方法。 Here 是一个类似的主题。但是,您可以将所有必需参数存储在内部 table 中。在选择开始处,遍历它们并检查它们。
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.
我有以下程序。
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
之后进行检查(我的真实程序有很多选项卡)。
我认为没有直接解决选择屏幕强制性问题的方法。 Here 是一个类似的主题。但是,您可以将所有必需参数存储在内部 table 中。在选择开始处,遍历它们并检查它们。
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.