SAP ABAP开发详解与高端应用 (第1页)

第 1 页 / 共 377 页

第 2 页 / 共 377 页

第 3 页 / 共 377 页

SAP Dsbs 系列自学丛书

SAP ABAP 开发详解与高端应用

孙东文 郭 欢 张 岩 等编著

机 械 工 业 出 版 社

第 4 页 / 共 377 页

本书主要介绍了 ABAP面向对象编程、 ALV列表、接口、增强及ABAP

开发人员求职面试的相关技术问题。 ABAP面向对象编程部分由城入深地讲

解了面向对象的相关概念,并从实际应用出发,举例说明了 ABAP编程所涉

及的本地对象和全局对象的编辑实现及应用效果;ALV列表部分全面地介绍

了 ALV 的种类以及各种 ALV 的实现方式,并详述了面向对象 ALV 列表及

ALV树形列表的编辑实现及应用效果:接口部分系统地介绍了各类接口的原

理及实现方法,并详述了 IDOC、盯C、 BAPI 的相关概念及原理: 增强部分

对增强的升级及不同时期的各代增强的原理、查找办法、实现方式作了详细

阐述,并举例说明了每一代增强的编辑实现及应用效果; ABAP面试问题及

答案部分提供了较为全面的面试问题集,为求职者打开方便之门。

本书提供了大量配套资源及实例源码,深入剖析了 SAPNetWeaver架构

的关键技术,是 Java等开发人员深入学习 SAP系统的必备指南,还适用于

SAP技术人员和Java\.NET平台下SAP接口程序的开发人员。

图书在版编目 (CIP) 数据

SAPABAP开发详解与高端应用/孙东文等编著. 一北京:机械工业出版

丰士, 2015.6

ISBN 978-7-111-50126-8

1 . ( s … . II .①孙… III. ①企业管理一应用软件一软件开发

IV. ( F270.7

中国版本图书馆CIP数据核字 (2015) 第 114323 号

机械工业出版社(北京市百万庄大街22号 邮政编码 100037)

策划编辑:丁诚 责任校对:张艳霞

责任编辑: 丁诚周萌

责任印制:李洋

三河市宏达印刷有限公司印刷

2015年7月第 1版·第 1 次印刷

184mmX260mm • 23.5印张 .579千字

。001-3000册

标准书号: ISBN 978-7-111-50126-8

定价: 69.00元

凡购本书,如有缺页、倒页、脱页,由本社发行部调换

电话服务 网络服务

服务咨询热线: (010) 88361066 机工 宫网: www.cmpbook.com

读者购书热线: (010) 68326294 机 工官博: weibo.com/cmpI952

(010) 88379203 教育服务网: www.cmpedu.com

封面无防伪标均为盗版 金书网: www.golden-book.com

第 5 页 / 共 377 页

前 言

随着SAP软件在中国企业的广泛应用,SAP实施及运维的IT服务行业也异军突起,ASP

相关技术也得到了广泛的应用,这其中不乏SAP开发的高端技术。

作者根据SAP官方教材和项目经验对ABAP开发技术做了一下分类,将ABAP面向对象

编程、ALV的面向对象应用、接口和增强归作为高级应用技术纳入本书。

以往的书籍仅对ABAP高级应用部分做原理剖析,能够提及对面向对象、接口及增强实

现的图书是少之又少。本书特点在于对各技术原理、实施前提、实施步骤、实施结果作了详

尽的说明,更有ABAP求职者相关基础技术及高端技术的面试题,以帮助那些做技术提升的

SAP开发人员。

学习SAP高级开发技术,开发者不仅需要提高自身水平(例如,从面向过程的编程到面

向对象编程的转变,从单一开发语言的编程到不同语言之间编程的转变及其之间数据关系映

射的了解),也需要熟悉SAP相关操作(例如,远程RFC的TCP链接的创建和调试),更需

要SAP开发者对各种技术实施后最终体现的结果的认同(例如,如何应用创建的RFC链接,

高端技术实施应用以后有什么样的效果,是否和需求相吻合等)。

参与本书编写的有孙东文(笔名:东方先生)、郭娟、郭欢、张岩,由于水平有限,书中

难免有疏漏和不足,请读者批评指正。

编 者

III

第 6 页 / 共 377 页

目 录

前言

第1章 ABAP面向对象编程 ······································································································ 1

1.1 面向对象的基本要素 ····································································································· 2

1.1.1 封装 ························································································································ 2

1.1.2 多态 ························································································································ 3

1.1.3 继承 ························································································································ 3

1.1.4 面向对象的成员 ······································································································· 4

1.1.5 接口 ······················································································································ 10

1.2 本地类的实现 ·············································································································· 12

1.2.1 程序设计 ··············································································································· 12

1.2.2 程序测试 ··············································································································· 26

1.3 全局类的实现 ·············································································································· 26

1.3.1 接口制作 ··············································································································· 26

1.3.2 接口的使用(类的创建) ························································································ 31

1.3.3 类的测试 ··············································································································· 37

第2章 ALV应用 ······················································································································ 38

2.1 函数ALV和面向对象事件 ························································································· 44

2.1.1 程序设计 ··············································································································· 44

2.1.2 程序测试 ··············································································································· 59

2.2 面向对象ALV ·············································································································· 60

2.2.1 Dynpro控件ALV ··································································································· 60

2.3 面向对象ALV ·············································································································· 82

2.3.1 程序设计 ··············································································································· 82

2.3.2 程序测试 ··············································································································· 95

2.4 ALV树 ························································································································· 97

2.4.1 程序设计 ··············································································································· 97

2.4.2 程序测试 ············································································································· 109

第3章 接口 ····························································································································· 111

3.1 SAP数据交换接口的类型 ························································································ 111

3.1.1 CPI-C简介··········································································································· 111

3.1.2 RFC简介 ············································································································· 112

3.1.3 ALE简介 ············································································································· 112

3.2 SAP R/3的接口方式 ·································································································· 114

3.2.1 IDOC接口 ··········································································································· 114

3.2.2 RFC接口 ············································································································· 119

IV

第 7 页 / 共 377 页

3.2.3 BAPI接口 ··········································································································· 130

3.3 ALE/IDoc应用 ··········································································································· 135

3.3.1 SAP系统间数据传输配置 ····················································································· 135

3.3.2 SAP系统间数据扩张传输 ····················································································· 149

3.3.3 SAP系统与其他系统间数据传输 ··········································································· 186

3.4 RFC应用 ···················································································································· 187

3.4.1 同步RFC方式的远程函数调用 ·············································································· 187

3.4.2 异步RFC方式的远程函数调用 ·············································································· 188

3.4.3 并行RFC方式的远程函数调用 ·············································································· 190

3.4.4 事务RFC方式的远程函数调用 ·············································································· 193

3.4.5 队列RFC方式的远程函数调用 ·············································································· 196

3.4.6 外部系统RFC方式的远程调用 ·············································································· 198

3.5 BAPI的应用 ·············································································································· 217

3.5.1 SAP业务对象 ······································································································ 217

3.5.2 BAPI定义 ··········································································································· 218

3.5.3 BAPI调用 ··········································································································· 225

第4章 增强 ····························································································································· 236

4.1 概述 ···························································································································· 236

4.1.1 第一代增强 ·········································································································· 236

4.1.2 第二代增强 ·········································································································· 238

4.1.3 第三代增强 ·········································································································· 243

4.1.4 第四代增强 ·········································································································· 245

4.2 第一代增强的应用 ····································································································· 245

4.3 第二代增强的应用 ····································································································· 245

4.3.1 数据元素及关键字 ································································································ 245

4.3.2 字段增强 ············································································································· 246

4.3.3 GuiXT增强 ·········································································································· 250

4.3.4 表增强 ················································································································· 255

4.3.5 函数增强 ············································································································· 259

4.3.6 菜单增强 ············································································································· 263

4.3.7 屏幕增强 ············································································································· 268

4.4 第三代增强的应用 ····································································································· 276

4.4.1 BADI增强 ··········································································································· 276

4.4.2 BTE增强 ············································································································· 287

4.5 第四代增强(Code Enhancement)的应用 ······························································ 293

第5章 ABAP面试问题及答案 ······························································································ 298

5.1 语法 ···························································································································· 298

5.1.1 基础知识 ············································································································· 298

5.1.2 应用技术 ············································································································· 301

V

第 8 页 / 共 377 页

5.2 数据字典相关问题 ····································································································· 304

5.3 报表相关问题 ············································································································ 306

5.3.1 基本报表 ············································································································· 306

5.3.2 ALV报表 ············································································································ 308

5.3.3 SmartForm报表 ···································································································· 308

5.4 对话程序 ···················································································································· 309

5.4.1 事件 ···················································································································· 309

5.4.2 控件 ···················································································································· 309

5.4.3 语法 ···················································································································· 310

5.5 批处理 ························································································································ 310

5.5.1 原理 ···················································································································· 310

5.5.2 语法 ···················································································································· 311

5.6 增强 ···························································································································· 312

5.7 接口 ···························································································································· 313

5.7.1 RFC接口 ············································································································· 314

5.7.2 BAPI接口 ··········································································································· 315

5.7.3 其他 ···················································································································· 316

5.8 数据库知识 ················································································································ 317

5.8.1 基础知识 ············································································································· 317

5.8.2 ABAP和数据库 ··································································································· 318

5.9 业务知识 ···················································································································· 321

5.10 其他 ·························································································································· 324

第6章 常用工具 ····················································································································· 328

6.1 SAP 简单报表生成工具 ···························································································· 328

6.1.1 Quick View ··········································································································· 328

6.1.2 Quick Query ········································································································· 331

6.2 SAP快速录入工具 ···································································································· 345

V I

第 9 页 / 共 377 页

第 1 章 ABAP面向对象编程

SAP系统从4.0版本开始对ABAP语言进行了扩充,增加了ABAP类和对象功能。也就

是说,可以使用类的所有特性,如封装、多态、接口和继承等,使复杂的应用变得更容易控

制且简单化,并且SAP要求ABAP语言严格向上兼容。

ABAP类语言跟其他面向对象的语言一样,有类和接口,类又包括属性、方法和事件。

一、面向对象

■ 对象(Object)

对象是包含部件并提供服务的程序代码段,其中部件部分代表该对象的属性,而所提供

的服务则被称为方法。

■ 类

类是对象的定义,通过属性和方法的封装来描绘对象。类是对象的模板,相应地,一个

对象的类型与它的类相同。一个类是一个对象的抽象描述,它是构建一个对象所需要的一系

列指令。对象的属性和方法由类的部件定义,类描述了对象的框架和行为。

■ 类和对象的关系

从技术角度看,对象是程序中类的实例,在运行环境中根据类的定义生成。类和对象是

一对多的关系,即可以创建某个类的多个对象,而每个对象均是独立的,拥有代表自身状态

的数据值集。

■ 全局类和本地类

全局类是在 Class Builder(事务码:SE24)中定义的类,其被存储在类池中的程序类型

为接口池(J)和类别库(K)定义在 Include 程序中的本地类也可作为全局类。所有 ABAP

程序都可以访问并使用全局类。本地类是在ABAP程序中定义的类,它和本地接口只能用于

定义本地类的程序中,应用时系统首先查找指定名字的本地类,如果没有找到,再查找全局

类。除了有效性问题,全局类和本地类在使用时没有区别。

二、名词解释

1.抽象(abstraction)

抽象是指对于一个过程或者一件制品的某些细节有目的地隐藏,以便把其他方面、细节

或者结构表达得更加清楚。

抽象是控制复杂性时最重要的工具。人们通常使用一些简单的工具来建立、理解和管理

复杂的系统。其中最重要的技术称为“抽象”。

2.封装

封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或

者对象操作,对不可信的进行信息隐藏。

1

第 10 页 / 共 377 页

3.继承

继承可以使用现有类的所有功能,并在无需重新编写原有类的情况下对这些功能进行

扩展。

4.多态

多态允许将父对象设置成为与一个或多个其子对象相等的技术,赋值之后,父对象就可

以根据当前赋值使它的子对象以不同的方式运作。简单地说,就是允许将子类类型的指针赋

值给父类类型的指针。

1.1 面向对象的基本要素

1.1.1 封装

对象可以对其内部资源的可见性进行限定,每个对象都有一个接口,决定了其他对象如

何与之交互。

基类包括多个派生类,但该基类是作为模板出现,并不需要有任何对象作为实例。

本地类由ABAP源代码组成,封装在CLASS ... ENDCLASS中。一个完整的类定义包括

声明部和执行部,声明中的<class>部分是一个语句块。

语法: CLASS <class> DEFINITION.

...

ENDCLASS.

它包含类所有部件(属性、方法、事件)的声明。当定义一个本地类时,声明部分属于

全局Program数据,所以必须把它放在Program的开始。

如果在类的声明部声明方法,必须也为它写一个执行部。这是由更多的语句块组成的。

语法: CLASS <class> IMPLEMENTATION.

...

ENDCLASS.

在类的执行部分包含了所有类方法的执行,本地类的执行部是一个处理块。那些不在一

个处理块中的后面的代码是不能访问的。

1.声明为抽象类(Abstract Class)

语法: CLASS <class> DEFINTION ABSTRACT.

METHODS meth ABSTRACT...

ENDCLASS.

不可用CREATE OBJECT语句创建类对象,只作为派生类模板;抽象方法不可在类本身

实现,而要在其派生出的非抽象类中实现。

注:抽象方法的类必须为抽象类,不能在类中实现;在派生类实现中,使用REDEFINTION

对类方法重新定义,重新定义过程中不可使用SUPER。

2

第 11 页 / 共 377 页

2.最终类和最终方法

语法: CLASS <class> DEFINITION FINAL.

METHODS meth FINAL...

ENDCLASS.

最终类(Final Class)是不能被继承的类,最终方法是不可重新定义的方法,不一定只出

现在最终类中,但最终类中的所有方法都是最终的,而最终类中无需指明FINAL。

注:类的种别决定该类的实例可以被所有用户创建,只能被其本身或派生类创建或只能

通过其自身方法创建,ABAP常用类型如下:

◆ Final:全局类不能在程序中被继承,即最终类。

◆ Abstract:只能被继承不能被实例化。

◆ For Testing:ABAP单元的测试类。

最终类可同时为抽象类,但只能包含静态成员;最终方法则不可以同时为抽象方法。

1.1.2 多态

相同名称的方法在不同的类中呈现出不同的行为,当一个相同的方法在不同的类中有不

同的实现就是多态。在ABAP中,多态可以通过继承和接口实现方法。

多态性是指相同的用户操作在不同类中有不同的实现形式,在继承中,多态性是通过方

法重载及引用变量实现的,即子类可重新定义并以不同的方式实现基类中的公有或保护方法,

此时,基类中的方法需为实例方法。派生类声明部分需进行METHOD meth REDEFINTION,

该方法必须和基类中的方法具有相同接口,但可通过不同的代码实现。

当访问基类时,将采取基类的原始方法实现;而访问派生类时,则采用新的派生类方法

实现,原有基类方法将被屏蔽,包括通过自身引用me-> meth,不过可使用SUPER来指定其

基类CALL METHOD super->meth。

注:只有在方法重载实现代码内部才能使用SUPER。最终方法不能在子类中重定义,最

终类没有子类。

1.1.3 继承

继承可以定义多个类之间的执行关系,可以从已存在类的基础上建立新的派生类,派生

类可以继承原有类的方法与属性,或者添加新的类成员;高级类的运行方式也可能得到调整

和扩展。

继承允许从一个类中引出新的类。新的类叫子类(Sub Class),被引出的类叫父类(Super

Class)。

1.继承的声明

语法: CLASS <class> DEFINITION INHERITING FROM <superclass>.

……(省略完整代码)

ENDCLASS.

3

第 12 页 / 共 377 页

在子类中,父类的类型为 Public 和 Protected 的组件才是可见的,并且继承只能是单继

承。所有ABAP对象的根类是OBJECT。

2.方法的重定义

语法: CLASS <class> DEFINITION INHERITING FROM <superclass>.

METHODS meth REDEFINITION...

ENDCLASS.

方法的重用使用声明 REDEFINITION 在 METHODS 中定义,但是不能改变它的接口。

用ME->代替自身的对象变量,用SUPER->代替父类的对象变量。

在类定义时,使用INHERTING FROM附加项可以指定各个子类之间的继承关系。ABAP

中继承为单一继承,即一对多。

3.继承过程中各个成员的可见性

■ 派生类中的公有成员以及基类的公有成员,都可以通过"->"在类外部获得。

■ 派生类的被保护成员以及基类的被保护成员,都不可以通过"->"在类外部获得,但可

在派生类内部使用。

■ 派生类中的私有成员只包括其本身私有部分定义的成员,只能在派生类内部使用。

继承类和基类的公有成员和被保护成员享有共同的命名空间,而私有成员则可在不同类

之间出现重名情况。基类应用变量可以指向其继承类对象,反之则会被视为错误的类型转换。

1.1.4 面向对象的成员

在类中能够使用TYPE语句来定义自己的ABAP数据类型,类型不是实例相关的,对类

中的所有对象只存在一次。

1.成员类型

ABAP 中可以定义三种不同的成员类型,分别是属性、方法和事件,各成员的可见性以

及生存周期在类定义的同时被确定。

(1)属性

属性是在类内部的数据对象,用于描述类的状态。属性可以由多个数据类型组成,对象

的说明由属性内容定义。一种类型的属性是关联变量,它允许建立和定位对象。关联变量能

够在类内部定义,也允许从类中访问对象。

实例属性

实例属性的内容定义了专用实例,可以用DATA语句声明。

静态属性

静态属性的内容定义了类的声明,对类的所有实例有效。静态属性对每个类存在一次,

可以用CLASS-DATA语句来声明它们,它们在类的全部运行时间都可以被访问。

常量

常量是特殊的静态属性,在声明时设置值,然后就不能再修改。声明使用 CONSTANTS

语句。

(2)方法

方法是对象行为的实现部分,可以将其视为是类中的过程,用于访问或修改对象状态。

4

第 13 页 / 共 377 页

方法的定义和参数接口与函数模块相同,可以在声明部定义。

语法: METHODS <meth> IMPORTING.. [VALUE(]<ii>[)] TYPE type [OPTIONAL]..

EXPORTING.. [VALUE(]<ei>[)] TYPE type [OPTIONAL]..

CHANGING.. [VALUE(]<ci>[)] TYPE type [OPTIONAL]..

RETURNING VALUE(<r>)

EXCEPTIONS.. <ei>..

然后在执行部实现,语法如下。

语法: METHOD <meth>.

...

ENDMETHOD.

本地数据类型和方法的定义与其他ABAP程序相同,可以用语句CALL METHOD来调用。

语法: CALL METHOD <meth> EXPORTING... <ii> =.<f i>...

IMPORTING... <ei> =.<g i>...

CHANGING ... <ci> =.<f i>...

RECEIVING r = h

EXCEPTIONS... <ei> = rc i...

参数解释:

■ Importing:指定一个或多个输入参数。

■ Exporting:指定一个或多个输出参数。

■ Changing:指定一个或多个输入/输出参数。

■ Value:指定参数传递形式,分为值传递和引用传递两种形式。默认为引用传递,如果

使用Value选项则为值传递。

■ Type:指定参数类型,每一个参数都必须有指定的类型。

■ Optional:指定该参数为可选时,程序将使用该参数类型的初始值进行传递,或者是

使用Default选项后指定的默认值。

■ Returning:该选项可以替代Importing和Exporting。

实例方法

可以用METHODS语句声明实例方法,它们可以访问类中的所有属性,能够触发所有的

事件。

静态方法

可以使用 CLASS-METHODS 语句声明静态方法,它们只能够访问静态属性和触发静态

事件。

构造方法(类构建器)

同普通方法一样,可以通过CALL METHOD调用,当建立一个对象(CONSTRUCTOR)

或第一次访问类的部件时(CLASS_CONSTRUCTOR),有两个叫 CONSTRUCTOR 和

CLASS_CONSTRUCTOR的专用方法能够自动被调用。

(1)构造方法

■ 构造方法是运行时环境自动调用的一种方法,用于为对象设定一个初始化状态,不能

5

第 14 页 / 共 377 页

在程序运行过程中由程序代码调用。与其他方法类似,构造方法也存在静态和实例两

种形式。

■ 构造方法不一定需要在类中定义,系统通常会自动生成一个默认的构造方法,将对象

状态设置为初始值。

■ 构造方法中不包含任何形式的输出参数,其功能只是定义对象状态,而不是对其进行

改变。

■ 构造方法在Create Object语句中被调用,根据实例构造方法的定义,该语句本身也可

以包含输出参数Exporting和异常返回值Exceptions选项。

■ 类构造方法属于静态方法,只能在程序中被调用一次,即第一次使用该类时被调用,

该方法也必须在公有部分声明,其名称必须为Class_Constructor。

■ 类构造方法不包含接口,而且在其中只能访问类的静态属性。

(2)析构方法

在某些面向对象语言中还存在析构方法的概念,该方法在对象删除过程中被调用,目前

ABAP对象中尚未提供该方法的实现形式。

每个类都有一个隐含的方法,在Java或C++中叫构造函数;在一般语言中,构造函数和

类名相同,但是在ABAP中,有一个保留的名字,叫做Constructor。当调用语句Create Object

创建对象的时候,这个函数会被执行。

构造函数Constructor可以分为实例Constructor以及静态Constructor。对于实例Constructor

(声明的时候使用Methods),可以有Import参数以及Exceptions,而静态Constructor(声明的

时候使用Class-Methods),没有参数传递。

注意:静态构造函数一定会在以下动作之前执行。

■ 创建对象,Create Object。

■ 访问静态属性,Class=>Attribute。

■ 调用静态方法,Call Method_Class=>Method。

■ 注册一个静态事件句柄。

(3)事件

用于一个类对象发布其状态的改变,因而其他对象可以捕获该方法并做出响应。方法是

类的内部处理过程,定义了一个对象的行为。它可以访问所有类的属性,也可以修改对象的

数据内容,还可以有一个参数接口,用户可以通过带参数调用,接收返回值。私有属性只能

通过方法类修改。

对象或者类能够在其他对象或类中通过事件来触发事件处理的方法。在一个一般的方法

调用中,一个方法可以被许多用户调用。当一个事件被触发,一系列事件处理方法可以被调

用。在运行之前,触发器和处理方法之间的联系没有被建立。在一般的方法调用中,调用的

Program决定了它希望调用的方法,这些方法必须存在。根据事件,处理方法确定它希望响应

的事件。对所有的事件不需要注册处理方法。

类的事件可以在类的方法中通过使用RAISE EVENT语句触发。可以通过使用字句FOR

EVENT <evt> OF <class>声明同一个或不同的类的方法作为一个事件处理的方法。

事件有一个与方法相似的参数接口,但是只有输出参数时这些参数通过触发器(RAISE

6

第 15 页 / 共 377 页

EVENT语句)传递给事件处理方法,它把它们作为输入参数接收。

触发器和处理方法之间的联系通过SET HANDLER语句动态建立。触发器和处理方法可

以是对象或类,这取决于使用的是实例还是静态事件或静态处理方法。当一个事件被触发,

相关事件处理方法在所有注册的处理类中执行。

实例事件

可以用EVENTS语句声明实例事件。一个实例事件只能在实例方法中被触发。

静态事件

可以用 CLASS-EVENTS 语句声明静态事件,所有的方法(静态或实例)都可以触发静

态事件。静态事件是只能在静态方法中被触发的事件类型。

1)触发器和处理事件

在ABAP对象中,触发器和处理一个事件意味着特定的方法作为触发器和触发事件执行。

对于其他方法的相应处理器,这意味着当事件触发时处理方法被执行。

在ABAP对象中处理事件有以下两种方法。

■ 在声明部声明事件。

■ 使用它的一个方法触发事件。

事件声明

声明实例事件语法如下所示。

语法: EVENTS <evt> EXPORTING... VALUE(<e>) TYPE type [OPTIONAL]..

i

声明静态事件语法如下所示。

语法: CLASS-EVENTS <evt>...

两个语句都有同样的语法,EXPORTING 字句用于指定传递给事件处理的参数。参数一

般是值传递。实例事件一般包含默认参数 SENDER,它具有与事件声明的接口或类型相关的

类型。

触发事件

实例事件可以被类中的所有方法触发,静态事件可以被静态方法触发。

语法:RAISE EVENT <evt> EXPORTING... <e> = <f >...

i i

对每个没有被定义为正式参数的<e>,必须在EXPORTING字句中传递一个相应的实际参

i

数<f>。自定义的ME自动被传递给默认参数SENDER。

i

2)事件处理

事件处理使用指定的方法,处理事件方法的要求有以下两个。

■ 被定义成为事件的事件处理方法。

■ 在执行时为事件注册。

事件处理方法的声明

所有的类可以包含针对其他类事件的处理方法。当然,也可以在同一个类中定义处理方

法。实例方法的声明语句如下。

语法: METHODS <meth> FOR EVENT <evt> OF <cif> IMPORTING.. <e>..

i

7

第 16 页 / 共 377 页

静态方法使用CLASS-METHODS来代替METHODS。<evt>是在类或接口中的一个事件

声明。

一个处理方法的接口只能包含在事件<evt>声明中定义的正式参数中。参数属性也由事件

使用。处理方法不一定需要使用RAISE EVENT语句所传递的所有参数,如果希望使用默认

参数 SENDER,必须在接口中包含。这个参数允许一个实例事件处理访问触发器,例如,允

许它返回结果。

一旦在类中定义了事件处理方法,这意味着类的实例或类本身在理论上能够处理在一个

方法中触发的事件<evt>。

注册事件处理方法

为一个事件处理方法响应事件,必须在运行触发器时确定哪个用于响应。通过以下语句

实现。

语法: SET HANDLER... <h>... [FOR]...

i

它将处理方法清单和相应的触发方法联系起来。事件有四个不同的方法:

■ 在类中声明的实例事件。

■ 在接口中声明的实例事件。

■ 在类中声明的静态事件。

■ 在接口中声明的静态事件。

针对以上四种情况,SET HANDLER语句语法和作用是不同的。

对于实例事件,可以使用FOR字句来指定实例需要注册的处理。也可以指定一单个实例

作为触发器,使用关联变量<ref>。

语法: SET HANDLER... <h>...FOR <ref>.

i

或者可以为所有能够触发事件的实例注册处理方法。

语法: SET HANDLER... <h>...FOR ALL INSTANCES.

i

然后,注册器为在注册处理时还没有建立的触发实例提供事件。可以使用FOR字句定义

静态事件。

语法: SET HANDLER... <h>...

i

注册器自动提供给整个类,或者给所有实现含静态事件接口的类。对于接口,注册器还

应用于那些在动态运行中直到处理程序的类。

3)事件处理的生命期

在RAISE EVENT后,所有注册的处理方法在下一个语句处理之前被执行(同步事件处

理)。如果一个处理方法自己触发事件,则它的处理方法在初始处理方法之前。为避免无穷的

递归,事件处理一般只嵌套64层。

处理方法根据它们被定义的顺序执行,一旦事件处理被动态注册,则不能认为它们在特

定的顺序执行,相反,必须认为所有的事件处理会同步执行。

注:在ABAP中,接口需要另外实施(其实就是在类中实施),同时又独立于类。在接口

8

第 17 页 / 共 377 页

中只有声明部分,而没有具体的实施部分。

■ 接口必须在类的公共部分列出(Public Section)。

■ 接口中的操作在类中实现,并且作为类的方法;所有接口中的方法必须在类的实现部

分实施。

■ 在接口中定义的属性、事件、常量、类型等在声明它的类中自动可见。

■ 实施接口的方法:Interface~Component Name。

2.成员的可见性

成员的可见性是基于封装原则确定的。

(1)PUBLIC SECTION

公有部分定义的类成员可以被所有对象使用,包括类方法及其派生类中定义的方法。这

些组件构成了类的外界接口部分。

(2)PROTECTED SECTION

保护部分中定义的类成员只能被类及其派生类中的方法使用,外部不可见,这些组件连

同公有组件构成了类和派生类对象之间的接口。在4.5B中,继承是无效的,所以Protected 范

围与Private相同。

(3)PRIVATE SECTION

类成员只能被类本身的方法使用。

注:

公有属性(Public Attributes)定义在Public Section中,其内容可以在类的外部看到或者

修改。尽量减少公共属性,其原因可以参考面向对象语言的特性—封装。尽可能在类的内

部修改属性,留给外部的只有接口,避免外部直接操作类里面的属性(或称数据)。

只能在类的内部访问或者修改的数据,定义在Private Section里面。

在类中,每个静态属性都是唯一的。属性的值在所有类的实例中是相同的。用class-data

声明。

保护属性(Protected Attributes)定义在Protected Section里面,其作用是更改区域里面的

属性或者方法,不能被外部调用,但是在它的子类中是可见的。也就是说,其子类可以访问

Protected Section中的数据,这和Private Section是不同的。

Public Method、Private Method、Static Method、Protected Method及其对应的属性同上。

1)使用对象的一般步骤

● 定义类的声明与方法实现。

● 使用DATA语句中的TYPE REF TO选项参照类类型声明引用变量。

● 使用CREAT OBJECT语句创建对象。

● 通过-> 或=>运算符访问对象或类组件。

2)访问对象组件

对象是ABAP程序所获得内存空间里的一个类的实例。首先在DATA声明里用TYPE REF

TO <类>声明ABAP数据类型,然后用CREATE OBJECT创建类的实例。也可以用MOVE对

兼容的对象之间赋值,以后就可以使用。

9

第 18 页 / 共 377 页

3)访问内容语法格式

● 一个对象的实例属性或静态属性oref-> attr。

● 类的静态属性class=>attr。

● 在类内部访问自身实例属性或静态属性me->attr 或attr。

● 对象的实例属性或静态方法CALL METHOD oref->meth。

● 类的静态方法CALL METHOD class=>meth。

● 在类内部访问自身实例方法或静态方法 CALL METHOD me->attr 或 CALL

METHOD attr。

1.1.5 接口

当有些类具有相同的功能却有不同的行为时,就产生了接口的概念。接口这样描述自己:

“对于实现所有类,看起来都应该像现在这个样子”。因此,采用了一个特定接口,所有代码

都知道对于那个接口可能会调用什么方法。所以常把接口用于建立类和类之间的一个“协议”。

有些面向对象的程序设计语言采用了一个名为“Protocol”(协议)的关键字,它做的便是与

接口相同的事情。接口只有声明部分,并不提供实现的细节。

1.接口的定义与实现

对象引用包括类引用和接口引用,通过ABAP类的实例及引用可构建各种商业应用模块

及其中的元素。

接口是一个独立结构,可以在其中定义一些成员并在具体类中实现,其作用是对类中已

定义的成员进行扩展。实现接口后,其成员将成为公有成员,但类可自行对接口中的方法以

自身特定形式实现。

1)定义接口:与类的定义相似,接口作为独立R/3 Repository的对象在Class Builder中

定义,也可以依附于程序在ABAP程序中定义(本地类)。

2)实现接口:接口没有自己的实例,因而不需要进行实现,其实现通过具体类进行。

注:接口intf中的成员icomp在类内部实现过程以名称inf~imeth的形式出现。

接口的实现只能出现在公有部分,接口中定义的所有组件都将被添加为该类的公有成员。

在类的实现部分须包含所有的接口方法。

一个接口可被任意多个不同类实现,该接口中定义的成员集在各个类中名称相同,然而

实现方法不同,也就体现了多态性。若一个类中除了接口之外没有定义任何类自身的公有成

员方法,则接口就成为了该类的全部“外部接口”。

2.接口的定义方法

接口跟类一样,也有全局接口和本地接口。

1)全局接口的定义由类定义工具实现(事务码SE24)。

2)本地接口的定义

本地接口封装在INTERFACE...ENDINTERFACE中,包含所有的部件(属性、方法、事

件)。所有的部件不能包含可视部分,并且自动会被声明为PUBLIC。

INTERFACE <intf>.

10

第 19 页 / 共 377 页

……(省略完整代码)

ENDINTERFACE

由于接口没有实现部分,它是在类中实现的。类中对接口的声明如下:

INTERFACES <intf>.

3)类中接口部件的实现

类实现部分对接口方法的实现如下:

METHOD <intf~imeth>.

……(省略完整代码)

ENDMETHOD.

3.接口引用

引用变量也可以基于接口声明变量,即接口引用(一种对象引用)。除通过类引用访问之

外,还可以通过引用进行访问,因为接口引用可以指向任何实现了该接口的对象。

通过TYPES或DATA语句中的TYPE REF TO项进行:

TYPES|DATA iref TYPE REF TO intf.

其中intf是全局或程序中已定义的接口,iref接口引用 iref->icomp访问。其可访问当前

指向对象的接口中的可见成员,其方法可以在对象类中实现。

1)通过接口引用访问对象

访问一个类对象,须先声明一个基于该类的引用变量,若该类为一个接口实现,则可将

该引用变量赋给一个接口变量,接口变量名 iref,类引用 cref,iref=cref。若接口中还含有实

例属性attr和实例方法meth,如:

cref->inth~attr. CALLMETHOD cref->intf~meth.

iref->attr CALLMETHOD iref->meth.

对于接口中定义静态成员,若是常量,则只能通过接口引用访问;其他静态接口成员,

可通过类本身或类引用。如:

intf=>const

class=>intf~attr CALL METHOD class=>intf~meth.

2)在接口引用间赋值

可将接口引用分配给不同引用变量,还可以在类引用和接口引用之间相互赋值。若类引

用cref为相同的接口或类,可直接赋值。如:

iref1=iref2. iref=cref.

两者不参照同一接口声明,或 iref2 是参照接口 iref1 的一个成员,强制赋值运算符 ?=

可使接口数据间进行数据交换。

MOVE iref ?TO cref.

cref ?= iref. //不允许时会触发MOVE_CAST_ERROR。

11

第 20 页 / 共 377 页

类引用为Object参照或强制赋值;接口引用与类引用cref的参照类相同。

3)接口的使用

先用TYPE REF TO 和DATA声明接口变量,但不能用CREAT来创建实例,而是通过参

考其他已存在的类变量或接口变量来代替。

(1)接口实例组件的两种使用方法

通过类实例使用:

使用属性 <attr>: <cref>-><intf~attr>

调用方法 <meth>: CALL METHOD <cref>-><intf~meth>

通过接口变量使用:

使用属性<attr>: < iref>-><attr>

调用方法<meth>: CALL METHOD <iref>-><meth>

(2)接口静态组件的使用方法

常量可以使用:

使用常量 <const>: < intf>=><const>

其他静态组件必须使用:

使用静态属性 <attr>: < class>=><intf~attr>

调用静态方法 <meth>: CALL METHOD <class>=><intf~meth>

1.2 本地类的实现

1.2.1 程序设计

程序源码设计如下:

*----------------------------------------------------------------------*

*

* Program ID :ZYOO_TEST

* Program Description :成绩表

* Create User :BCUSER

* Create Date :2011/02/20

*

*----------------------------------------------------------------------*

* Function Overview

* 以面向对象方式把成绩表显示出来

* 技术点:本地面向对象定义,声明,使用

*----------------------------------------------------------------------*

*

* Change List :

* change NO. Change Date Change User Change Detail

12

第 21 页 / 共 377 页

* 0000001 2011/02/20 BCUSER

*----------------------------------------------------------------------*

REPORT ZYOO_TEST

NO STANDARD PAGE HEADING

LINE-SIZE 120

LINE-COUNT 90(03)

MESSAGE-ID ZTESTMSG.

*----------------------------------------------------------------------*

* INCLUDE

*----------------------------------------------------------------------*

INCLUDE: ZTEST0N, "常量定义

ZTEST0F. "Form定义

*----------------------------------------------------------------------*

* TABLES:

*----------------------------------------------------------------------*

TABLES: ZTTEST_T.

*----------------------------------------------------------------------*

* CONSTANTS

*----------------------------------------------------------------------*

CONSTANTS: LINE88 TYPE I VALUE 88.

*----------------------------------------------------------------------*

* DATA

*----------------------------------------------------------------------*

DATA: BEGIN OF FLG,

CLS_FRST TYPE C VALUE CNS-OFF, "班级起始

END OF FLG.

*----------------------------------------------------------------------*

* CLASS-DATA

*----------------------------------------------------------------------*

* 接口定义

INTERFACE TEST .

METHODS: GET_NAME ,GET_DETAIL,GET_ALL.

EVENTS NOT_FOUND EXPORTING VALUE(ID) TYPE ANY.

ENDINTERFACE. "TEST

*----------------------------------------------------------------------*

* CLASS CLS_TEACHER DEFINITION

*----------------------------------------------------------------------*

* 教师信息表

*----------------------------------------------------------------------*

CLASS CLS_TEACHER DEFINITION .

13

第 22 页 / 共 377 页

PUBLIC SECTION.

DATA ZTNUMBER TYPE ZMTNUMBER_T-ZTNUMBER. "教师番号

* 接口使用

INTERFACES: TEST.

ALIASES :GET_TEACHER_NAME FOR TEST~GET_NAME ,

GET_TEACHER_DETAIL FOR TEST~GET_DETAIL ,

GET_TEACHER_ALL FOR TEST~GET_ALL ,

NO_TEACHER_FOUND FOR TEST~NOT_FOUND.

* 事件触发方法

METHODS :ERROR_HANDLE FOR EVENT NO_TEACHER_FOUND

OF CLS_TEACHER IMPORTING ID.

PROTECTED SECTION.

DATA: ZTNAME TYPE ZMTNUMBER_T-ZTNAME, "姓名

ZTSEX TYPE ZMTNUMBER_T-ZTSEX, "性别

ZZMOBILE TYPE ZMTNUMBER_T-ZZMOBILE."联系电话

PRIVATE SECTION.

DATA: TEACHER TYPE ZMTNUMBER_T .

ENDCLASS. "CLS_TEACHER DEFINITION

*----------------------------------------------------------------------*

* CLASS CLS_TEACHER IMPLEMENTATION

*----------------------------------------------------------------------*

* 教师信息表

*----------------------------------------------------------------------*

CLASS CLS_TEACHER IMPLEMENTATION.

* 取得教师姓名

METHOD GET_TEACHER_NAME .

SELECT SINGLE ZTNAME "姓名

FROM ZMTNUMBER_T "教师信息表

INTO ME->ZTNAME "姓名

WHERE ZTNUMBER = ME->ZTNUMBER .

IF SY-SUBRC <> 0.

RAISE EVENT NO_TEACHER_FOUND EXPORTING ID = ME->ZTNUMBER.

ENDIF.

ENDMETHOD. "GET_TEACHER_NAME

* 取得教师详细

METHOD GET_TEACHER_DETAIL .

SELECT SINGLE ZTNAME ZTSEX ZZMOBILE

FROM ZMTNUMBER_T

INTO (ME->ZTNAME,ME->ZTSEX ,ME->ZZMOBILE )

WHERE ZTNUMBER = ME->ZTNUMBER .

IF SY-SUBRC <> 0.

RAISE EVENT NO_TEACHER_FOUND EXPORTING ID = ME->ZTNUMBER.

14

第 23 页 / 共 377 页

ENDIF.

ENDMETHOD. "GET_TEACHER_DETAIL

* 取得教师信息

METHOD GET_TEACHER_ALL .

SELECT SINGLE *

FROM ZMTNUMBER_T

INTO ME->TEACHER

WHERE ZTNUMBER = ME->ZTNUMBER .

IF SY-SUBRC <> 0.

RAISE EVENT NO_TEACHER_FOUND EXPORTING ID = ME->ZTNUMBER.

ENDIF.

ENDMETHOD. "GET_TEACHER_ALL

* 输出错误信息

METHOD ERROR_HANDLE .

MESSAGE E001 WITH ID.

ENDMETHOD. "error_handle

ENDCLASS. "CLS_TEACHER IMPLEMENTATION

*----------------------------------------------------------------------*

* CLASS CLS_TEACHER DEFINITION

*----------------------------------------------------------------------*

* 学生信息表

*----------------------------------------------------------------------*

CLASS CLS_STUDENT DEFINITION CREATE PROTECTED FRIENDS TEST .

PUBLIC SECTION.

DATA ZZNUMBER TYPE ZMNUMBER_T-ZZNUMBER. "学生编号

* 构造函数,初始化该类的实例

METHODS:CONSTRUCTOR IMPORTING SID TYPE ZMNUMBER_T-ZZNUMBER.

* 接口使用

INTERFACES: TEST.

ALIASES :GET_STUDENT_NAME FOR TEST~GET_NAME ,

GET_STUDENT_DETAIL FOR TEST~GET_DETAIL ,

GET_STUDENT_ALL FOR TEST~GET_ALL ,

METHODS:ERROR_HANDLE FOR EVENT NO_STUDENT_FOUND OF CLS_STUDENT

IMPORTING ID.

PROTECTED SECTION.

DATA: ZZNAME TYPE ZMNUMBER_T-ZZNAME, "姓名

ZZSEX TYPE ZMNUMBER_T-ZZSEX, "性别

ZZFNAME TYPE ZMNUMBER_T-ZZFNAME, "父亲

ZZMNAME TYPE ZMNUMBER_T-ZZMNAME, "母亲

ZZMOBILE TYPE ZMNUMBER_T-ZZMOBILE, "联系电话

ZZADDR TYPE ZMNUMBER_T-ZZADDR. "家庭住址

PRIVATE SECTION.

15

第 24 页 / 共 377 页

DATA: STUDENT TYPE ZMNUMBER_T .

ENDCLASS. "CLS_STUDENT DEFINITION

*----------------------------------------------------------------------*

* CLASS CLS_STUDENT IMPLEMENTATION

*----------------------------------------------------------------------*

* 学生信息表

*----------------------------------------------------------------------*

CLASS CLS_STUDENT IMPLEMENTATION.

* 构造函数声明

METHOD CONSTRUCTOR.

ME->ZZNUMBER = SID.

SET HANDLER ERROR_HANDLE FOR ALL INSTANCES.

ENDMETHOD. "CONSTRUCTOR

* 取得学生姓名

METHOD GET_STUDENT_NAME .

SELECT SINGLE ZZNAME

FROM ZMNUMBER_T

INTO ME->ZZNAME

WHERE ZZNUMBER = ME->ZZNUMBER .

IF SY-SUBRC <> 0.

RAISE EVENT NO_STUDENT_FOUND EXPORTING ID = ME->ZZNUMBER.

ENDIF.

ENDMETHOD. "GET_STUDENT_NAME

* 取得学生详细

METHOD GET_STUDENT_DETAIL .

SELECT SINGLE ZZNAME ZZSEX ZZFNAME ZZMNAME ZZMOBILE ZZADDR

FROM ZMNUMBER_T

INTO (ME->ZZNAME,ME->ZZSEX ,ME->ZZFNAME, ME->ZZMNAME,

ME->ZZMOBILE ,ME->ZZADDR)

WHERE ZZNUMBER = ME->ZZNUMBER .

IF SY-SUBRC <> 0.

RAISE EVENT NO_STUDENT_FOUND EXPORTING ID = ME->ZZNUMBER.

ENDIF.

ENDMETHOD. "GET_STUDENT_DETAIL

* 取得学生信息

METHOD GET_STUDENT_ALL .

SELECT SINGLE *

FROM ZMNUMBER_T

INTO ME->STUDENT

WHERE ZZNUMBER = ME->ZZNUMBER .

IF SY-SUBRC <> 0.

RAISE EVENT NO_STUDENT_FOUND EXPORTING ID = ME->ZZNUMBER.

ENDIF.

ENDMETHOD. "GET_STUDENT_ALL

16

第 25 页 / 共 377 页

METHOD ERROR_HANDLE .

MESSAGE E001 WITH ID.

ENDMETHOD. "error_handle

ENDCLASS. "CLS_STUDENT IMPLEMENTATION

*----------------------------------------------------------------------*

* CLASS CLS_CLASS DEFINITION

*----------------------------------------------------------------------*

* 班主任表

*----------------------------------------------------------------------*

CLASS CLS_CLASS DEFINITION INHERITING FROM CLS_TEACHER .

PUBLIC SECTION.

DATA: ZZCLASS TYPE ZCCLASS_T-ZZCLASS , "班级

ZZCLSNAME TYPE STRING, "班级名称

ZZTEANOM TYPE ZCCLASS_T-ZZTEANOM, "班主任

ZZTEANOS TYPE ZCCLASS_T-ZZTEANOS, "副班主任

ZTNAMEM TYPE ZMTNUMBER_T-ZTNAME, "班主任名

ZTNAMES TYPE ZMTNUMBER_T-ZTNAME. "副班主任名

* 取得班级名称

METHODS:GET_CLASS_DOMAIN .

EVENTS: NO_CLASS_FOUND

EXPORTING VALUE(CLSID) TYPE ZCCLASS_T-ZZCLASS.

* 声明友类

DATA TEACHER TYPE REF TO CLS_TEACHER.

* 取得班级详细信息

METHODS: GET_CLASS.

* 取得班级错误处理

METHODS:NODATA_HANDLE FOR EVENT NO_CLASS_FOUND OF CLS_CLASS

IMPORTING CLSID.

ENDCLASS. "XXXX DEFINITION

*----------------------------------------------------------------------*

* CLASS CLS_CLASS IMPLEMENTATION

*----------------------------------------------------------------------*

* 班主任表

*----------------------------------------------------------------------*

CLASS CLS_CLASS IMPLEMENTATION.

* 班级信息取得

METHOD GET_CLASS .

SELECT SINGLE ZZTEANOM ZZTEANOS

FROM ZCCLASS_T

INTO (ME->ZZTEANOM,ME->ZZTEANOS)

WHERE ZZCLASS = ME->ZZCLASS ."班级

IF SY-SUBRC <> 0.

17

第 26 页 / 共 377 页

RAISE EVENT NO_CLASS_FOUND EXPORTING CLSID = ME->ZZCLASS.

ELSE.

SET HANDLER ERROR_HANDLE FOR ALL INSTANCES.

ME->ZTNUMBER = ZZTEANOM.

CALL METHOD ME->GET_TEACHER_NAME.

ME->ZTNAMEM = ME->ZTNAME .

ME->ZTNUMBER = ZZTEANOS.

CALL METHOD ME->GET_TEACHER_NAME.

ME->ZTNAMES = ME->ZTNAME .

ENDIF.

ENDMETHOD. "GET_CLASS

* 取得班级名称

METHOD GET_CLASS_DOMAIN .

SELECT SINGLE DD07T~DDTEXT "域固定值文本

FROM DD07T INNER JOIN DD07L "内结合

ON DD07T~DOMNAME = DD07L~DOMNAME "结合条件

AND DD07T~VALPOS = DD07L~VALPOS

WHERE DD07L~DOMNAME = 'ZZCLASS_D' "域名相等

AND DD07L~DOMVALUE_L = ME->ZZCLASS. "域固定值相等

IF SY-SUBRC <> 0.

RAISE EVENT NO_CLASS_FOUND EXPORTING CLSID = ME->ZZCLASS.

ENDIF.

ENDMETHOD. "GET_CLASS_DOMAIN

METHOD NODATA_HANDLE .

MESSAGE E001 WITH CLSID.

ENDMETHOD. "error_handle

ENDCLASS. "CLS_CLASS IMPLEMENTATION

*----------------------------------------------------------------------*

* CLASS CLS_TEST DEFINITION

*----------------------------------------------------------------------*

* 成绩表

*----------------------------------------------------------------------*

CLASS CLS_TEST DEFINITION INHERITING FROM CLS_CLASS .

PUBLIC SECTION.

DATA: ZZYEAR TYPE ZZTEST_S-ZZYEAR, "学年

ZZSTDNOF TYPE ZZTEST_S-ZZSTDNO, "学号From

ZZSTDNOT TYPE ZZTEST_S-ZZSTDNO, "学号To

TEST TYPE TABLE OF ZZTEST_S , "成绩表

H_TEST TYPE ZZTEST_S . "成绩表

EVENTS: NO_TEST_DATA

18

第 27 页 / 共 377 页

EXPORTING VALUE(CLASS) TYPE ZCCLASS_T-ZZCLASS

VALUE(YEAR) TYPE ZTTEST_T-ZZYEAR.

METHODS: GET_TEST IMPORTING CLASS TYPE ZCCLASS_T-ZZCLASS

YEAR TYPE ZTTEST_T-ZZYEAR.

METHODS:NOTEST_HANDLE FOR EVENT NO_TEST_DATA OF CLS_TEST

IMPORTING CLASS YEAR.

ENDCLASS. "CLS_TEST DEFINITION

*----------------------------------------------------------------------*

* CLASS CLS_TEST IMPLEMENTATION

*----------------------------------------------------------------------*

* 成绩表

*----------------------------------------------------------------------*

CLASS CLS_TEST IMPLEMENTATION.

* 成绩表数据抽取

METHOD GET_TEST .

SELECT ZZCLASS "班级

ZZYEAR "学年

ZZSTDNO "学号

ZZTENKOK "语文

ZZTENSAN "数学

ZZTENRIK "自然

ZZTENSHA "思品

FROM ZTTEST_T "成绩表

INTO CORRESPONDING FIELDS OF TABLE TEST "成绩内部表

WHERE ZZCLASS = CLASS "班级

AND ZZYEAR = YEAR "学年

IF SY-SUBRC <> 0.

RAISE EVENT NO_TEST_DATA

EXPORTING CLASS = CLASS YEAR = YEAR.

ELSE.

DATA STUDENT TYPE REF TO CLS_STUDENT .

LOOP AT TEST INTO H_TEST.

CREATE OBJECT STUDENT

EXPORTING

SID = H_TEST-ZZSTDNO.

CALL METHOD STUDENT->GET_STUDENT_NAME.

H_TEST-ZZNAME = STUDENT->ZZNAME.

MODIFY TEST FROM H_TEST.

ENDLOOP.

ENDIF.

ENDMETHOD. "GET_TEST

METHOD NOTEST_HANDLE.

19

第 28 页 / 共 377 页

MESSAGE E005 WITH CLASS YEAR.

ENDMETHOD. "error_handle

ENDCLASS. "cls_TEACHER IMPLEMENTATION

* 成绩表对象声明

DATA TEST TYPE REF TO CLS_TEST.

*----------------------------------------------------------------------*

* PARAMETERS

*----------------------------------------------------------------------*

PARAMETERS: P_CLASS TYPE ZTTEST_T-ZZCLASS "班级

OBLIGATORY . "必须

PARAMETERS P_YEAR TYPE ZTTEST_T-ZZYEAR OBLIGATORY. "学年

*----------------------------------------------------------------------*

* SELECT-OPTIONS

*----------------------------------------------------------------------*

SELECT-OPTIONS S_STDNO FOR ZTTEST_T-ZZSTDNO "学号

MATCHCODE OBJECT ZZMCSBID.

*----------------------------------------------------------------------*

* INITIALIZATION

*----------------------------------------------------------------------*

INITIALIZATION.

* 数据初始化

PERFORM DATA_INIT

USING

P_CLASS "班级

P_YEAR. "学年

CREATE OBJECT TEST.

SET HANDLER TEST->NOTEST_HANDLE FOR ALL INSTANCES.

SET HANDLER TEST->NODATA_HANDLE FOR ALL INSTANCES.

*----------------------------------------------------------------------*

* AT SELECTION SCREEN

*----------------------------------------------------------------------*

AT SELECTION-SCREEN.

* 选择画面项目检查-班级

PERFORM CLASSOO_INPUT_CHECK.

* 选择画面项目检查-学年

PERFORM YEAR_INPUT_CHECK USING P_YEAR TEXT-001.

*----------------------------------------------------------------------*

20

第 29 页 / 共 377 页

*START-OF-SELECTION

*----------------------------------------------------------------------*

START-OF-SELECTION.

* 报表数据初始化

PERFORM REPORT_DATA_INIT.

* 报表数据选择

PERFORM REPORT_DATA_SELECT.

* 报表数据打印

PERFORM REPORT_DATA_EXE.

*----------------------------------------------------------------------*

* END-OF-SELECTION

*----------------------------------------------------------------------*

END-OF-SELECTION.

* 报表程序终了处理

PERFORM REPORT_EDIT_END.

*----------------------------------------------------------------------*

* TOP-OF-PAGE

*----------------------------------------------------------------------*

TOP-OF-PAGE.

* 报表页眉编辑

PERFORM REPORT_HEADER_EDIT.

*----------------------------------------------------------------------*

* END-OF-PAGE

*----------------------------------------------------------------------*

END-OF-PAGE.

* 报表页脚编辑

PERFORM REPORT_FOOTER_EDIT.

*&---------------------------------------------------------------------*

*& Form CLASS_INPUT_CHECK

*&---------------------------------------------------------------------*

* 选择画面项目检查-班级

*----------------------------------------------------------------------*

FORM CLASSOO_INPUT_CHECK .

TEST->ZZCLASS = P_CLASS.

CALL METHOD TEST->GET_CLASS_DOMAIN.

CALL METHOD TEST->GET_CLASS.

ENDFORM. " CLASS_INPUT_CHECK

*&---------------------------------------------------------------------*

*& Form REPORT_DATA_INIT

21

第 30 页 / 共 377 页

*&---------------------------------------------------------------------*

* 报表数据初始化

*----------------------------------------------------------------------*

FORM REPORT_DATA_INIT.

* 内部表初始化

CLEAR: TEST->H_TEST. "成绩表头

REFRESH: TEST->TEST. "成绩表

ENDFORM. " REPORT_DATA_INIT

*&---------------------------------------------------------------------*

*& Form REPORT_DATA_SELECT

*&---------------------------------------------------------------------*

* 报表数据选择

*----------------------------------------------------------------------*

FORM REPORT_DATA_SELECT .

TEST->ZZSTDNOF = S_STDNO-LOW.

TEST->ZZSTDNOT = S_STDNO-HIGH.

CALL METHOD TEST->GET_TEST

EXPORTING

CLASS = P_CLASS

YEAR = P_YEAR.

ENDFORM. " REPORT_DATA_SELECT

*&---------------------------------------------------------------------*

*& Form REPORT_DATA_EXE

*&---------------------------------------------------------------------*

* 报表数据打印

*----------------------------------------------------------------------*

FORM REPORT_DATA_EXE .

CHECK TEST->TEST[] IS NOT INITIAL.

LOOP AT TEST->TEST INTO TEST->H_TEST. "成绩内部表

CLEAR FLG-CLS_FRST. "班级表示清空

AT NEW ZZCLASS. "新班级

MOVE CNS-ON TO FLG-CLS_FRST. "班级标示设ON

ENDAT .

RESERVE 3 LINES.

* 报表明细编辑

PERFORM EDIT_REPORT_DTL.

AT END OF ZZCLASS . "班级最后

* 报表挂线

22

返回ABAP参考资料列表