第七章 SAP应用界面开发及ABAP报表设计
第二节 SAP屏幕事件的控制
在进一步了解屏幕事件之前,我们先了解下PAI与PBO的概念。
PAI:Process After Input.
PBO:Process Before Output.
顾名思义,两者都是屏幕流程处理控制机制,一个是在屏幕数据处理之前,一个是在处理完之后。屏幕的具体管控是由一系列的屏幕事件关键字来进行管控的。
7.2.1 INITIALIZATION事件
该事件在屏幕未显示之前执行,对程序设置值及屏幕元素进行初始化赋值,如例7-16所示。
例7-16 Initialization在Report程序中的使用。
REPORT ZSCREEN_TEST11.
PARAMETERS QUAL_DAY TYPE D DEFAULT SY-DATUM.
INITIALIZATION.
QUAL_DAY+6(2) = '01'.
QUAL_DAY = QUAL_DAY - 1.
该程序输出时会对所定义元素赋值初始化,如图7-21所示。
图7-21 屏幕元素的初始化赋值
7.2.2 START-OF-SELECTION事件
综合上例,屏幕初始化界面与上例一致,在单击执行按钮后触发该事件,如例7-17所示。
例7-17 START-OF-SELECTION事件在Report程序中的使用。
REPORT ZSCREEN_TEST11.
PARAMETERS QUAL_DAY TYPE D DEFAULT SY-DATUM.
INITIALIZATION.
QUAL_DAY+6(2) = '01'.
QUAL_DAY = QUAL_DAY - 1.
START-OF-SELECTION.
WRITE: 'DATE:',QUAL_DAY.
上例执行效果如图7-22所示。
图7-22 单击执行按钮触发START-OF-SELECTION事件
7.2.3 END-OF-SELECTION事件
该事件应用于所有数据处理完成,即START-OF-SELECTION相关事件执行完成,但输出屏幕还未显示之前。在实际开发中,主要应用于一些执行结果的检验等。其输出数据叠加于同一输出屏幕中,如例7-18所示。
例7-18 END-OF-SELECTION事件在Report程序中的使用。
REPORT ZSCREEN_TEST12.
PARAMETERS QUAL_DAY TYPE D DEFAULT SY-DATUM.
INITIALIZATION.
QUAL_DAY+6(2) = '01'.
QUAL_DAY = QUAL_DAY - 1.
START-OF-SELECTION.
WRITE: 'DATE:',QUAL_DAY.
END-OF-SELECTION.
IF QUAL_DAY <> SYST-DATUM.
WRITE: 'Today:',SYST-DATUM.
ENDIF.
上例执行效果如图7-23所示。
图7-23 END-OF-SELECTION事件输出值叠加于输出屏幕
7.2.4 屏幕事件的中止
ABAP中主要通过以下语法来实现屏幕事件的中止,具体使用如例7-19所示。
1)EXIT:中止某一事件模块,如START-OF-SELECTION,但是不影响其他事件的执行。
2)REJECT:功能与EXIT基本一致。
例7-19 在Report执行模组中使用EXIT中止事件。
REPORT ZSCREEN_TEST13.
PARAMETERS QUAL_DAY TYPE D DEFAULT SY-DATUM.
INITIALIZATION.
QUAL_DAY+6(2) = '01'.
QUAL_DAY = QUAL_DAY - 1.
START-OF-SELECTION.
EXIT. "本行使用EXIT或REJECT结果一致,本事件中止
WRITE: 'DATE:',QUAL_DAY.
END-OF-SELECTION.
IF QUAL_DAY <> SYST-DATUM.
WRITE: 'Today:',SYST-DATUM.
ENDIF.
上例中START-OF-SELECTION事件所对应数据不会输出,但是不会影响END-OF-SELECTION事件的执行,输出结果如图7-24所示。
图7-24 START-OF-SELECTION事件中止
3)STOP:强制中止所有事件,如例7-20将没有任何输出。
例7-20 在Report执行模组中使用STOP中止所有事件。
REPORT ZSCREEN_TEST14.
PARAMETERS QUAL_DAY TYPE D DEFAULT SY-DATUM.
INITIALIZATION.
QUAL_DAY+6(2) = '01'.
QUAL_DAY = QUAL_DAY - 1.
START-OF-SELECTION.
STOP. "本程序所有事件不会执行,无输出
WRITE: 'DATE:',QUAL_DAY.
END-OF-SELECTION.
IF QUAL_DAY <> SYST-DATUM.
WRITE: 'Today:',SYST-DATUM.
ENDIF.