Skip to content
关注公众号,可咨询工作中遇到的问题、获取学习资料、掌握行业资讯

程序结构--事件

一、简单介绍

  本章将学习执行程序后初始化画面字段及根据用户输入的值返回相应结果的用户事件。各事件的详细功能请参见[表12-5-1]与[表12-5-2]。

abap
INITIALIZATION.
AT SELECTION-SCREEN."( OUTPUT. ON VALUE REOUEST.)
START-OF-SELECTION.
*(SELECT*FROM~或者 GET<TABLE>…..)
END-OF-SELECTION.

alt text

二、 INITIALIZATION

  在事件中执行程序时最先执行的是INITIALIZATION。此事件在显示SELECTION-SCREEN之前触发,因此一般用于指定变量初始值。即在INITIALIZATION 事件中指定SELECTION-SCREEN 中使用的字段初始值,自动输入用户经常使用的值。下面执行[例12-7]。

abap
INITIALIZATION.
        p_i='AA'.

[例 12-7]

abap
REPORT z12_07.

TABLES : sflight.

PARAMETERS:p_carrid KE sflight-carrid,
           p_connid LIKE sflight-connid.

SELECT-OPTIONS :s_fdate FOR sflight-fldate.

INITIALIZATION.
*SETTITLEBAR'TI0OO'
*SETPF-STATUS"TEST

p_carrid ='AA'
p_connid='17'
s_fldate-low='20150101'
s_fldate-high='20151231'
APPEND s_fldate.

  SELECT-OPTION是内表形式,因此要用APPEND语追加数据。在“内表”中也强调过要记住数据分配与APPEND需要配套使用。在INITIALIZATION事件中,如[例 12-71]所示主要用于设置字段初始值。[例12-7]的结果如[结果 12-71所示。此外,构成标准程序提供的菜单和其他菜单(SETPFSTATUS)、指定程序标题(SETTITLE)、设置布局初始值等用于追加弹性作业。在INITIALIZATION 事件中没有必要设置初始值时可以删除相应语句,这样也不会发生错误。但是考虑到程序可读性,还是希望保留着。 alt text

三.AT SELECTION-SCREEN

  AT SELECTION-SCREEN是在 SELECTION-SCREENInput Field 的值有变更时执行的事件。INITIALIZATION与START-OF-SELECTION 之间被触发,且对用户事件有回应并调节画面字段。
  例如,假设SELECTION-SCREEN中存在事业部字段,有时会发生不允许用户查询其他事业部信息的情况。此时,若用户修改事业部编号会自动执行 ATSELECTION-SCREEN 事件则在相应事件中追加权限检查即可。

abap
AT SELECTION-SCREEN.
AUTHORITY-CHECK OBJECT'Z_TEST'.
        ID 'CARRID' FIELD pa_carr
        ID 'ACTVT' FIELD '03'.
IF SY-SUBRC =4.
    MESSAGE e000 WITH 'You need a authority'.
ENDIF.

  在 ATSELECTION-SCREEN 中有多种在相应事件中可以使用的有效选项,如[表 12-5]所示。 alt text

四、 START-OF-SELECTION

  若已经结束查询画面上字段的初始值设置及数据检查(Validation),就要执行从数据库读取数据的实际性操作。执行SQL语句之前最好先执行CLEAR语句等准备操作后执行SELECT 语句。执行 SELECT语句时,若需要很长时间则不妨利用[例12-8]中的SAPGUI_PROGRESS_INDICATOR 函数显示沙计时器以提示用户。

abap
START-OF-SELECTION.

[例12-8]

abap
REPORT z12_12.

DATA : g_total TYPE i,
    g_cnt TYPE i,
    g_index TYPE i.

DATA : gt_sflight TYPE TABLE OF sflight WITH HEADER LINE.

START-OF-SELECTION.
 SELECT *
 INTO CORRESPONDING FIELDS OF TABLE gt_sflight
 FROM sflight.

DESCRIBE TABLE gt_sflight LINES g_total.

LOOP AT gt_sflight.
 g_cnt=g_cnt+ 1.
 PERFORM progress_indicator USING g_cnt g_total 'Progressing... '.
ENDLOOP

 WRITE 'SUCCESS'.

FORM progress_indicator USING
                value(p_cur)
                value(p_total)
                value(p_text).
DATA : lv_text(50) TYPE c,
        lv_idx(3)TYPE n.

lv_idx=(p_cur/p_total )* 100.

CONCATENATE lv_idx '%:'p_text INTO lv_text.

CALL FUNCTION
    'SAPGUI_progress_indicator'
EXPORTING
    percentage =ly_idx
    text =lv_text
EXCEPTIONS
    OTHERS = 0.
ENDFORM. "progress indicator

[结果12-8] alt text

五、END-OF-SELECTION

  此事件作为执行环境下最后调用的事件,是在查询所有数据后最终将这些数据输出到画面之前执行。即在 SELECT语句中读取所有数据后,画面中显示Write 在此事件内可以做修改内表数据的操作。

abap
END-OF-SELECTION.

  [例12-9]是从 START-OF-SELECTION 中读取数据后在 END-OF-SELECTION 中显示数据到画面的实例。 [例12-9]

abap
REPORT z12 13.
DATA :gs_str TYPE scarr,
    gt_itab TYPE TABLE OF scarr.

START-OF-SELECTION.

SELECT *
 INTO CORRESPONDING FIELDS OF TABLE gt_itab
 FROM scarr.
END-OF-SELECTION.

LOOP AT gt_itab INTO gs_str.
WRITE:/gs_str-carrid, gsstr-carrname.

ENDLOOP.

[结果 12-9]

abap
AA American Airlines3d
AB Air Berlin
AC Air Canada
AF Air France
AZ Alitalia
BA British Airways
CN Air china