SELECTION-SCREEN用来创建屏幕的框架结构
REPORT z437_test_2024.
TABLES: mara, zdbt_sch_437.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. " Title1
PARAMETERS:
p_1 DEFAULT 'A',
p_2 TYPE char10.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN SKIP 1. " 设置1行空格
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002. " Title2
SELECT-OPTIONS:
s_1 FOR mara-matnr,
s_2 FOR zdbt_sch_437-schid OBLIGATORY. " 设置为必填字段
SELECTION-SCREEN END OF BLOCK b2.
在程序中双击TEXT-001 和 TEXT-002,分别在文本符号页签填写Title1和Title2,激活并进行保存
执行程序,输出结果:
综合练习



实现如下报表程序:
① 默认单选按钮为学生,选择屏幕如下
当用户点击查询时候,输出的查询结果仅包含学生表信息
② 当选择学校按钮时,选择屏幕如下,多一个学校ID的选择条件
当用户点击查询时候,输出的查询结果包含学生表以及学校表的信息
③ 当选择班级按钮时,选择屏幕如下,多一个班级ID的选择条件
当用户点击查询时候,输出的查询结果包含学生表,学校表以及班级表的信息
程序代码如下
REPORT z437_test_2024.
TABLES: zdbt_stu_437.
* 定义选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_sex FOR zdbt_stu_437-sex NO INTERVALS NO-EXTENSION, " 性别
s_id FOR zdbt_stu_437-id, " 学号
s_schid FOR zdbt_stu_437-schid MODIF ID m1, " 学校ID
s_claid FOR zdbt_stu_437-classid MODIF ID m2. " 班级ID
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
PARAMETERS: p_1 RADIOBUTTON GROUP r1 DEFAULT 'X' USER-COMMAND u1,
p_2 RADIOBUTTON GROUP r1,
p_3 RADIOBUTTON GROUP r1.
SELECTION-SCREEN END OF BLOCK b2.
* 自定义类型
TYPES: BEGIN OF ty_student1.
INCLUDE TYPE zdbt_stu_437.
TYPES: schname TYPE zdbt_sch_437-schname,
END OF ty_student1.
TYPES: BEGIN OF ty_student2.
INCLUDE TYPE zdbt_stu_437.
TYPES: schname TYPE zdbt_sch_437-schname,
classname TYPE zdbt_class_437-classname,
classteach TYPE zdbt_class_437-classteach,
END OF ty_student2.
* 定义内表
DATA: lt_student1 TYPE STANDARD TABLE OF zdbt_stu_437.
DATA: lt_student2 TYPE STANDARD TABLE OF ty_student1.
DATA: lt_student3 TYPE STANDARD TABLE OF ty_student2.
* 选择屏幕输出前触发
AT SELECTION-SCREEN OUTPUT.
IF p_1 = abap_true.
LOOP AT SCREEN.
IF screen-group1 = 'M1' OR screen-group1 = 'M2'.
screen-active = 0. " 不可见
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
IF p_2 = abap_true.
LOOP AT SCREEN.
IF screen-group1 = 'M2'.
screen-active = 0. " 不可见
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
* 点击执行后触发(写OPEN SQL)
START-OF-SELECTION.
IF p_1 = abap_true.
SELECT *
FROM zdbt_stu_437
INTO TABLE lt_student1
WHERE sex IN s_sex
AND id IN s_id.
ENDIF.
IF p_2 = abap_true.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_student2
FROM zdbt_stu_437 AS a
INNER JOIN zdbt_sch_437 AS b
ON a~schid = b~schid
WHERE sex IN s_sex
AND id IN s_id
AND a~schid IN s_schid.
ENDIF.
IF p_3 = abap_true.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_student3
FROM zdbt_stu_437 AS a
INNER JOIN zdbt_sch_437 AS b
ON a~schid = b~schid
INNER JOIN zdbt_class_437 AS c
ON a~classid = c~classid
WHERE sex IN s_sex
AND id IN s_id
AND a~schid IN s_schid
AND a~classid IN s_claid.
ENDIF.
* 展示数据
END-OF-SELECTION.
IF sy-subrc = 0.
IF p_1 = abap_true.
cl_demo_output=>display( lt_student1 ).
ENDIF.
IF p_2 = abap_true.
cl_demo_output=>display( lt_student2 ).
ENDIF.
IF p_3 = abap_true.
cl_demo_output=>display( lt_student3 ).
ENDIF.
ENDIF.
在选择屏幕中的输入值有变化时,执行AT-SELECTION-SCREEN事件
如果选择屏幕的字段检查都通过,则执行START-OF-SELECTION事件,从数据库中读取数据
调用END-OF-SELECTION事件,在查询数据库结束后显示数据
控制选择屏幕的动态变化涉及到 MODIF ID 和 USER-COMMAND