【ABAP——REPORT程序事件】

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.

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值