文章目录
REPORT程序事件执行顺序
程序模块化
INCLUDE…
- 包含程序。包含程序不能被单独调用,必须被其他程序包含,相当于此程序代码完全复制在当前程序中。
- 注意声明部分与包含程序的位置。
INCLUDE…TOP.
INCLUDE …FORM.
PERFORM/FORM
- Subroutines,子程序,子例程,在程序中形成重用模块,可以进行多次重复调用。
- 对子程序的调用
PERFORM<子程序名称>TABLES.. USING..CHANGING..
- 子程序代码块
FORM<子程序名称>TABLES...[TYPE type] USING...[TYPE type]CHANGING ... [TYPE type]. ENDFORMM.
LOAD-OF-PROGRAM
- 用于执行程序加载,当执行一个1类型(可执行程序),M类型(ModulePool),F类型(Function Group),S类型(SubroutinePool)程序时,SAP系统自动将程序加载至内存中时,自动调用这个事件。
- 默认执行,不需coding,执行完毕后执行INITIALIZATION
INITIALIZATION
只能书写在可执行程序中,这个事件是在程序初始化过程中起作用的事件,一旦程序初始化,完成以后该事件将不再对程序产生影响
*&---------------------------------------------------------------------*
*& EVENT 初始化事件
*& INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.
GV_NAME = '待检查'.
AT SELECTION-SCREEN OUTPUT
相当于程序的PBO(Processing Before Output)事件,与 AT SELECTION-SCREEN 事件不同,AT SELECTION-SCREEN OUTPUT 事件不依赖于用户输入,它总是在选择屏幕显示之前触发。
AT SELECTION-SCREEN OUTPUT."选择界面的PBO事件 PROCESS BEFORE OUTPUT
PERFORM MODIFY_SCREEN.
*&---------------------------------------------------------------------*
*& Form MODIFY_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM MODIFY_SCREEN .
LOOP AT SCREEN.
IF P_CHECK = 'X'.
ELSE.
IF SCREEN-GROUP1 = 'DEP'.
SCREEN-INVISIBLE = 1.
MODIFY SCREEN.
R_MALE = ''.
R_FEMALE = ''.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
效果:
AT SELECTION-SCREEN
在选择屏幕上用户输入数据并触发执行按钮(通常是点击执行按钮或按下回车键)之后被触发。这个事件通常用于处理用户输入的数据,进行验证、计算或其他逻辑处理。
- 按钮点击->PAI事件->PBO事件->选择界面再次输出
AT SELECTION-SCREEN."选择界面的PAI事件 PROCESS AFTER INPUT
PERFORM SELECTION_SCREEN_PAI.
*&---------------------------------------------------------------------*
*& Form SELECTION_SCREEN_PAI
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SELECTION_SCREEN_PAI .
IF NOT S_ZCODE[] IS INITIAL.
SELECT SINGLE *
FROM ZSTUDENT_JSM_01
INTO CORRESPONDING FIELDS OF GS_TOTAL
WHERE ZCODE IN S_ZCODE .
IF SY-SUBRC = 0.
GV_NAME = '存在'.
ELSE.
GV_NAME = '不存在'.
ENDIF.
ELSE.
GV_NAME = '待检查'.
ENDIF.
ENDFORM.
START-OF-SELECTION
执行时触发,一般用来取数据
多表取数的几种方法
1.inner join
SELECT A~ZCODE A~ZNAME A~SEX A~ZSCHOOL
B~ZSNAME
FROM ZSTUDENT_JSM_01 AS A INNER JOIN ZSCHOOL_JSM_01 AS B
ON A~ZSCHOOL = B~ZSCHOOL
INTO CORRESPONDING FIELDS OF TABLE GT_TOTAL
WHERE A~ZCODE IN S_ZCODE
AND A~ZSCHOOL IN S_ZSCL
AND SEX IN R_SEX.
2.left outer join
SELECT A~ZCODE A~ZNAME A~SEX A~ZSCHOOL
B~ZSNAME
FROM ZSTUDENT_JSM_01 AS A LEFT OUTER JOIN ZSCHOOL_JSM_01 AS B
ON A~ZSCHOOL = B~ZSCHOOL
INTO CORRESPONDING FIELDS OF TABLE GT_TOTAL
WHERE A~ZCODE IN S_ZCODE
AND A~ZSCHOOL IN S_ZSCL
AND SEX IN R_SEX.
3.这种取数方式比前两种要快,先从ZSTUDENT_JSM_01表中筛选学生数据,并将结果存储在内表GT_STUDENT中。对于每个学生,根据其学校代码从GT_SCHOOL表中检索对应的学校名称,并整合这些信息到另一个内表GT_TOTAL中。
SELECT ZCODE ZNAME SEX ZSCHOOL
FROM ZSTUDENT_JSM_01
INTO CORRESPONDING FIELDS OF TABLE GT_STUDENT
WHERE ZCODE IN S_ZCODE
AND ZNAME IN S_ZNAME
AND ZSCHOOL IN S_ZSCL
AND SEX IN R_SEX.
IF GT_STUDENT IS NOT INITIAL.
SELECT ZSCHOOL ZSNAME
FROM ZSCHOOL_JSM_01
INTO CORRESPONDING FIELDS OF TABLE GT_SCHOOL
FOR ALL ENTRIES IN GT_STUDENT
WHERE ZSCHOOL = GT_STUDENT-ZSCHOOL.
ENDIF.
LOOP AT GT_STUDENT INTO GS_STUDENT.
CLEAR GS_TOTAL.
MOVE-CORRESPONDING GS_STUDENT TO GS_TOTAL.
READ TABLE GT_SCHOOL INTO GS_SCHOOL
WITH KEY ZSCHOOL = GS_TOTAL-ZSCHOOL
BINARY SEARCH.
IF SY-SUBRC = 0."读取到
GS_TOTAL-ZSNAME = GS_SCHOOL-ZSNAME.
ELSE ."读取失败
CONTINUE.
ENDIF.
APPEND GS_TOTAL TO GT_TOTAL.
ENDLOOP.
TOP-OF-PAGE
这个事件是在报表程序里输出自定义的表头用的,在新的一页刚开始遇到write语句的时候这个事件块就会执行一次
第一次执行:遇到程序中的第一个write语句时,跳转到TOP-OF-PAGE事件执行,执行完毕后返回执行write语句
隐藏默认表头,在REPORT程序第一行进行设置:
REPORT program NO STANDARD PAGE HEADING.
*&---------------------------------------------------------------------*
*& EVENT TOP OF SELECTION
*&---------------------------------------------------------------------*
TOP-OF-PAGE.
PERFORM TOP_OF_PAGE.
*&---------------------------------------------------------------------*
*& Form TOP_OF_PAGE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM TOP_OF_PAGE .
FORMAT COLOR 2 ON.
WRITE:/1(61) '学生信息表' CENTERED."背景色
FORMAT COLOR 2 OFF.
WRITE:/1(61) SY-ULINE.
FORMAT COLOR 3 INVERSE ON."字体颜色
WRITE:/1 SY-VLINE NO-GAP ,(10) '学号' NO-GAP CENTERED,
SY-VLINE NO-GAP ,(20) '姓名' NO-GAP CENTERED,
SY-VLINE NO-GAP ,(5) '性别' NO-GAP CENTERED,
SY-VLINE NO-GAP ,(10) '学校代码' NO-GAP CENTERED,
SY-VLINE NO-GAP ,(10) '学校' NO-GAP CENTERED,
SY-VLINE .
FORMAT COLOR 3 INVERSE ON.
ENDFORM.
END-OF-SELECTION
这个事件是报表程序选择完并且处理完数据后LIST输出的事件,同时这个事件也是逻辑数据库选择数据结束的标志。
AT LINE-SELECTION
用户在列表或表格中选择一行或多行时时触发
*&---------------------------------------------------------------------*
*& EVENT LINE SELECTION
*&---------------------------------------------------------------------*
AT LINE-SELECTION.
PERFORM LINE_SELECTION.
*&---------------------------------------------------------------------*
*& Form LINE_SELECTION
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM LINE_SELECTION .
DATA:GV_FIELD(30),
GV_VALUE(30).
*获取光标所在位置
GET CURSOR FIELD GV_FIELD"字段名
VALUE GV_VALUE."字段值
"判断是否时学校字段
CHECK GV_FIELD = 'GS_TOTAL-ZSCHOOL'.
* 取数 从学校表
SELECT SINGLE *
FROM ZSCHOOL_JSM_01
WHERE ZSCHOOL = GV_VALUE.
IF SY-SUBRC = 0.
WRITE:/1(31) SY-ULINE.
WRITE:/'学校代码:',ZSCHOOL_JSM_01-ZSCHOOL,
/'学校名称:',ZSCHOOL_JSM_01-ZSNAME,
/'学校地址:',ZSCHOOL_JSM_01-ZADD.
WRITE:/1(31) SY-ULINE.
"不成功
"提示消息
ELSE.
MESSAGE I000 WITH '没有学校信息'.
ENDIF.
ENDFORM.
双击学校代码后显示
AT USER-COMMAND
屏幕列表显示期间,用户选择了一个自定义功能码的函数时被触发,这个事件允许开发者定义自定义功能码,并在用户通过这些功能码执行操作时执行特定的代码块。对自定义按钮增加功能,使用系统变量SY-UCOMM判断功能代码,所以可以通过case语句来触发事件。
FORM USER_COMMAND .
CASE SY-UCOMM.
WHEN 'BACK'."返回
LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'CANCEL'."取消
LEAVE PROGRAM.
WHEN 'SORTUP'."升序
SY-LSIND = SY-LSIND - 1 .
PERFORM SORT_LIST USING 'UP'.
WHEN 'SORTDOWN'."降序
SY-LSIND = SY-LSIND - 1 .
PERFORM SORT_LIST USING 'DOWN'.
WHEN 'DOWNLOAD'."下载
MESSAGE S000 WITH '下载成功'.
WHEN OTHERS.
ENDCASE.
ENDFORM.
TOP-OF-PAGE DURING LINE-SELECTION
在REPORT程序中重新使用WRITE语句输出表单时,表单序号SY-LSIND自动增加1,次级表单输出时,需要单独指定表头。
*&---------------------------------------------------------------------*
*& EVENT TOP OF PAGE OF LINE SELECTION
*&---------------------------------------------------------------------*
TOP-OF-PAGE DURING LINE-SELECTION.
CASE SY-UCOMM.
WHEN 'SORTUP' OR 'SORTDOWN'.
WRITE:/ '学生信息'.
PERFORM TOP_OF_PAGE.
ENDCASE.