You are on page 1of 224

SAP BC400 课程

中文自学笔记
强晟 2007年5月29日 v1.0
E-mail:qiangsheng@gmail.com
前言
• 从去年 5 月我开始接触 SAP 到现在,已经整整一年多了。刚开始的
时候,网上能找到的资料非常少,中文的更少。所幸随着 SAP 在国
内的用户越来越多,相关资料也多了起来,最好的当属 SAP help 和
标准教程。
• 其中 SAP help 是随软件发布的最完整联机帮助系统,可以跟软件的
相关功能模块无缝连接,但是由于其庞大,往往让人望而却步。
• 相对而言,标准教程就更加适合学习,它是以教学为目的,按照一般
教学方法编写的一系列教材,分 Level 100、Level 200 和 Level 300
三个级别,表示其难度,100 最基础,200 比较深入,300 最高级。
• 虽然 SAP 自称标准教程不适用于自学,但主要还是因为标准培训通
常包含了大量示例,需要在 SAP 的专用培训服务器上进行讲授,而
教程本身并不附带相关的示例代码。其实从教程本身编写来说,还是
非常清晰易懂的。

• 从我这一年的 SAP 经验来说,假如最开始顾问公司就能给我们提供


标准教程的培训,估计现在我们内部团队的实力会强得多。
• 为了让更多的 SAP 入门用户不致再重蹈我的覆辙,我将自己学习标
准教程的笔记贡献给大家,希望对大家有所帮助。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 2
目录

• 课程概览
• 第一单元:ABAP程序的执行流程
• 第二单元:ABAP工作台简介
• 第三单元:ABAP字典简介
• 第四单元:ABAP语言的基本元素
• 第五单元:数据获取

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 3
目录

• 第六单元:程序分析工具
• 第七单元:在ABAP中使用子程序
• 第八单元:ABAP事件简介
• 第九单元:用户会话
• 第十单元:组件重用
• 第十一单元:调整SAP标准软件(概览)

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 4
课程概览

• BC400这门课程主要介绍SAP的编程语言
ABAP以及ABAP的开发环境ABAP工作
台,做为入门课程将面向一般概念和基本
原理,当然还要介绍一些相关技术,以利
于后面其他课程的学习。
• 课程中将使用大量实例帮助理解课程中讲
到的概念,让学员用ABAP工作台快速构建
高性能的商业应用。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 5
课程概览
• 课程目标
– 理解和使用基本ABAP语法元素
– 实现不同类型的用户会话
– 程序读取访问数据库
– 使用ABAP工作台开发工具
– 理解开发过程是如何组织和传输的
• 学习本课程后应该可以
– 创建包含用户会话和数据库访问的ABAP程序
– 说明不同开发对象类型和它们的主要用途
– 用合适的工具创建出说明开发对象功能的简单例子

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 6
第一单元 ABAP程序的执行流程

• 单元目标
本单元完成后,应该能:
– 描述SAP NetWeaver应用服务器的结构原理
– 描述简单的会话程序如何被ABAP运行时环境
处理

• 本单元的课程为
– SAP R/3的系统结构
– 使用选择屏幕和清单的ABAP程序示例

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 7
第一单元 ABAP程序的执行流程
第一课 系统架构

表示层
SAPGUI SAPGUI SAPGUI SAPGUI SAPGUI SAPGUI

分配器 分配器

应用层

工作进程 工作进程 工作进程 工作进程

数据库层 工作进程 工作进程 工作进程 工作进程

SAP NetWeaver 应用服务器的客户端/服务器架构图


SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 8
第一单元 ABAP程序的执行流程
第一课 系统架构
• SAP NetWeaver 应用服务器 具有模块化架构,
遵循面向软件的客户端/服务器原则。
面向软件
• 在 SAP NetWeaver 应用服务器 中,表示层、应
用逻辑和数据存储可以分派给不同的系统,这就
使整个系统具有良好的可伸缩性。 可伸缩性
• 虽说 SAP 自己的提法是 C/S 架构,但实际上使
用的就是现在流行的三层结构,即浏览器/应用服
务器/数据库,而且在可伸缩性和平台上做的非常
之好。
它的 SAPGUI 虽说是个传统客户端软件,但具有
浏览器的某些特性,客户端并没有事先画好的屏
幕,所有屏幕布局都是从应用服务器传输过来的。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 9
第一单元 ABAP程序的执行流程
第一课 系统架构
• 最底层是数据库层。SAP
数据库层 自己并不提供底层数据库,而
使用其他厂商的数据库管理系统(支持所有主流数据库)。
只有 SAP 自身管理和运行所需的程序和元数据没有保存
在数据库里,而应用系统运行的几乎所有数据都存储在数
据库中。
• ABAP 程序运行在应用服务层。ABAP
应用服务层 程序包括 SAP 提
供的标准程序和我们自己开发的程序。ABAP 程序从数据
库读数据,处理数据,有可能还要储存数据。
• 第三层是表示层。这一层就是用户界面,用户可以通过它
表示层
访问程序,输入数据,接收工作进程处理的结果。SAP把
表示层也称为服务器,因为它的工作模式跟web浏览器类
似,负责把应用服务器传来的界面布局数据转换成用户可
浏览的界面,这种处理也可以称为一种“服务”。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 10
第一单元 ABAP程序的执行流程
第一课 系统架构
• 在 SAP 系统中,软件的技术分布完全独立与它
所安装硬件的物理位置。
• 从纵向上说,所有三层既可以安装在同一台计算
机上,也可以各层独立安装在各自的计算机上。
• 从横向上说,表示层和应用层可以分别安装在任
意多的计算机上。
• 而数据库组件的横向安装能力则取决于数据库管
理系统本身的设计(也就是说,只要数据库管理
系统支持多机分布安装,SAP 就支持对它的多机
访问)。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 11
第一单元 ABAP程序的执行流程
第一课 系统架构
表示层
• 前面那个复杂的三层结构图可
以简化成左图的样子,在本课
程中,我们更关心一个用户和
一个
一个 ABAP 程序之间的交互。
• 应用服务器上,包括用户分配
器在内的扩展进程对我们理解
应用层

工作进程 ABAP 程序运行并不是非常重


ABAP程序 要,因此我们这个图中没有明
确区分分配器和工作进程,只
有当与我们所讲的 ABAP 程序
相关时,才会详细介绍。
数据库层

• ABAP 程序运行在应用服务器
上,用户会话和
用户会话 数据库访问的
数据库访问
设计显得更为重要。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 12
第一单元 ABAP程序的执行流程
第一课 系统架构
表示层
• 从用户角度看,他只关心业
Dynpro
Dynpro 务流转和数据的输入输出,
而根本无需关注技术层面的
Selection
Selection Screen
Screen 程序。因此,对用户来说,
List
List
SAP 系统的应用层和数据库
就是一个黑盒(Black Box)。
应用层

• 从技术角度讲,有三种类型
的屏幕:标准屏幕、选择屏
黑 幕和清单,每种屏幕为用户
数据库层

提供不同的服务。程序员应
盒 该根据任务的需要,为用户
提供合适的屏幕。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 13
第一单元 ABAP程序的执行流程
第二课 程序运行示例

程序开始

ABAP程序

ABAP ABAP程序块 ABAP程序块


运行时系统

数据表

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 14
第一单元 ABAP程序的执行流程
第二课 程序运行示例
• 上页图说明了在各个服务层之间的数据交互,需
要说明的是,实际处理时应用层与数据库的交互
比上图中更为频繁,不仅仅在处理用户操作时才
读写数据库。后面的例子会详细说明这一过程。
• 当用户触发一个操作,例如按了回车、功能键、
菜单、按钮等时,就会把控制权从表示层传递给
应用层。
• 只有跟用户操作相关的那部分程序会被执行。
• 如果在程序中触发了其他会话,系统会把屏幕传
递给表示层,同时交出控制权。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 15
第一单元 ABAP程序的执行流程
第二课 程序运行示例
1 • 1、程序开始
程序开始 – 用户登录到系统之后,就
会出现初始屏幕,在初始
屏幕里,可以通过菜单路
径或事务码来启动 ABAP
程序。
– 知识库(Repository),
它是 SAP 系统中非常重
要的组成部分,负责存储
系统运行的基本数据,例
如:程序库、数据字典、
ABAP 对象等,被保存在
数据库中,后面会专题讲
知识库 数据表 解它。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 16
第一单元 ABAP程序的执行流程
第二课 程序运行示例
2

程序开始

数据对象 ABAP程序
ABAP
ABAP xxx: xxx 程序块
选择屏幕
运行时系统 xxx: xxx xxx xxx

知识库 数据表

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 17
第一单元 ABAP程序的执行流程
第二课 程序运行示例

• 2、系统读取程序上下文
– 上下文(Context),在汉语里面还真没什么合适的词
可以跟这个英文单词对应的,只可意会不可言传。
– 系统在程序开始后,会把所有程序上下文读到应用服
务器上。程序上下文包括:存储变量和复杂对象的内
存区,用户会话的屏幕信息,ABAP程序块等。上述的
这些东西都存储在知识库中。
– 上页的例子里,用到了一个选择屏幕与用户交互,一
个变量和一个结构,还有一个ABAP程序块。显示数据
的清单则根据用户输入动态生成。
– ABAP 运行时环境控制后面的程序流。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 18
第一单元 ABAP程序的执行流程
第二课 程序运行示例
3

程序开始

数据对象 ABAP程序
ABAP
ABAP xxx: xxx 程序块
选择屏幕
运行时系统 xxx: xxx xxx xxx

知识库 数据表

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 19
第一单元 ABAP程序的执行流程
第二课 程序运行示例

• 3、运行时系统发送选择屏幕
– 如果运行时系统包含了选择屏幕,ABAP运行
时系统就会把屏幕发送给表示层服务器,在用
户没有输入完成前,表示层服务器就控制着程
序流。
– 选择屏幕可以做一些基础的输入有效性检查,
如必输字段、日期/数值格式等。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 20
第一单元 ABAP程序的执行流程
第二课 程序运行示例
4

程序开始

数据对象 ABAP程序
ABAP
ABAP xxx: xxx 程序块
选择屏幕
运行时系统 xxx: xxx xxx xxx

知识库 数据表

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 21
第一单元 ABAP程序的执行流程
第二课 程序运行示例

• 4、输入的值被插入数据对象
– 用户完成了在选择屏幕的输入后,就可以通过触发执
行来处理程序。
– 输入的数据自动被保存到程序相应的数据对象中,
ABAP 运行时系统又重新获得程序的控制权。
– 在我们的示例中,只有一个程序块,运行时系统就顺
序处理ABAP程序块。
– 如果用户输入的类型不对,会自动触发错误消息,用
户必须纠正他的输入。(这里的类型与选择屏幕的有
效性检查不同,包含例如 2月30日这种日期超范围等
错误。)

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 22
第一单元 ABAP程序的执行流程
第二课 程序运行示例
5

程序开始

数据对象 ABAP程序
ABAP
ABAP xxx: xxx 程序块
选择屏幕
运行时系统 xxx: xxx xxx xxx

知识库 数据表

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 23
第一单元 ABAP程序的执行流程
第二课 程序运行示例
6

程序开始

数据对象 ABAP程序
ABAP
ABAP xxx: xxx 程序块
选择屏幕
运行时系统 xxx: xxx xxx xxx

知识库 数据表

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 24
第一单元 ABAP程序的执行流程
第二课 程序运行示例

• 5、程序从数据库请求数据记录
– 在示例中,读数据库的操作写在ABAP程序过
程块中。关于取哪张数据表哪些字段的信息都
被传递给数据库。
• 6、数据库把数据记录返回给程序
– 数据库把数据记录返回给程序,ABAP运行时
系统确保把数据保存在相应的数据对象中。
– 如果只读一条记录,则通常使用一个包含了所
需字段的结构。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 25
第一单元 ABAP程序的执行流程
第二课 程序运行示例
7

程序开始

数据对象 ABAP程序
ABAP
ABAP xxx: xxx 程序块
选择屏幕
运行时系统 xxx: xxx xxx xxx

知识库 数据表

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 26
第一单元 ABAP程序的执行流程
第二课 程序运行示例

• 7、运行时系统发送清单
– 在程序块中,也编写了关于清单布局显示格式
的代码,在生成了清单后,运行时系统就把清
单发送给表示层服务器。

• 上面简要介绍了一个ABAP程序的运行流程
和一些基本概念,下面将依次介绍ABAP程
序开发中用到的概念、工具和方法。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 27
第二单元 ABAP工作台简介

• 单元目标
本单元完成后,应该能:
– 描述知识库的结构
– 说出和使用知识库查询工具
– 使用对象浏览器查看知识库对象
– 说出和使用软件开发组织实用程序
– 创建包(开发类)
– 创建程序
– 创建事务码

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 28
第二单元 ABAP工作台简介
第一课 知识库和对象浏览器
表示层
• 知识库包含了所有系统
开发对象——程序、函
数模块、数据库表定义
等等。在知识库中既有
SAP 提供的表,也有客
应用层

户自定义的表。知识库
ABAP程序 在数据库中,并且通常
都与客户端无关,这就
客户端无关
意味着知识库可以被所
有客户端访问。
数据库层

• 除知识库外,数据库还
客户端无关 客户端相关
包含应用和定制表,这
知识库 应用表/定制表 些表是客户端相关的,
客户端相关
都有一个客户端列。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 29
第二单元 ABAP工作台简介
第一课 知识库和对象浏览器
• 知识库的结构
– 知识库根据应用组件进行划分。
– 在一个应用组件中,又进一步根据细节逻辑关系把相
关对象划分给多个包(开发类,本文中统一称为包)。
– 创建一个知识库对象时,必须指定一个包。
• 知识库信息系统
– 知识库信息系统是 SAP 提供的一个功能强大的信息查
询工具,它可以根据用户的各种要求来查找需要的知
识库对象。
– 可以根据创建者、创建时间、所属组件和包、激活状
态等等条件来查找。
– 可以通过事务码 SE80 来打开知识库信息系统。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 30
第二单元 ABAP工作台简介
第一课 知识库和对象浏览器
• 可以通过应用层次功能
来显示按层级组织的知
识库对象。
• 事务码是 SE81。
• 展开某个节点就显示该
节点下的所有包,双击
包名称或者将光标定位
在包名称上点击“信息
系统”按钮,就能转到
知识库信息系统中并显
示该包的内容。
• 这样的导航方法可以让
我们很方便的返回到同
一个应用组件,查看组
件中各个包的关系。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 31
第二单元 ABAP工作台简介
第一课 知识库和对象浏览器
• ABAP 工作台工具
– ABAP 工作台包括了开发和编辑知识库对象所需的全
部工具,这些工具覆盖了整个软件开发周期。主要的
工具有:
• ABAP 编辑器,用来编写源代码
• ABAP 字典,用来编辑数据库表、数据类型等
• 屏幕制作器,用来绘制屏幕(含用户会话的代码)
• 菜单制作器,用来制作用户界面(菜单栏、标准工具栏、应
用工具栏、功能键等)
• 函数编制器,用来维护函数模块
• 类制作器,用来全局类和接口
– 我们可以直接调用这些工具编辑相应的知识库对象,
但是更好更方便的方法是使用对象浏览器。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 32
第二单元 ABAP工作台简介
第一课 知识库和对象浏览器

全屏打开/关闭

导航区 工具区

右键菜单 右键菜单

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 33
第二单元 ABAP工作台简介
第一课 知识库和对象浏览器

• 对象浏览器
– 所有我们需要的知识库对象都可以用对象浏览器这一
核心开发工具来显示。只需要双击某个对象,就可以
打开相应的编辑工具来直接修改它了。
– 对象浏览器的屏幕分两个部分
• 左面是层级显示的导航区
• 右面是使用相应工具编辑开发对象的工具区
– 可以通过“全屏打开/关闭”按钮来打开或隐藏导航区
– 可以使用右键菜单来使用相关的编辑功能,右键菜单
的内容会根据所编辑的对象而变化,因此该菜单一般
称为上下文菜单(Context Menu)。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 34
第二单元 ABAP工作台简介
第一课 知识库和对象浏览器
• 对象都显示在导航区。
如果选择了一个包,则
这个包里所有的知识库
对象都会列出来。
• 双击一个对象就可以开
刷新 始编辑它。
• 可以通过前后箭头来访
问以前访问过的对象。
• 可以把经常使用的对象
收藏夹 添加到收藏夹里。
• 导航区的按钮仅影响导
上一个/下 航区,对于工具区则由
一个对象 上级对象 工具栏进行控制。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 35
第二单元 ABAP工作台简介
第一课 知识库和对象浏览器

导航箭头 打开/关闭
导航历史

• 在工具栏,根据编辑对象
显示相应的工具。 导航历史
• 可以用前后箭头在不同对
象间切换。
• 如果觉得不直观,还可以
打开一个导航历史子窗口。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 36
第二单元 ABAP工作台简介
第一课 知识库和对象浏览器

显示对象清单
(同步导航区和工具区)

• 有时候为了更灵活的使
用,会导致导航区和工具
区不同步。
• 可以双击导航区的对象使
工具区的内容向导航区同
步。
• 也可以使用“显示对象清单”
功能来使导航区的菜单向
工具区同步。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 37
第二单元 ABAP工作台简介
第二课 开发程序和组织开发

• 从本课可以学会如何创建程序、事务码和
包,以及如何为知识库对象指定包。
• 本课中将学习到
– 说出和使用组织软件开发的工具
– 创建包
– 创建程序
– 创建事务码

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 38
第二单元 ABAP工作台简介
第二课 开发程序和组织开发
• 关于组织开发
– SAP 出于管理和安全考虑,对组织开发的工作非常重
视。为了保证运行系统不受开发干扰,至少需要一套
开发系统用于配置和开发,一套生产系统用于最终用
户使用,而有些时候会增加专门的配置系统和测试系
统,形成更加完备的开发管理体系。
– 开发一般在开发系统上进行,被编辑和增加的开发对
象在项目完成后传输到生产系统上。在项目开始的时
候,项目经理创建一个变更请求,并根据开发人员的
分工为他们创建各自的任务请求。开发人员可以把自
己修改的开发对象保存在自己的请求中,便于管理。
– 可以使用 SE01、SE09、SE10 等事务码创建和管理
请求号。按 SAP 的开发组织原则,开发人员不能自己
创建和释放请求,只能使用项目经理分配的请求。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 39
第二单元 ABAP工作台简介
第二课 开发程序和组织开发

• 创建包
– 有几种常用的方法可以创建包
• 在对象浏览器中,对象选Package,在对象名称框
中输入要创建的包的名字,然后回车,如果这个包
已经存在,系统会打开这个包,否则,会提示你是
否要创建这个包,选择“是”。
• 在对象浏览器的首页,关闭所有对象,选择菜单
“Workbench-Edit Object”,会打开创建对象的对
话框,找“Development Coordination”选项卡,在
Package栏中输入要创建的包的名字,再回车。
• 如果已经打开了某个包,可以在上面使用上下文菜
单“Create-Package”。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 40
第二单元 ABAP工作台简介
第二课 开发程序和组织开发
• 下面是对创建包时的属性的说明
– Package:包的名称
– 短文本:包的说明,比较直观的说明
– Appl. Component:应用程序组件,按照应用模块划分的类别
– Software Component:软件组件,定制开发应用 HOME
– Transport Layer:传输路径,该包能够传递到那些服务器
– Package Type:包类型
• Not a Main Package:可以包含知识库对象和其他包
• Main Package:只能包含其他包
• Structure Package:只能包含 Main Package

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 41
第二单元 ABAP工作台简介
第二课 开发程序和组织开发
• 关于传输路径
– 可以使用传输管理系统(事务码 STMS)管理多个传
输路径,每个传输路径指定了请求的传递方向,如图。

• 创建了包之后,还必须为包指定一个请求号,知
识库对象都要附加在请求号上按指定传输路径传
递到目标服务器上。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 42
第二单元 ABAP工作台简介
第二课 开发程序和组织开发
• ABAP 编程语言的简介
– ABAP 编程语言的基本特性
• 专为基于会话的商业应用而设计。
• 强类型:每个变量必须指定类型,系统支持类型的自动转换。
• 多语言应用:采用了可翻译的文本元素,可以根据需要支持
多国语言。
• 允许 SQL 访问:可以使用 Native SQL 和 Open SQL 两种方
式访问 SAP 数据库,可以使用 Native SQL 访问非 SAP 数据
库。
• 面向对象:最初的 ABAP 不支持面向对象,但现在已经支持。
• 平台无关:运行在 ABAP运行时系统之上,与操作系统和数
据库完全无关。
• 向上兼容:与以前版本的程序完全兼容,以前写的程序无须
重写就能用在新系统上。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 43
第二单元 ABAP工作台简介
第二课 开发程序和组织开发
• ABAP 编程语言的简介
– ABAP 基本语法特点
• 由各自独立的语句构成。
• 每个语句的第一个单词必须是ABAP关键字。
必须
• 单词之间至少要用一个空格分隔。
至少
• 每个语句结束必须要用句号。
必须
• 支持分块缩进,便于阅读。
• 一个语句可以跨多行,只要不遇到句号,就认为是一个延续
的语句。
• 可以把多个语句放在一行。
• ABAP不区分大小写,关键字和用户操作数都一样,为了便于
阅读,一般把关键字大写,而操作数小写。
• 由于编程的时候随时切换大小写比较麻烦,可以在 ABAP编
辑器 中用“规范化打印机”按钮来自动转换。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 44
第二单元 ABAP工作台简介
第二课 开发程序和组织开发

• ABAP 编程语言的简介
– ABAP 基本语法特点(续上页)
• 注释行由第一列的星号(*)开头,并且幸好必须写在第一
列,前面不能有空格。
• 编译器忽略注释行,不会执行。
• 在行末的注释用双引号(”)作为前导。
• 如果连续多行的第一个关键字相同,可以使用链语句的方式
链语句
减少输入。这是 ABAP 独特的一个分块缩进方法。
– 第一个关键字后面用一个冒号表示链语句开始。
– 链语句的最后一句结束还是用句号,但是中间的分隔由句号改
成逗号。
– 空格和换行跟基本语句一样,可以任意加。
– 注意,这样的写法并不会提高执行效率,仅仅为了显示好看。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 45
第二单元 ABAP工作台简介
第二课 开发程序和组织开发
• ABAP 编程语言的简介
– 程序执行的返回码
• 这实际上是 ABAP 异常捕获机制的一部分。
• 有些语句执行完成后会向一个特定的系统字段 sy-subrc 写入
表示执行结果的值。
• 0 值都表示执行成功,而非 0 值则根据功能不同有特别的定
义,这些值的意义都需要查看 ABAP 联机帮助中相应关键字
的说明。
• 常用的需要检查返回码的语句有 SELECT、AUTHORITY-
CHECK 等。
– 其他系统字段
• ABAP 设置了一个结构 syst 用来保存系统运行时的各种参
数,用 sy-xxxxx 的形式调用,具体有哪些系统字段可以查看
联机帮助。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 46
第二单元 ABAP工作台简介
第二课 开发程序和组织开发

• ABAP 编程语言的简介
– 获取语言帮助
• 光标定位在关键字上,按F1,直接调出帮助文档,如果查询
出多条结果,则出现命中列表,从中选择某条结果查看。
• 光标定位在关键字上,按工具栏的 按钮,打开帮助导
航,不但可以查关键字,还能查其他相关内容,如功能模块、
表、逻辑数据库、权限对象等。
– SAP 的帮助系统相当完善,但是要找到所需内容也不
是很容易,需要不断积累经验。
– SAP 还有很多对学习语言有帮助的示例和功能,如
ABAP文档与范例(事务码ABAPDOCU)、BAPI手册
(事务码BAPI)、数据模型(事务码SD11)等。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 47
第二单元 ABAP工作台简介
第二课 开发程序和组织开发

• 创建 ABAP 程序
– 创建程序的方法
• 创建程序有很多种方法,如通过对象浏览器或者ABAP编辑器
等。一般来说,创建报表程序就用SE38,创建对话框程序用
SE80。
• SE38使用起来很简单,输入程序名,按创建按钮即可,它创
建出来的只有一个单独的程序和对应的文本对象。
• SE80则有个导航过程,可以同时创建包含程序等。
• 此外,SE80是对象浏览器,用它还可以创建和修改所有知识
库对象,如包、GUI标题、GUI状态(菜单、工具栏)、屏幕、
事务码等等。
– 创建了应用程序后,就可以进入ABAP编辑器来修改和
调试代码,随着SAP升级,ABAP编辑器也在不断改进。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 48
第二单元 ABAP工作台简介
第二课 开发程序和组织开发
保存的程序 活动的程序
(为进一步的开发和调试) (为系统范围的使用和传输)

程序A
程序A 激活 程序A
程序A
(非活动版本)
(非活动版本) (活动版本)
(活动版本)

程序B
程序B
(活动版本)
(活动版本)

程序C
程序C 程序C
程序C
(非活动版本)
(非活动版本) (活动版本)
(活动版本)

在编辑者执行时, 在执行时,
当前的,相应的运行时对象 使用激活时生成的运行时对象。
通常被生成。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 49
第二单元 ABAP工作台简介
第二课 开发程序和组织开发

• 创建 ABAP 程序
– 活动和不活动的知识库对象
• 当创建或者修改保存了一个知识库对象后,系统先把它保存
为不活动的版本。
不活动
• 知识库对象就可能同时有一个活动版本和一个不活动版本,
在开发结束后,必须把不活动的“编辑版本”激活,这个版本就
变成了新的活动版本。
• 只有当一个请求号内部所有的开发对象都变成活动版本的时
候,才可以进行释放和传输。
• 如果同时有激活和非激活两个版本,可以使用 按钮来在
这两个版本中切换,以验证修改。
• 当激活程序的时候,系统会先显示一个未激活对象的清单,
可以选择需要激活的程序来激活。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 50
第二单元 ABAP工作台简介
第二课 开发程序和组织开发
• 创建 ABAP 程序
– 激活时系统的工作步骤
• 把对象保存成未激活版本
• 对未激活版本的语法和一致性检查
• 在检查成功后,用激活版本替换旧的激活版本
• 如果对象是程序的话,为以后执行生成相关的运行对象
– 生成了开发对象后,系统创建独立的运行时对象
(LOAD编译)并且保存到知识库中,这个版本就是
运行时所执行(解释执行)的版本。
– 由于有活动版本和非活动版本之分,就可以实现不影
响当前系统状态而修改知识库对象,所有开发对象都
响当前系统状态
在激活之后才对整个系统是“可见的”。
– 事实上,SAP的很多对象都要激活才能使用,跟踪调
试也必须激活后进行,因此建议随时激活。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 51
第二单元 ABAP工作台简介
第二课 开发程序和组织开发
• 创建事务码
– 创建和修改事务码的方法
• 用SE93来管理事务码
• 在SE80中,按所属程序来管理
– 事务码的属性,必须选择正确的事务码开始程序类
型,否则运行事务码会无法打开目标程序
• Program and Screen:对话框程序
• Program and Selection Screen:报表程序
• Method of a Class:面向对象程序
• Transaction with variant:带变式的程序
• Transaction with parameters:带参数的程序
– 事务码主要就是指定程序和屏幕,附带的有变式和参
数等。总的来说,使用起来是非常灵活的。
– 事务码也必须指定包和传输请求。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 52
第二单元 ABAP工作台简介
第二课 开发程序和组织开发
• 关闭开发项目
– 当开发人员完成所负责程序的开发和调试之后,可以
激活全部开发对象,然后释放自己的请求号,从而提
交开发,准备进行传输。
– 创建的开发对象加入请求时,会自动加上相应的锁,
以避免被其他人任意修改。
– 释放请求后,所有请求开始时给开发对象加上的锁都
会被释放。
– 当所有相关请求都被释放后,项目经理可以释放和检
查主请求,完成项目。
– 主请求释放时,会把所有开发对象的更改都放置到系
统指定的传输目录中,等待管理员把请求按照传输路
径传到目标系统里。
– 当前服务器也会保留一份开发对象到版本管理库中。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 53
第三单元 ABAP字典简介

• 单元目标
本单元完成后,应该能:
– 解释在应用开发中使用数据模型的意图和好处
– 描述SAP航班数据模型
– 描述数据元素和域的意义和结构
– 描述透明表的意义和结构
– 描述结构的意义和结构
– 在你的程序中使用提及的字典元素

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 54
第三单元 ABAP字典简介
第一课 数据模型和描述性元素
• 数据模型
– 在商业应用软件开发时,部分实际世界必须被描述成
数据形式,业务单元描述成实体。实体之间互相有关
联,形成潜在的数据模型。或者叫做实体关系模型
(ERM)。
– 在 ABAP字典中,我们把这些数据模型及其之间的关
系定义成表(透明表)。在激活表的时候,对应的数
据库表也会同时建立,以后实际的应用数据都会保存
到这些表里。
实际世界 数据模型 ABAP字典 关系数据库

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 55
第三单元 ABAP字典简介
第一课 数据模型和描述性元素
• 数据模型
– 在 ABAP培训课程、联机文档和关键字文档中,都使用了一个航
班数据模型作为示例。在知识库对象中,这个航班数据模型属于
包 SAPBC_DATAMODEL。我们可以通过SE80查到这个包。
– 这个包里包含了很多内容
• 表
• 视图
• 结构
• 数据元素
• 域
• 搜索帮助
• 数据模型
• 实体类型
• ……

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 56
第三单元 ABAP字典简介
第一课 数据模型和描述性元素
• 数据模型
– 使用上述数据模型,可以为本课程提供足够的简单示
例。如果必要的话,还可以扩充以适合我们自己的需
要,例如:作为旅行社的客户,想从一个地方到另一
旅行社的客户
个地方去,他向旅行社征询下列信息:
• 最直接的线路是哪条航线
• 我出行的那天航线是什么时间
• 按哪些优化条件提供航线,如最便宜的、最快捷的、最适合
我出行时间的,等等。
– 显然,这跟旅行社关心的并不一样。在旅行社的数据
旅行社
模型里,为了便于进行管理,是把必要的信息按
管理 技术
标准存储在一定的数据库中。实际存储的数据远远超
出了客户的要求。
– 开发者必须使用应用程序让这些数据能为客户所用。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 57
第三单元 ABAP字典简介
第一课 数据模型和描述性元素
• 数据模型
– 航线数据模型包含了有逻辑关系的所有业务信息的实
体,如:
• 城市
• 机场
• 航线
• 飞行路线
• 航班
– 上述这些实体都以某种方式与其他实体关联
• 每个航班包含了航线、出发机场和抵达机场
• 每个可预定的班机都属于某航班
• 可以在城市和临近机场指定飞机
– 我们可以用这些关系管理所有无冗余的必要信息,同
时,旅行社也可以为顾客提供所有必要信息。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 58
第三单元 ABAP字典简介
第一课 数据模型和描述性元素
• 数据模型
– 为上述的每一个实体,SAP都在ABAP字典中创建一
个透明表。这仅仅是对数据表的一个平台无关的描
述,而不是表本身,只有当用户激活了这个表,同名
的数据库表才会建立。
– 透明表包含不同的字段(列)让我们以结构化的方式
来存储和管理数据记录,同时我们必须为表指定主
键,以便在数据表中清楚的区分和使用数据记录。表
键由键字段组成,也称为主键,同一个表里的不同数
据字段的主键一定是唯一的。
– 有些数据库允许不指定主键,但是为了更好的使用,
建议必须指定一个主键,而且从SAP的实践来说,建
议使用有意义的一个或多个字段形成主键,而不要用
自增标识做为主键。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 59
第三单元 ABAP字典简介
第一课 数据模型和描述性元素
• ABAP字典中的描述性元素
– 在处理透明表之前,还要再介绍两种描述性元素——
数据元素和
数据元素 域。
– 数据元素完全是对字段的描述,包括语义和字段技术
属性。
– 语义字段属性包括字段文档和标签,它们直接保存在
数据元素定义中。与之对应的是域,域保存了例如数
据类型、字段长度等技术信息。
– 为了提供更好的重用性和统一性,技术信息通常都是
指定到域,而不直接定义到数据元素。
– 数据元素可以用来定义程序内部的变量和声明透明表
的字段。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 60
第三单元 ABAP字典简介
第一课 数据模型和描述性元素
• ABAP字典中的透明表
– 数据库中的透明表就是保存了实际应用数据的表
– ABAP字典中的透明表,则是对相应数据库透明表的定
义和描述
– ABAP字典中的透明表字段组成了相应数据库表中同样
名字的列
– 通常用数据元素来定义透明表的字段,通过在各种表
中对相同的字段重用数据元素,可以保证跨表的字段
一致性。
– 使用了数据元素后,会在字段说明里自动带出数据元
素定义的说明。
– 跟其他数据库一样,还可以指定几个字段作为主键。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 61
第三单元 ABAP字典简介
第一课 数据模型和描述性元素
• ABAP字典中的结构
– 通常,ABAP字典中的结构用来描述结构变量,而结构
变量的数据都是从透明表中取得的。
– 在程序中,可以用字典结构来定义数据对象(保存数
据的有形的结构变量),结构变量通常用来在程序中
临时存储数据,或者在程序和屏幕之间作为字段传输
的接口。
– 在ABAP字典中定义结构跟定义表几乎一样,唯一的区
别是结构不需要主键。
– 在结构中,我们一般提组件和组件类型,而不是字段
和数据元素,因为与透明表不同,有个结构可以做为
另外一个结构的组件。包含了其他结构的结构被称为
复杂结构,而仅不包含其他结构的可称为
复杂结构 扁平结构。
扁平结构

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 62
第三单元 ABAP字典简介
第一课 数据模型和描述性元素
• 在程序中用字典元素来定义数据对象
– DATA mycarrid TYPE s_carr_id.
• 返回一个以数据元素 s_carr_id 定义的数据对象(变量)。从
s_carr_id 的定义我们知道,mycarrid 变量会是一个有三个字
节的字符串。
– DATA myconnid TYPE sbc400focc-connid.
• 返回一个与结构字段 sbc400focc-connid 有相同类型的数据
对象(变量)。结构 sbc400focc 是一个 SAP 教学系统定义
的结构,我们一般查不到。
– PARAMETERS pa_carr TYPE spfli-carrid.
• 在选择屏幕上显示一个与表字段 spfli-carrid 有相同类型的输
入字段,同时也是一个变量。我们可以在透明表 spfli 中找到
字段 carrid 的定义,是一个有三个字节的字符串。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 63
第三单元 ABAP字典简介
第一课 数据模型和描述性元素
• 在程序中用字典元素来定义数据对象
– DATA mycarrid TYPE s_carr_id.
• 返回一个以数据元素 s_carr_id 定义的数据对象(变量)。从
s_carr_id 的定义我们知道,mycarrid 变量会是一个有三个字
节的字符串。
– DATA myconnid TYPE sbc400focc-connid.
• 返回一个与结构字段 sbc400focc-connid 有相同类型的数据
对象(变量)。结构 sbc400focc 是一个 SAP 教学系统定义
的结构,我们一般查不到。
– DATA wa_focc TYPE sbc400focc.
• 返回一个结构变量,与字典结构 sbc400focc 有相同的类型。
也就是说,所有字段都与 sbc400focc 相同。
– DATA wa_spfli TYPE spfli.
• 返回一个结构变量,与表 spfli 的一行具有相同的类型。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 64
第三单元 ABAP字典简介
第一课 数据模型和描述性元素

• 在程序中用字典元素来定义数据对象
– PARAMETERS pa_carr TYPE spfli-carrid.
• 在选择屏幕上显示一个与表字段 spfli-carrid 有相同类型的输
入字段,同时也是一个变量。我们可以在透明表 spfli 中找到
字段 carrid 的定义,是一个有三个字节的字符串。
• 如果一个数据元素、结构组件或者表字段被用来定义选择屏
幕的输入字段(用PARAMETERS关键字定义)的话,就可
以使用相应数据元素的语义属性——所谓语义属性是技术属
性的一个附加,包含文档和搜索帮助等特殊应用。
• 具体应用包括:光标定位在输入字段时,可以按 F1 或者 F4
键来自动生成文档对话框或值项帮助对话框。他们从ABAP字
典中获取必要的信息(数据元素文档或附加搜索帮助)。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 65
第四单元 ABAP语言的基本元素

• 单元目标
本单元完成后,应该能:
– 定义基本的数据对象(简单变量)
– 使用基本 ABAP 语句和数据对象
– 在调试模式执行和分析程序
– 定义结构数据对象(结构变量)
– 使用结构数据对象语句
– 在调试模式分析结构数据对象
– 定义内表
– 使用操作内表的基本 ABAP 语句
– 在调试模式分析内表

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 66
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象

• 本课内容
– 首先应该明确数据类型和数据对象的不同之
处,并且知道如何在 ABAP 程序中定义和使用
它们。
– 还要学习一些基本的 ABAP 语句。
– 另外要知道如何用 ABAP调试器 来分析程序流。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 67
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象
• 数据类型和数据对象
– 形式上的变量描述叫做数据类型,由数据类型具体定
义的变量叫做数据对象。
– 或者说,数据类型用于实现各种接口,而数据对象则
具体保存数据。
– 数据对象的类型定义了它的技术(也包含了一部分语
义)属性。
– 接口参数的类型定义了当调用模块单元时实际需要传
递的参数所应有的类型。
– 输入/输出字段的类型则除了基本技术特性外,还能提
供进一步的信息,例如数据表和值输入帮助。
– 本课程主要就是学习如何在程序内部定义变量类型。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 68
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象
• 数据类型和数据对象
– 下面看一看SAP内置的基本数据类型,所有其他数据
元素和域都是由这些基本数据类型组合而成的。
– 数据类型可以分成完整的和非完整的。
– 完整的数据类型指它包含了与类型相关的固定长度的
信息。
• D :日期类型,格式为YYYYMMDD,长度为8
• T :时间类型,格式为HHMMSS,长度为6
• I :整数类型,长度为4
• F :浮点类型,长度为8
• STRING:变长字符串类型
• XSTRING:变长字节序列类型

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 69
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象
• 数据类型和数据对象
– 非完整的数据类型指它所对应的变量长度是在数据对
象定义时指定的。
• C :字符串类型,定义变量时指定字符个数
• N :数字字符串类型,定义变量时指定数值字符个数
• X :字节序列类型,定义变量时指定字节数
• P :组合数值类型,定义变量时指定长度和小书点后位数
– 从 SAP 关键字文档中的 TYPE 和 DATA 语句的帮助
里可以获得更多关于数据类型的信息。
– 可以使用这些基本类型来定义更完整和更复杂的本地
数据类型,但是它们只能作为当前程序的增强,这些
数据类型
定义可以用 TYPE 语句来实现。
– 跟本地数据类型对应的是在 ABAP 字典中定义的类
型,被称为全局类型,可以在整个
全局类型 SAP 系统中使用。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 70
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象
• 数据类型和数据对象
ABPA程序 ABPA字典
REPORT
REPORT …
… 全局类型

*本地数据类型声明
*本地数据类型声明 数据元素 字段类型

TYPES
TYPES my_c_type(8)
my_c_type(8) TYPE
TYPE c.
c. 结构
TYPES
TYPES my_n_type(5) TYPE n.
my_n_type(5) TYPE n. 结构类型
TYPES
TYPES my_p_type(3)
my_p_type(3) TYPE
TYPE pp DECIMALS
DECIMALS 2.
2. 透明表

表类型 内表类型

– 对于全局类型,我们的课程里只使用数据元素,作为
字段的类型。其他的全局类型以后再讲。
– 综合前面讲的,我们一共有三大类数据类型:标准类
型、本地类型、全局类型。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 71
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象
• 数据类型和数据对象
– 定义数据对象
• 通常用 DATA 语句来定义数据对象。
• 数据对象的类型可以是基本类型、本地类型或全局类型。
全局类型
ABAP
TYPES type_name TYPE … 字典

内置ABAP类型
DATA myvar1 TYPE type_name . D、T、I、F、
STRING、XSTRING
P、N、C、X

• 实际开发中,我们用的更多的是参考现有的数据对象。
DATA myvar2 LIKE myvar1.

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 72
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象

• 数据类型和数据对象
– 定义数据对象
• 可以使用 VALUE 关键字来指定数据对象的初始值
DATA number1 TYPE i VALUE 17.
• LENGTH 关键字也是指定变量长度
DATA number2 TYPE c LENGTH 8.
• 如果 DATA 语句没有指定 TYPE ,则默认用 C 类型
• 如果非完整类型没有指定长度,则使用默认长度。
• 根据上述两条基本原则,我们可以写出类似下面这样的语句
DATA myvar.
上面这条语句定义一个长度为 1 个字符的 C 类型变量。
• 关于默认长度的值,请参考关键字帮助文档。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 73
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象

• 数据类型和数据对象
– 固定数据对象
• 固定数据对象有一个固定值,这个值是在源代码里写死的,
在运行时不能改变。文字和
文字 常数都属于固定数据对象。
常数
• 文字是在程序里面写的固定值,可以分为数值文字(不使用
单引号)和字符文字(用单引号括起来),下面是一些例子。
– 数值文字:123、-123
– 字符文字:’Hello’、’123.45’、’123.45E03’
• 可以使用 CONSTANTS 语句来定义常数,TYPE 的指定方法
跟基本数据对象一致,而 VALUE 则是必须的,用来赋值。
– CONSTANTS myc TYPE tname VALUE { 文字 | IS INITIAL }
• 如果可能的话,尽量减少使用文字,而多用常数,这样可以
给程序维护带来很大的便利。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 74
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象

• 数据类型和数据对象
– 本地数据类型和全局数据类型
• 本地数据类型只能在所在的程序中使用,全局数据
类型则可以在整个系统使用,因此具有下列优点。
– 全局使用增强了系统的一致性,减少了整体维护需求
– 在ABAP字典中可以为全局类型生成一个所用处清单,这
个清单可以列出知识库中所有使用到该类型的对象。
– 全局数据类型包含技术信息,可以包含跟该字段所定义的
业务相关的语义描述,这对设计屏幕也是很有用的。
• 本地数据类型仅在所属程序专用或者完全不需要相
关语义说明的的情况下使用。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 75
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象

• 基本ABAP语句
– 赋值
• 程序开始时,程序内容被读到应用服务器的内存区,程序中
定义的数据对象也分配了相应的内存空间。
• 可以使用 MOVE 关键字来赋值,下面两个语句具有相同的功
效。
– MOVE var1 TO var2.
– var2 = var1.
• 如果 var1 和 var2 的数据类型不同,就存在类型冲突的可能
类型冲突
性,这时候如果存在转换规则,则会进行
转换规则 自动类型转换。
自动类型转换
• 关于类型冲突和自动转换,可以查 MOVE 的帮助。
• CLEAR 语句根据类型清除数据对象,恢复成默认值。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 76
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象
• 基本ABAP语句
– 运算
• ABAP 程序中,数学表达式可以进行任意多层嵌套。
• 二元操作符包括:
– + :加法
– - :减法
– * :乘法
– / :除法
– ** :乘方
– DIV :整除忽略余数
– MOD :取模
• 需要注意,圆括号和操作符都是关键字,需要跟操作数之间
至少用一个空格分开。
– (1+2)*3 应该写成 ( 1 + 2 ) * 3

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 77
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象
• 基本ABAP语句
– 运算
• ABAP 运行时环境预定义了一些处理不同类型数据的基本函
数。例如下面的例子返回字符变量包含的字符数量。
length = STRLEN( cityfrom ).

• 请注意,左括号是函数名的一部分,必须跟后面至少有一个
空格。
• 跟一般习惯相同,数学运算具有下面的优先级:括号最高、
其次乘方、再次乘除、最低加减。
• ABAP 的字符串函数相对比较麻烦,而且不能用其他语言常
用的 & 或 + 连接,需要特别注意。
• 可以参考 COMPUTER 语句的关键字文档,以获取更多的操
作和函数的说明。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 78
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象
• 基本ABAP语句
– 条件分支
• 根据条件可能性的多少,有两种条件语句处理分支情况
– 在 IF 模式中,可以定义任何逻辑表达式作为检查条件。如果满
足条件,则执行相应的语句块,如果不满足,则找下一个
ELSEIF 分支进行进一步判断,如果没有 ELSEIF,就找 ELSE
执行。ELSEIF 和 ELSE 都可选。
– 可以使用 CASE 模式处理明确的区分情况。CASE 部分指定的
字段内容会与每个 WHEN 分支的值进行比较,如果字段内容相
符,则执行相应程序块,如果没有找到相符的,就执行 OTHER
后的程序块。CASE 语句至少要包含一个 WHEN,其他都可选。
• 在这两个语句结构中,条件比较都是从上往下的,如果某个
分支满足条件,系统会立即跳出 ENDIF 或 ENDCASE。
• 提示:如果仅需要比较一个字段和多个值,建议使用
CASE,因为它更清晰而且性能较好。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 79
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象
• 基本ABAP语句
– 循环
• ABAP 中有四种循环语句,在 DO 和 WHILE 的循环里,可以
利用 sy-index 这个系统字段来计算当前循环的次数,也只有
在循环里这个字段的值才有意义。对于嵌套的循环来说,sy-
index 这个字段保存的值是当前所在层的循环次数,也就是
说,系统有一种内在机制保证每层循环计数都不会搞乱。
DO.
DO. 11 循环开始时
WRITE
WRITE // sy-index.
sy-index. 11
外层循环计数
DO.
DO. 22
WRITE
WRITE // sy-index.
sy-index. 33
IF
IF sy-index >> 9.
sy-index 9. 44
EXIT.
EXIT. 55 内层循环计数
ENDIF.
ENDIF. 66
ENDDO.
ENDDO. 77
WRITE
WRITE // sy-index.
sy-index. 88
EXIT.
EXIT. 99
循环结束时
END
END DO.
DO. 10
10
11 外层循环计数
恢复到本层值
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 80
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象

• 基本ABAP语句
– 循环
• 无条件循环 / 索引控制的循环
– DO 和 ENDDO 之间的语句块会无限运行,直到遇到条件
控制的跳出循环语句如 EXIT 等。在 DO 语句中还可以指
定最多运行的次数,否则的话,将会出现无限循环。无限循环
• 头控制循环
– 在 WHILE 和 ENDWHILE 之间的语句块会一直执行,直
到不再满足 WHILE 后面所指定的条件。指定条件会在语
句块执行前被检查,也就是说,WHILE 结构内部的语句
可能一遍都不执行。
• 读循环
– 可以用 SELECT 循环读取数据库表的若干条目。对于内
表来说,LOOP 循环可以起到同样的效果。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 81
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象

• 基本ABAP语句
– 对话消息(消息提示框)
• 可以用 MESSAGE 语句向程序的用户发送对话消息,使用
MESSAGE 语句必须指定三位数的消息号和消息类。
• 消息号和消息类可以指明消息的内容,消息类型则指示了消
息显示在何处。SAP 系统提供了一个消息测试的程序
DEMO_MESSAGES,可以学习消息的各种类型和用法。
• 如果所用的消息使用了占位符,则需要在程序里用 WITH 关
键字指定替代这些占位符的文字,在消息显示的时候,就会
用所输入的文字替代占位符。我们在运行标准程序的时候偶
尔也会看到 & 这样的占位符,这可能是配置不恰当造成没有
合适的值传入。
• 可以从 MESSAGE 的关键字文档中获取更多关于它的信息。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 82
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象

• 使用 ABAP 调试器
– 可以有几种方法在对象浏览器中打开调试器
• 使用导航区右键菜单或者主菜单,选择“测试-调试”
• 在编辑区把光标定位在要调试的行,按“设置/删除断点 ”
按钮,然后按 F8 键或者工具栏的“执行 ”按钮或菜单的“程
序-测试-直接处理”。(需要注意的是,断点调试只能在激
活状态下使用。)
– 在运行时也可以随时进入调试模式
• 如果想要看标准程序的执行过程或者查看正式系统运行状
态,可以先不启动调试模式,而直接运行程序,然后简单的
切换到调试模式。可以使用以下两种方法。
• 菜单“系统-实用程序-调试 ABAP”。
• 在事务码输入栏中输入 /h,然后回车。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 83
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象

• 传统调试器
– 单步调试和字段内容
• 在传统调试器中可以选择“单步 ”按钮来一句一句的执行代
码,单步调试会展开所有调用的函数和子程序。
• 可以最多同时查看 8 个不同数据对象的值,可以在相应的输
入框里输入对象名或者从程序中双击拷贝对象名到输入框里。
– 断点
• 在调试的时候可以双击某行的前端,把断点加到该行上,或
者把光标定位到该行,从菜单中选择“断点-断点设置-语句”。
• 设置断点后就可以选择“继续 ”按钮直接执行到断点位置。
• 这里设置的断点只对当前调试任务有效,不过,这时按了“保
存 ”按钮的话,就可以把断点保持在当前 SAP 任务,也
就是说,只要不退出登录,断点就一直可用。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 84
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象

• 传统调试器
– 追踪数据变更
• 观察点是以字段内容为依据的断点。
观察点
• 如果为一个字段指定了观察点,而没有指定相关操作或者比
较值的话,按“继续”后,程序会一直执行直到字段的值发生了
较值
改变。
• 而如果指定了相关操作和比较值,按“继续”后,程序会执行到
这个字段发生了符合指定要求的改变时才停止。
• 可以最多指定 10 个观察点,并用 AND 或者 OR 的关系连接
起来。
• 设置一个观察点调试还相对比较容易一些,如果设置多个观
察点且它们的关系比较复杂的话,调试时一定要理清思路。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 85
第四单元 ABAP语言的基本元素
第一课 操作基本数据对象
• 新版调试器
– 在 SAP Web Application Server 6.10 以后,就可以使
用新版调试器了。新版调试器增加了可设置的多个调
试窗口,支持多种数据对象在同一个屏幕上显示。
– 在 WAS 7.0 以后还增加了一些新功能。
• 在第二个任务中调试
• 通过可设置的显示区域并行显示多个内容
• 与新版ABAP编辑器合成(7.0以上)
• 在源代码区显示数据对象的快捷信息(7.0以上)
• 对内表和对象引用设置观察点(7.0以上)
• 对结构、内表的值比较(7.0以上)
– 使用菜单“实用程序-设置”,选择“ABAP编辑器-调
试”,选中“新调试器”,或者在调试时选择菜单“调试-
切换调试器”。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 86
第四单元 ABAP语言的基本元素
第二课 操作结构

• 本课内容
– 学习结构数据对象(结构变量)的定义和使用。
– 还要学习一些操作结构的 ABAP 语句。
– 另外要知道如何用 ABAP调试器 来分析结构。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 87
第四单元 ABAP语言的基本元素
第二课 操作结构

• 处理结构
– 使用全局类型定义结构
• ABAP 程序中经常使用结构数据对象(为了跟结构
类型区分开,它通常叫做结构变量或简称结构),
结构主要能够把具有一定逻辑关系的多个变量组织
到一起。结构允许嵌套,也就是说一个结构可以包
含其他结构和内表的变量。
• 在程序中,跟定义基本数据对象一样,用 DATA 语
句来定义结构。可以用下述对象定义结构的类型:
– 数据字典中的结构类型
– 透明表(跟结构类型一样使用)
– 当前程序中定义的结构类型

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 88
第四单元 ABAP语言的基本元素
第二课 操作结构

• 处理结构
– 本地结构
• 使用 TYPES 语句来定义本地结构类型,语法如下
TYPES: BEGIN OF structure_type_name,
…,
END OF structure_type_name.
DATA: structure_name TYPE structure_type_name.
• 可以在其中使用 TYPE 或 LIKE 来指定组件。
• 如果结构不需要重用,也可以直接用 DATA 语句来
定义结构变量,用法就是用 DATA 关键字替换
TYPES。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 89
第四单元 ABAP语言的基本元素
第二课 操作结构

• 处理结构
– 访问结构的组件
• 组件和结构用连字符连接
structure_name-component_name
• 因此,在数据对象名定义的时候不能使用连字符-。
• 使用 MOVE-CORRESPONDING 语句把一个结构的内容同时
全部拷贝到另一个结构中。这里,只有源结构和目标结构中
有相同名称的组件才会拷贝,而目标结构中名称无法对应的
组件保持不变。这时就需要注意,如果两个结构中同名的组
件有不同定义的话,拷贝时可能会出错。
• 单独的组件视同一个基本数据对象,可以用 MOVE 进行赋
值,也可以用等号。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 90
第四单元 ABAP语言的基本元素
第二课 操作结构

• 处理结构
– 在 ABAP 调试器中进行调试
• 调试时可以直接查看结构中的某个组件的值,方法
就是在字段内容栏中输入组件包含结构的完整名称。
• 也可以查看整个结构的值,方法是在内容栏中输入
结构的名称,然后双击它,就会在一个新的窗口中
显示结构中每个组件的类型定义和值。可以用工具
栏中的“返回 ”按钮返回字段查看界面。
• 在新版调试器中,就专门设计了一个查看结构的选
项页,可以更方便的观察结构中各组件的值。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 91
第四单元 ABAP语言的基本元素
第三课 操作内表

• 本课内容
– 学习如何在 ABAP 程序中定义和使用内表。
– 还要学习一些操作内表的 ABAP 语句。
– 另外要知道如何用 ABAP调试器 来分析内表。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 92
第四单元 ABAP语言的基本元素
第三课 操作内表
• 内表的组成
– 内表是一个
内表 数据对象,在运行时可以用内表保存多个
数据对象
相同结构的数据。
– ABAP运行时系统动态的管理内表的大小,这就是说,
开发人员无需进行内表的内存管理。
– 每个独立的数据集合在内表中称为一个表行或者
表行 表项。
表项
– 而一行中独立的组件对应于内表中的字段或者
字段 列。
– 内表的行类型可以用任何数据类型和表项的行结构来
声明。
– 使用内表是一个处理大量结构化数据的简单办法,主
要应用包括
• 保存数据库或序列文件中的数据进行进一步处理。
• 为屏幕和打印输出格式化数据(如:排序等)
• 为使用其他服务格式化数据(如:子程序、函数、方法调用)

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 93
第四单元 ABAP语言的基本元素
第三课 操作内表

• 内表的属性
– 下列几个属性完全描述了一个内表
• 行类型:行类型描述了表行的结构,一般使用一个结构来定
义行类型,不过实际上可以用任何类型。
• 键:内表的键由若干个指定顺序的键字段组成,内表就会根
据几个键字段的先后顺序自动排序。根据访问类型,键可以
分为唯一的和不唯一的,唯一的意味着表中的键字段的值组
合在内表中只能出现一次。
• 表类型:有三种不同的表类型,标准表、排序表和哈希表
(散列表),根据使用的访问类型,可以使用相应的表定义
以获得更好的性能。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 94
第四单元 ABAP语言的基本元素
第三课 操作内表

• 内表的属性
– 几种类型表的比较
• 当一个内表的项以所在行号来访问时,称为索引访问。
• 而当以内表的键来访问时,称为键访问。
– 下图列出了三种类型表的基本比较

索引表 哈希表
表类型 标准表 排序表 哈希表
索引访问 √ √
键访问 √ √ √
唯一键 不唯一 唯一/不唯一 唯一
访问 主要以索引访问 主要以键访问 只能以键访问

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 95
第四单元 ABAP语言的基本元素
第三课 操作内表

• 内表的属性
– 三种表的类型
• 标准表:系统内建维护了表的行号(即索引),索引和键访
问都是允许的。当经常用索引访问表的时候就选择标准表。
• 排序表:数据记录在表内自动以升序进行排列,索引是系统
自动维护的,索引和键访问都可以用。如果经常使用键来访
问数据,或者希望数据能够自动排序时,就用排序表。
• 哈希表:利用主键的哈希排序对数据记录进行快速访问,哈
希表需要唯一主键,而且只能使用键访问。如果内表非常大
而且希望用主键访问,就用哈希表。
• 本课程中只使用标准表,而且除了一些特殊情况外,后面介
绍的语法都适用于三种表的操作。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 96
第四单元 ABAP语言的基本元素
第三课 操作内表
• 定义内表
– 使用全局类型
• 内表的类型称作表类型,表类型也可以在全局声明或在程序
表类型
内定义,在 ABAP字典 中可以定表类型,并且跟其他类型一
样使用 DATA 语句来定义一个内表。
• 可以在维护表类型的时候按“信息 ”按钮来获取关于表类型
的信息。
– 使用本地类型
• 本地表类型定义也通过 TYPES 语句完成,并且通过 WITH
NON-UNIQUE KEY 关键字来定义主键等。
• 当列出键字段时,需要注意字段的排列顺序会影响排序语句
(例如:SORT BY KEY)的结果。
• 还可以用 DATA 语句来直接定义内表。
• 可以用字典对象中的结构、表来定义内表,也可以用基本数
据对象来组合出内表的结构。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 97
第四单元 ABAP语言的基本元素
第三课 操作内表
• 访问单条记录
– 一般来说,需要一个与内表行结构相同的工作区来处理单条记录。
相同
– APPEND:往内表的最后追加一条记录,只能用于标准表。
– INSERT:向内表插入一条记录,在标准表里跟 APPEND 的效果
一样,在排序表里就插入到键指定的位置,在哈希表里则根据哈
希运算法则插入到指定位置。
– READ:把表的指定行拷贝到结构中。
– MODIFY:使用结构的内容重写表的指定行。
– DELETE:删除表的指定行。
• COLLECT:把结构中的内容累加到内表具有相同键的行
上,这时,只有非键字段才执行累加,并且只有非键字段
都是数值的时候才能执行这个语句。
• 其他关于内表操作的语句可以参考 ABAP 关键字文档。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 98
第四单元 ABAP语言的基本元素
第三课 操作内表
• 处理结果集合
– LOOP … ENDLOOP:LOOP 语句一条一条的读出内
表的数据行,写入 INTO 字句指定的结构中,结构的
内容可用于输出,或者修改后写回内表。在 LOOP 语
句块中,系统字段 sy-tabix 指示了当前循环到内表的
哪一行。
– DELETE:删除满足条件的所有行。
– INSERT:把一个内表中的多行拷贝到另一个内表中。
– APPEND:把一个内表中的多行追加到另一个标准表
中。

– 想修改内表的某一行只能先把那行读到工作区,修改
工作区后再写回内表,而不能以数组的方法访问到内
表的指定一行,这是跟其他语言很不一样的地方。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 99
第四单元 ABAP语言的基本元素
第三课 操作内表
• 使用索引读表(标准表和排序表)
– LOOP 中用 FROM - TO 子句可以读指定索引段的记录。
– READ 中用 INDEX 子句可以读指定索引的一条记录。
• 使用条件读表
– LOOP 中用 WHERE 子句可以读满足一定条件的记录。
– READ 中用 WHERE TABLE KEY 子句可以读满足主键条件的记
录。
• 内表排序
– 标准表和排序表可以使用 SORT 语句对指定字段进行排序,如果
没有指定升序或者降序就默认使用升序。
– 如果使用 AS TEXT 子句,则按照某种语言的字典排序,而不是
按照计算机中的文字编码来排序。比如德语中的“ä”就会排在“b”
前,而不是在“z”后面,这个对中文影响不大。
– 如果使用 STABLE 子句,则排序时排序字段具有相同值的记录的
顺序在排序后仍保持不变。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 100
第四单元 ABAP语言的基本元素
第三课 操作内表
• 清除表的内容
– REFRESH:清除整个内表的内容,释放部分内存,保留一些以
备后续操作。
– CLEAR:对于没有表头的内表,跟 REFRESH 一样,清除内表
的内容。对于有表头的内表,则只初始化表头。
– FREE:清除整个内表的内容,释放所有内存。在程序里,当内
表以后不再使用的时候可以使用 FREE,这样能尽量多释放一些
不用的内存。
• 调试内表
– 在调试器里,可以跟查看结构一样在字段栏中输入内表名字,再
双击查看内表内容。
– 更好的方法是,有专门的内表调试界面,通过它可以更清除的看
到内表的每一行和表头。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 101
第四单元 ABAP语言的基本元素
第三课 操作内表
• 表头
– WITH HEADER LINE 子句可以在定义表的时候指定
表头,如果指定了表头,就会自动建立一个与内表同
名并且具有相同结构的工作区,同时也可以简化很多
内表语句。
– 但是因为以下缺陷,SAP 建议舍弃表头。
• 表头与内表同名,影响阅读。
• 有表头的内表不允许使用复杂数据对象(不能把其他内表作
为表的组件)。
• 有表头的内表不允许使用 ABAP 对象(面向对象的 ABAP 扩
展)。
– 新的 SAP 标准建议舍弃表头,但是老程序还在大量使
用,因此有些概念需要澄清。
• 用 itab-col 表示表的工作区的某个字段
• 用 itab[] 可以表示整个表

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 102
第五单元 数据获取

• 单元目标
本单元完成后,应该能:
– 列出查询相关数据库表的方法
– 编程读指定数据库表的指定行和列
– 列出读多个数据库表的方法
– 解释 SAP 授权的概念
– 使用权限检查

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 103
第五单元 数据获取
第一课 读数据库表

• 本课内容
– 本课学习如何得到数据库表的信息和如何从中
读取数据。
– 还要学习如何读取多个表

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 104
第五单元 数据获取
第一课 读数据库表
• 数据获取
– SQL 是结构化查询语言(Structured Query Language)
的缩写,结构化查询语言用于定义、创建、读取数据
库表。
– 每种关系型数据库都有其本地SQL,是跟数据库相关
SQL
的,因此,使用本地SQL 的 ABAP 程序就无法适应所
有 SAP 系统(因为不同的 SAP 系统可能使用各种不
同的数据库)。
– 而开放SQL 则是 SAP 为 ABAP 语言定义的数据库无
关的 SQL 标准,开放SQL 语句在程序运行时动态的
转化成当前数据库使用的本地SQL,这种转化完全由
ABAP 运行时系统执行,而我们在编写程序时就不需
要考虑 SAP 系统使用的数据库差异。
– 下页图描述了本地SQL和开放SQL在系统中的位置。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 105
第五单元 数据获取
第一课 读数据库表

应用服务器 ABAP

开放SQL 本地SQL

表缓存
数据库接口

数据库服务器 本地SQL

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 106
第五单元 数据获取
第一课 读数据库表
• 查找数据库表
– 数据库表通常都隐藏在代码后面,有几种方法来查找
所需的数据库表。
– 从指定的应用查找
• 这种方法要知道所用的应用,从应用级别来找某个具体的包
(参见前面关于包的描述)里面使用到了哪些表。
– 从指定的程序查找
• 这种方法更容易些,因为程序的名称比应用更容易找。
• 源代码搜索:就是从源代码里面搜索 SELECT 语句。
• 功能调试:运行前切换到调试模式,然后设置断点。
• 使用屏幕字段信息:运行时光标定位到指定字段,然后按 F1
键,查技术信息,显示出该字段所属的表或结构。
– 找表方法不是这里的重点,进一步的方法可以参考
《18种根据屏幕字段找数据表的方法》一文。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 107
第五单元 数据获取
第一课 读数据库表
• 数据库的读访问
– 读数据库是我们最经常做的工作。
– 使用开放SQL的 SELECT 语句来执行查询,它包含几
个基本的组成部分,下面一一说明。
• 基本语法:SELECT <fields> FROM <table> INTO <target>
[ WHERE <condition> ]
• SELECT 后面的块说明了需要读表的哪些字段。
• FROM 后面的块说明了需要读哪个数据源(数据源可以是表
或者视图)。
• INTO 后面的块说明了读出的字段要放到哪个目标数据对象中。
• WHERE 后面的块说明了读数据的基本条件,可选。
– SELECT 语句还有很多非常灵活的用法,可以参考相
关的帮助文档,也需要在实际应用中不断积累经验。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 108
第五单元 数据获取
第一课 读数据库表
• 读单条记录
– 使用 SELECT SINGLE 语句从数据库表读取单条记
录,为了确保读出唯一记录,应当在 WHERE 块指定
全部主键的值。Client 字段在这里可以不必指定,系
统会自动选定属于当前client的记录。
– 在 SELECT 语句中使用 CLIENT SPECIFIED 子句可
以关闭自动客户端选定,从选择条件里指定访问某个
客户端的数据。
– 可以使用掩码 * 来指定选中数据表的全部字段,不过
为了减少数据量,建议指定选中字段。
– 用 INTO 指定记录要拷贝到的目标变量,目标变量结
构的前若干个字段必须跟选择字段对应。
– 如果找到合适记录,则系统变量 sy-subrc 的值为 0。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 109
第五单元 数据获取
第一课 读数据库表
• 读单条记录
– 如果不想用结构来保存数据,也可以在 INTO 后面使
用一个变量列表,这时数据保存的对应关系就只按顺
序而不管字段名了。
• INTO (field_1, field_2, … , field_n)
– 如果目标结构的数据结构与查询字段的顺序不一致,
或者使用 * 这样的通配符来指定查询字段,就需要用
CORRESPONDING FIELDS OF 子句,它会自动在源
字段和目标字段之间找名称相同的项自动对应填入。
这时需要确认各个同名字段的类型一致,否则的话,
这样可以编译通过,但在执行时却有可能遇到类型转
换失败而造成的程序错误。建议使用这种方法,因为:
• 使用它就可以不需要目标结构的前面字段与查询字段一致
• 将来增加目标结构的字段时不需要修改查询语句。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 110
第五单元 数据获取
第一课 读数据库表

SELECT col1 col2 col4 INTO stru SELECT col1 col2 col4
INTO (var1, var2, var3)
结构 stru
变量 var1 变量 var2 变量 var3

结构 stru

SELECT col1 col2 col4


INTO CORRESPONDING FIELDS OF stru
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 111
第五单元 数据获取
第一课 读数据库表

• 使用循环读多条记录
– 可以使用 SELECT … ENDSELECT 循环来处理多条
数据库记录。
– WHERE 条件可以指定需要选择的记录,用 AND 和
OR 进行逻辑连接。
– 使用 SELECT 循环时,数据库把数据按一个一个的包
发送到应用服务器的数据库接口,然后进程块把需要
的数据一条一条拷贝到工作区进行处理。
– 在 SELECT 循环后会产生一些返回值,sy-subrc 为 0
说明至少查询到一条记录,而 sy-dbcnt 则记录了一共
查询到多少条记录。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 112
第五单元 数据获取
第一课 读数据库表

• 使用循环读多条记录
– 可以使用 INTO TABLE 把查询结果一次性读到内表
中,而不用一条一条的处理。把数据表的记录一次性
填入内表可以获得比较高的性能,因为数据是成块传
输而不是一条条传输。
– 由于是成块传输,所以不需要 ENDSELECT 结束语句。
– 跟查询输入到结构一样,也可以使用前面的方法进行
字段对应。
– 使用 APPEND TABLE 可以把新查询到的数据追加到
已有数据的内表后面。
– sy-subrc 和 sy-dbcnt 在 SELECT 后有相同的表现。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 113
第五单元 数据获取
第一课 读数据库表
• 从客户端相关的表中读取数据
– 客户端相关的表都有一个客户端字段作为主键,数据
类型一般是 CLNT,字段名为 mandt。
– 查询时如果不指定客户端的话,只有当前客户端的数
据会被查询出来,这是系统内部自动做的。
– 如果需要进行跨客户端的数据操作,如数据合并和导
出等,就在 FROM 后面加上 CLIENT SPECIFIED 子
句,这时如果对指定客户端操作,就要在 WHERE 条
件里包含客户端了。
– 在我们的课程里不需要用到跨客户端的操作,实际业
务应用也不是很多,但只要掌握了基本规律,跨客户
端和在一个客户端内并没有本质区别。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 114
第五单元 数据获取
第一课 读数据库表
• 性能提升
– 在不同的应用中,通常会经常使用某种查询,可以为
这些查询所用的字段定义二级索引,从而加快查询速
二级索引
度。在查看 ABAP 字典的透明表时,可以用“索引”按
钮打开和维护索引。
– 对于客户端相关的表,客户端字段默认传输给数据
库,因此建立二级索引时应把客户端字段作为第一个
索引字段,可以有效提高查询速度。
– 索引建立并激活后,系统会用索引进行数据库优化。
程序执行时会自动寻找跟查询条件相匹配的索引,从
而加快查询速度,编写程序时无需在程序的查询语句
中指定索引。
– 主索引根据表的主键自动建立,使用主键字段进行查
询是最快的办法。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 115
第五单元 数据获取
第一课 读数据库表
• 读多个数据库表
– 经常需要从多个数据库表中读取和显示数据。
– 为了更好的理解各个表的关联,需要首先了解 SAP 的
可重用组件。以下是四类可重用组件。
• 逻辑数据库:按表的层次结构组织起来的数据库
• 功能模块:SAP 做好的一些函数库
• BAPIs:SAP 定义的业务逻辑开发接口
• 全局类的方法
– 逻辑数据库的用法可以参考标准课程 BC405,或者联
机文档《ABAP programming and runtime
environment》的《ABAP database access》节。
– 其他几种可重用组件的用法在相应单元有介绍。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 116
第五单元 数据获取
第一课 读数据库表
• 读多个数据库表
– 可重用组件是 SAP 从系统中提炼出来的,但其应用范
围也比较小,因此经常需要自己实现数据访问,最常
用和性能最好的办法就是表连接。
– 当我们定义表连接的时候,需要注意以下三点:
• 连接哪些表
• 连接条件
• 连接哪些列
– 可以用两种方法实现表连接
• 在 ABAP 字典中创建视图,查询时用这个视图作为数据源。
• 在程序中直接使用语句动态生成相应的查询。
– 在一个表连接中可以连接三个甚至更多的表。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 117
第五单元 数据获取
第一课 读数据库表

• 数据库修改访问
– 除了 SELECT 外,开放SQL 还包含了 UPDATE,
INSERT,DELETE 和 MODIFY 等多个语句。
– 需要注意的是,由于 SAP 数据的关联性非常强,直接
用这些语句修改数据表很可能造成数据矛盾。
– 一般要在熟悉了 SAP 事务后才可以用上述语句进行数
据库修改。
– 关于 SAP 事务的概念,可以参考标准课程 BC414。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 118
第五单元 数据获取
第二课 权限检查

• 本课内容
– 解释 SAP 权限检查的概念
– 使用权限检查
– 使用权限检查是为了保护应用数据不被未授权
的人员访问。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 119
第五单元 数据获取
第二课 权限检查
• 权限对象
– 权限对象在权限类中定义,定义权限对象时必须指定
相应字段(不需要值),当创建实际的权限时就为这
些字段指定值,这些权限就可以通过授权参数文件传
递到用户主数据中。
– 可以为一个权限对象创建多个权限,应用到不同的用
户主数据上。
权限:DISPLAY_ALL
权限对象:S_CARRID CARRID = * 参数文件
ACTVT = 03
字段: CARRID
ACTVT 用户主数据
权限:CHANGE_LH
参数文件
CARRID = LH
ACTVT = 02
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 120
第五单元 数据获取
第二课 权限检查
• 权限检查
– 系统运行时,可以使用 AUTHORITY-CHECK 语句来
执行权限检查,以确定用户是否有权限查看进一步的
内容。根据检查结果,可以指定程序流程,检查结果
保存在 sy-subrc 字段里,0 表示检查通过,执行相应
功能,非 0 表示检查未通过,给用户一个权限不足的
提示。
– 通常来说,定义权限对象和在程序中实行权限检查是
开发人员的责任,而定义权限和参数文件,以及定义
用户主数据则是管理员的工作。
– 定义权限对象和实行权限检查分别通过两个不同的步
骤来完成。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 121
第五单元 数据获取
第二课 权限检查

• 创建权限对象
– 在程序里使用权限检查前,首先要设计权限对象,通
过对业务的分析,确定哪些字段需要进行权限检查。
– 一般来说 ACTVT 这个系统定义的字段是必须的,它
定义了权限对象的操作,如创建、读、写、打印等等。
其他字段则需要根据业务情况分析,通常应该定义通
过后台配置填写的较为固定的字段,如组织结构类的
字段。
– 可以使用事务码 SU20 创建权限字段,用事务码
SU21 创建对象类和权限对象,如果包含了 ACTVT 字
段,则还要维护它的可选值。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 122
第五单元 数据获取
第二课 权限检查
• 应用权限检查
– 程序里编写权限检查的代码很简单,可以参考
AUTHORITY-CHECK 的关键字文档,只要正确填写
权限对象和检查字段的值就可以了,不需要填写权限
对象所有的检查字段,没有填写的字段,默认不做检
查,也可以用预定义的 DUMMY 子句代表检查时忽略
该字段。
– 系统的 TACT 表保存了 ACTVT 字段所有可能的值,
TACTZ 表则保存了在各个权限对象中允许的值。
– 在 AUTHORITY-CHECK 语句结束后,可以根据 sy-
subrc 字段的值确定检查结果。
– 可以利用 ABAP编辑器上的“模式”按钮来插入自动生成
的语句,以避免输入错误。除了权限检查外,模式输
入还支持函数、消息、查询、结构等很多语句。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 123
第六单元 程序分析工具

• 单元目标
本单元完成后,应该能:
– 解释运行时分析和代码检查员的意图
– 列出运行时分析和代码检查员的基本功能
– 使用这两个工具对程序进行简单分析

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 124
第六单元 程序分析工具
第一课 运行时分析和代码检查员

• 本课内容
– 解释运行时分析和代码检查员的意图
– 列出运行时分析和代码检查员的基本功能
– 使用这两个工具对程序进行简单分析
– 运行时分析工具可以对程序运行中的需求做详
细衡量,可以用它定位到低效代码,并且根据
需要修改。
– 需要注意的是,性能分析的依据是当前的硬件
和网络环境,到其他环境中,测量结果有可能
发生改变。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 125
第六单元 程序分析工具
第一课 运行时分析和代码检查员

• 运行时分析工具
– 在对象浏览器中用程序的右键菜单,找“执行Execute
-运行时分析 Runtime Analysis”打开运行时分析工具。
– 可以为测试输入名称,以便将来进行比较。
– 运行时分析不但可以分析程序,也可以分析事务或者
函数,可以选择适当的类型。
– 还可以为分析指定变式,从而实现个性化的分析。
– 建议定义一个自己的分析变式,并且设置群组为无,
这样就可以看到每个分析细节。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 126
第六单元 程序分析工具
第一课 运行时分析和代码检查员
• 运行时分析工具
– 程序执行后,会生成一个分析结果。
– 按分析结果的“分析 ”按钮,会生
成一个柱状图,显示了程序、数据库和系统消耗。
– 再用命中列表按钮,就可以看到更详细的针对于程序、
数据表等的分析结果。分析分总值和净值两类,总值
是每个操作总的运行时间,净值只包括总值里未作为
子操作的独立的运行时间。
– 可以把光标定位到某行,然后按“显示源代码 ”按
钮,就直接转到执行的代码处。
– 运行时分析的初始屏幕上的“提示&技巧 ”
按钮,可以看到一些跟性能相关的示例代码及说明。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 127
第六单元 程序分析工具
第一课 运行时分析和代码检查员

• 代码检查员
– 代码检查员是从纯代码角度检查性能、安全和典型的
语义错误,下面列出一些检查的典型特征。
• 性能:数据库访问是否使用了索引,SELECT 语句是否嵌套
在循环中。
• 安全:是否读取了非当前客户端的数据,是否在 SELECT 语
句中动态的指定表和 WHERE 条件。
• 典型语义错误:在 AUTHORITY-CHECK 后没有用 sy-subrc
检查结果,在 CLIENT SPECIFIED 后是否指定了客户端,是
否连续使用 E 类型的消息。
– 检查完成后生成一个树型展开的清单,可以查看具体
的分析结果。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 128
第七单元 在ABAP中使用子程序

• 单元目标
本单元完成后,应该能:
– 定义子程序
– 调用子程序
– 在调试模式分析子程序的执行

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 129
第七单元 在ABAP中使用子程序
第一课 子程序

• 本课内容
– 定义子程序
– 调用子程序
– 在调试模式分析子程序的执行
– 一个复杂程序为了重用和便于阅读,应当划分
成多个子程序调用。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 130
第七单元 在ABAP中使用子程序
第一课 子程序
• 带子程序的内部程序模块
– 子程序是源代码里具有一定独立功能的模块单元。把
子程序
程序的一部分抽取成子程序的原则是:使程序总体看
上去更好,或者把多次使用的一系列语句独立出来。
– 子程序的使用让程序更加面向功能:整个程序划分成
多个子程序,每个子程序完成一定功能。
– 使用子程序也使程序变得更易维护,对某个功能的修
改限定到了子程序内,调试时也能更方便的看到结
果,并且容易查出错误。
– 需要注意,为了让功能独立,子程序中应避免使用主
程序的变量,否则反而会让调试变得困难。很不幸,
ABAP 在全局变量和局部变量的使用上并不容易区
分,编写代码的时候要尽量注意。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 131
第七单元 在ABAP中使用子程序
第一课 子程序

• 带子程序的内部程序模块
– 在一个程序文件中,子程序可以直接访问主程序定义
的变量,但是为了在任何情况下从不同数据对象都能
调用子程序,就不能使用全局变量而用占位符,当调
用时用全局变量替代占位符传递数据。这种占位符叫
做形式参数,它们在一起组成了
形式参数 子程序的接口,要在
子程序的接口
子程序定义的时候一起声明。
– 当子程序被调用时,形式参数被相应的全局变量(实
际参数)替代,实现了对实际值的引用,这种调用子
程序时实际参数传递给形式参数的过程就称作参数传
递。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 132
第七单元 在ABAP中使用子程序
第一课 子程序

• 带子程序的内部程序模块
– 参数传递有三种方法
• 值调用:复制一份实际参数的拷贝并保存到形式参数中,如
值调用
果子程序中修改了形式参数,这个修改不会作用到实际参数
上。使用这种方式传递大量数据比如一个内表的时候,比较
耗时。
• 值和结果调用:这种方式跟值调用很相似,唯一的不同在
值和结果调用
于,当程序正常结束时,对形式参数的修改会被写回实际参
数,而如果用 STOP 语句或者 E 类型的消息强制退出子程序
时,就不会写回实际参数。缺点也是传输大量数据时很耗时。
• 引用调用:实际参数直接指向了形式参数,这意味着对形式
引用调用
参数的修改直接作用在实际参数上。如果希望直接修改实际
值就用这种方式调用,这样比较合适对大的内表操作。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 133
第七单元 在ABAP中使用子程序
第一课 子程序

• 定义和调用子程序
– 子程序的定义
• 以 FORM 开始
• 在 FORM 之后是子程序名和参数
• 接下来是子程序内容
• 最后以 ENDFORM 结束
• 参数的写法如下
– 值调用:在 USING 节用 VALUE(f1) 的形式
– 值和结果调用:在 CHANGING 节用 VALUE(f2) 的形式
– 引用调用:在 CHANGING 节用 f3 的形式,不要 VALUE
• 注意,在 USING 节不用 VALUE 的也算引用调用,也就是
说,使用 USING 仅为避免传递内表时的耗时数据拷贝。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 134
第七单元 在ABAP中使用子程序
第一课 子程序

• 定义和调用子程序
– 调用子程序时,实际参数按照 USING 和 CHANGING
的定义依次传递给形式参数,传递顺序与参数名称无
关,只按调用顺序。
– 形式参数一般需要定义类型,如果使用 TYPE ANY 或
者未指定类型,则实际参数也可以是任意类型的。在
运行时,根据实际参数的类型再动态指定形式参数的
类型(类型继承)。如果操作参数的语句跟类型不匹
配就会出现运行时错误。因此这种方式只能用在程序
开始时实际参数的类型还未指定,或者类型可以在运
行时修改的情况(动态程序)。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 135
第七单元 在ABAP中使用子程序
第一课 子程序

• 定义和调用子程序
– 为形式参数定义类型可以在语法检查的时候就知道形
式参数与实际参数是否匹配,这增加了程序的健壮性。
– 如果使用了标准类型(C、N、P 或 X),则不允许使
用 LENGTH 定义形式参数的长度,类型的长度要到运
行时才由传入的实际参数决定。但是可以使用通过定
义本地类型来指定实际参数的长度。
– 对于结构和内表的形式参数,则必须指定类型,这样
才能划分出传输对象的组件,从而得到结构和内表的
结构,以获得每个具体的组件的值。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 136
第七单元 在ABAP中使用子程序
第一课 子程序
• 全局对象和本地对象的可见性
– 在主程序里定义的数据对象称为全局对象,在整个程
序和每个子程序里都能看到。
– 在子程序里定义的数据对象称为本地对象,它们跟形
式参数一样只存在于子程序内部,在子程序运行时分
配内存空间,运行完后就释放。
– 形式参数和本地对象不能重名,如果全局对象跟本地
对象重名,则在子程序内部访问的是本地对象,在主
程序里访问的是全局对象。这叫做“阴影规则”,在子程
序里,本地对象“遮蔽”了同名的全局对象。
– 为了区分全局对象和本地对象,建议使用不同的前缀
命名对象,比如全局用 g_ 开头,参数用 f_ 开头,本
地用 l_ 开头。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 137
第七单元 在ABAP中使用子程序
第一课 子程序

• 调用子程序
– 通常使用 PERFORM 语句调用子程序。
– 在对象浏览器里,编写子程序并保存后,就会在导航
区显示出这个子程序,可以把它直接拖拽到要调用的
位置,系统就会自动生成调用代码,开发者只需要把
相应的形式参数修改成实际参数就可以了。
– 在 ABAP 编辑器里,可以使用模式功能实现上述操作。
– 使用自动生成的好处是不会忘记参数或搞混。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 138
第七单元 在ABAP中使用子程序
第一课 子程序
• 调试子程序
– 如果调试执行到子程序调用行,使用“执行”按钮(F6)
就可以直接运行整个子程序,跳到主程序的下一行,
而使用“单步”按钮(F5)则进入子程序内部,执行子
程序的每条语句。
– 如果当前行在子程序内部,可以使用“返回”按钮(F7)
执行子程序中剩余语句。
– 这些调试按钮在新版调试器里也都有效。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 139
第八单元 ABAP事件简介

• 单元目标
本单元完成后,应该能:
– 说明 ABAP 程序执行过程中的事件控制流程
– 列出最重要的基本事件并解释它们的意义
– 恰当使用常用基本事件

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 140
第八单元 ABAP事件简介
第一课 ABAP事件

• 本课内容
– 说明 ABAP 程序执行过程中的事件控制流程
– 列出最重要的基本事件并解释它们的意义
– 恰当使用常用基本事件

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 141
第八单元 ABAP事件简介
第一课 ABAP事件
• ABAP事件的用法 事件 ABAP程序
– 程序开始后,所有全局对象 程序开始 REPORT
REPORT …

PARAMETERS
PARAMETERS …

首先在工作内存区创建。然 初始化 DATA
DATA …

后,运行时系统按顺序触发
INITIALIZATION.
INITIALIZATION.
相应事件。如果程序中存在 显示选择屏幕
<语句>
<语句>
对事件的过程块,则该块中
开始执行 AT
AT SELECTION-SCREEN.
的语句会顺序执行。 SELECTION-SCREEN.
<语句>
<语句>
– 右图显示了基本事件的触发 执行程序
START-OF-SELECTION.
START-OF-SELECTION.
顺序。 <语句>
<语句> -WRITE
-WRITE
在清单中显示
– 所有 WRITE 的输出先保存 清单缓存
在清单缓存里,只有在事件 清单
START-OF-SELECTION 缓存

执行后才会显示清单缓存。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 142
第八单元 ABAP事件简介
第一课 ABAP事件
• ABAP事件的用法
– 如果 PARAMETERS 输入参数的值在
INITIALIZATION 事件中指定,则当选择屏幕显示
时,这个值就作为默认值显示到屏幕上。这种方法可
以作为设定 PARAMETERS 参数默认值的一个补充,
这样就可以在运行时根据需要
运行时 动态调整屏幕的默认值。
动态调整屏幕的默认值
下面的例子说明了这个用法。
REPORT.
PARAMETERS pa_date LIKE sy-datum DEFAULT sy-datum.

INITIALIZATION. pa_date 的值 2007-05-24


IF <cond>.
pa_date = pa_date + 7. 满足一定条件后
ENDIF. pa_date 的值 2007-05-31

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 143
第八单元 ABAP事件简介
第一课 ABAP事件

• ABAP事件的用法
– 如果用户在选择屏幕用 F8 确认输入,相应输入都被
保存到 PARAMETERS 参数中,并且触发 AT
SELECTION-SCREEN 事件,因此这个过程块适用于
进行输入和权限检查。在这个过程块中显示
输入和权限检查 “E” 类型
的消息则会返回选择屏幕并显示错误消息。在选择屏
幕(Selection Screen)一课中会详细说明。
– 如果 AT SELECTION-SCREEN 事件中没有遇到 E 类
消息,则会继续执行 START-OF-SELECTION 事件,
程序的主处理流程一般都写在这个事件块中。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 144
第八单元 ABAP事件简介
第一课 ABAP事件
• 事件块的一些基本特性
– 事件块没有嵌套,因为嵌套违反了 ABAP 事件的基本
概念。
– 如果某个事件块没有写,则该事件触发时什么也不做。
– 由于 ABAP 运行时环境控制着事件和事件的触发,因
此代码中事件块的先后顺序并不重要。 并不重要
– 如果程序中一个事件块都没有写,那就认为全都是写
在 START-OF-SELECTION 事件中。这也就是为什么
以前的那些简单程序都能执行。
– 除了前面解释的那些基本事件,还有一些完成其他任
务的事件,如:AT LINE-SELECTION 在双击清单的
某一行时触发,可以用来显示进一步的详细信息。
– 后面的列表(List)课程会详细说其他相关内容。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 145
第八单元 ABAP事件简介
第一课 ABAP事件
• 程序结构
– 跟前面说明的事件意义不完全一样,还有一类“事件”就
是子程序调用,子程序(FORM … ENDFORM)可以
看作是 PERFORM 事件触发的一类事件块。
– 需要注意的是,一般事件块没有结束标志,遇到一个
新的事件块或者子程序定义时就标志着当前事件块的
结束。
– 为了完成更复杂的功能,ABAP 提供了多个屏幕互相
调用的能力,除了屏幕布局外还要使用逻辑流的概 逻辑流
念,它提供了更多的模块以完成各种复杂的用户交
互,主要是 Process Before Output(PBO)和
Process After Input(PAI),这种复杂逻辑后面会详
细讲述,并且还有多个专门的 BC 课程讲述相关的各
种技术。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 146
第九单元 用户会话

• 单元目标
本单元完成后,应该能:
– 说明 ABAP 列表的属性和优点
– 应用列表和列标题
– 应用多级列表
– 应用交互式列表
– 说明选择屏幕的属性和优点
– 在选择屏幕上应用选项限制输入
– 在选择屏幕上使用输入、权限检查和错误消息

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 147
第九单元 用户会话

• 单元目标
– 列出屏幕的属性和用处
– 应用带输入、输出和按钮调用的简单屏幕
– 解释和应用在屏幕上调用程序内部进程
– 应用 GUI 标题(窗口标题)
– 应用 GUI 状态(菜单、系统和应用工具栏)
– 维护屏幕的功能键定义
– 列出 ABAP Web Dynpro 程序的属性和使用
– 列出 ABAP Web Dynpro 程序的运行时结构

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 148
第九单元 用户会话
第一课 列表

• 本课内容
– 说明 ABAP 清单的属性和优点
– 应用列表和列标题
– 应用多级列表
– 应用交互式列表

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 149
第九单元 用户会话
第一课 列表
• 列表的特性
– 使用列表主要为了用最小的代码量显示数据,还考虑
到一些特殊的业务数据需求。
• 列表可以设计多语言单元:以登录语言显示文字和标题,用
一个事务就可以了。
• 列表可以用相应的货币显示金额。
– 编写列表时还可以有以下选择:
• 屏幕:可以加颜色和图标
• 打印机
• 广域网和局域网:列表可以自动转换成 HTML 格式
• 保存:可以保存在 SAP 中,也可以是其他地方(例如给表格
计算程序做进一步处理)
– 标准的列表 GUI 提供了一些常用功能,还可以用菜单
绘制器来增加新的功能。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 150
第九单元 用户会话
第一课 列表
• 列表和列抬头
– 每个列表都有单行的列表抬头和最多4行的列抬头,如
果没有定义列表抬头,则用程序标题(短描述)来代
替。
– 初始维护表头的时候,可以先激活程序,然后运行并
初始维护
显示列表,通过选择菜单的“系统-清单-清单表头”来
维护表头,下次运行程序的时候,这个表头就会自动
带出来。
– 如果需要修改已维护过的表头(重复维护),就不必
再次开始程序生成列表了。只需要把程序读到 ABAP
编辑器中,然后通过菜单的“转到-文本元素-清单标
题”来修改表头。
– ECC5 中创建并激活程序后就可以维护文本元素了,
不需要前面说的先执行才能维护。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 151
第九单元 用户会话
第一课 列表
• 列表的多语言能力
– 程序的文本元素(包含表头)可以被翻译成多种语
言,当用户执行程序的时候,文本元素会自动用当前
登录语言显示。
– 在 ABAP 编辑器中,可以用菜单“转到-翻译”来翻译
程序的文本元素。
– SAP 使用文本符号实现多语言功能,文本符号包含三
个数字的ID和可翻译的文本,它与表头一样都属于文
本元素。有两种方式定义文本符号:
• 在 ABAP 编辑器中,通过菜单“转到-文本元素-文本符号”
• 在源代码中先写一个文本符号的ID,再双击创建。
– 在程序里用 TEXT-xxx 标记文本符号,运行时系统就
会根据当前登录语言插入相关的翻译。
– 注意文本元素也是必须激活后才能使用的。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 152
第九单元 用户会话
第一课 列表

• 生成基本列表
– 使用 WRITE 语句就能生成一个基本列表,还可以使
用 SKIP 和 ULINE 配合 WRITE 对列表做美化。
• 生成明细列表
– 用户在基本列表上双击或者按 F2 来选择某个位置,
就触发了 AT LINE-SELECTION 事件。如果想要系统
显示一个包含了细节信息的列表(交互式列表)以响
应用户操作,就要在相应的过程块中编写程序,读出
用户所需数据并用 WRITE 输出,明细列表就会覆盖
前面的基本列表。使用工具栏上的“返回 ”按钮或按
F3 键,还可以回到前面的基本列表。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 153
第九单元 用户会话
第一课 列表
• 生成多个明细列表
– 明细列表中的行选择还可以触发 AT LINE-
SELECTION 事件,这意味着相应的代码可以在明细
列表中再次执行,因此在这个事件块中必须能够确定
当前是哪个列表,才能够做进一步工作。可以使用 sy-
lsind 变量,它指示了当前列表级别:0 是基本列表,
1 是第一级明细列表,依此类推。每次的行选择都将
使 sy-lsind 的值加 1,最多可以加到 20 层。
– 这样就可以在 AT LINE-SELECTION 中使用 sy-lsind
来控制程序处理(比如:可以用 CASE 语句)。
– 如果行选择后在 AT LINE-SEELCTION 中没有生成明
细列表,则 sy-lsind 自动减 1。这样,系统就继续显
示当前级别的列表。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 154
第九单元 用户会话
第一课 列表
• 简单的语法示例
– 基本列表上,显示 START-OF-SELECTION.
START-OF-SELECTION.
Basic List,sy-lsind 值 WRITE:
WRITE: // ‘Basic
‘Basic List’,
List’,
为 0。 // sy-lsind.
sy-lsind.

– 选择基本列表的行后, AT
AT LINE-SELECTION.
LINE-SELECTION.
显示 1st Detail,sy- CASE
CASE sy-lsind.
sy-lsind.
lsind 值为 1。 WHEN
WHEN 1.1.
WRITE:
WRITE: // ‘1st
‘1st Detail’,
Detail’,
– 选择明细列表的行后, // sy-lsind.
sy-lsind.
显示 2nd Detail,sy- WHEN
WHEN 2.2.
lsind 值为 2。 WRITE:
WRITE: // ‘2nd
‘2nd Detail’,
Detail’,
// sy-lsind.
sy-lsind.
– 选择第二个明细列表的 ENDCASE.
ENDCASE.
行后,没有新的列表生
成,仍留在当前列表。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 155
第九单元 用户会话
第二课 选择屏幕

• 本课内容
– 说明选择屏幕的属性和优点
– 在选择屏幕上应用选项限制输入,除了前面用
过的 PARAMETERS 外,还学习用 SELECT-
OPTIONS 进行复杂的多值输入
– 在选择屏幕上使用输入、权限检查和错误消
息,用 AT SELECTION-SCREEN 来实现

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 156
第九单元 用户会话
第二课 选择屏幕
• 选择屏幕的架构和意图
– 一般来说,选择屏幕用来输入查询数据的选择标准。
使用选择标准就能读取真正需要的部分数据出来。除
了减少内存占用外,还会大量减小网络带宽。
• 选择屏幕的属性
– 选择屏幕的文字可以维护成多种语言,并且系统自动
根据登录语言选择显示文字。
– 系统进行类型检查,与输入字段类型不符的用户输入
会被 GUI 自动忽略,并从屏幕上删除。
– 除了单值选择外,还能使用多值选择多个复杂数据。
– 如果用字典元素定义输入字段,就可以用 F1 查看技
术信息,用 F4 查看搜索帮助。
– 可以把当前输入保存为变式,为以后重复利用。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 157
第九单元 用户会话
第二课 选择屏幕

• 使用选择选项
– 选择选项包括大于、小于、不等于等比较条件,并且
能够输入范围、多个单值及各种混合输入。
• 选择屏幕上全局类型的语义信息
– 如果输入字段的类型是数据元素,可以在选择屏幕上
显示几种附加的语义信息。
• 数据元素的文本标签可以显示在选择屏幕上,用来说明字段。
• 当按 F1 时可以调出帮助文档。
• 当按 F4 时可以调出搜索帮助。
– 输入字段的类型是结构字段,同样有以上的语义信
息,如果结构字段定义了自己的搜索帮助,则可以覆
盖数据元素的搜索帮助。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 158
第九单元 用户会话
第二课 选择屏幕
• 选择文本
– 在选择屏幕上,默认出现的是输入字段的变量名,可
以用相应的选择文本替换,选择文本也属于文本元
素,可以翻译成多种语言。
– 如果输入字段直接或间接引用了文本元素,就可以从
字典中获取文本元素的长文本,这提供了一个输入文
字的简便方法。
• 变式
– 填写完成的选择屏幕可以保存成变式,程序开始用,
用户可以选择变式重复输入相同或相近的内容。如果
要在后台运行带选择屏幕的程序,则必须输入变式,
因为后台运行是没有人工输入的。
– 保存变式很简单,只要在运行程序填写完选择屏幕
后,按下保存按钮即可。变式还可指定多种属性。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 159
第九单元 用户会话
第二课 选择屏幕

• 变式(续上页)
– 如果一个程序保存了变式,就会在应用工具栏多出一
个选择变式的按钮。
– 用户定义自己的变式需要具有相应授权,开发者也可
以在开发系统定义好变式传输到生产系统上。前缀带
“CUS&”的是系统变式,它们自动的跟着报表被传送,
并且不指定客户端。其他指定客户端的变式则需要单
独传输,通过 ABAP 编辑器的菜单“转到-变式”,进
入程序的变式管理,这里可以维护变式的各种属性,
在这里再用菜单“实用程序-传输请求”来指定变式所属
的请求号,这样就可以把一个变式挂在请求上传输了。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 160
第九单元 用户会话
第二课 选择屏幕
• 选择屏幕的输入类型
– 单值输入。使用 PARAMETERS 语句创建一个单值输
入框,会在程序中创建一个同名变量同时在屏幕上显
示一个单值输入框。
• 输入变量的名字最多 8 个字符
• 输入变量类型不能是基本类型 F 、STRING 或 XSTRING
• 默认值用 DEFAULT 指定,而不是 VALUE。
– 默认值指定后,还可以在显示选择屏幕之前的程序事
件(INITIALIZATION)中修改这个值,这时默认值被
覆盖了,选择屏幕显示的就是修改后的值。
– 当用户开始执行程序时,输入值被传递给程序内部的
输入变量,用于程序的操作。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 161
第九单元 用户会话
第二课 选择屏幕
• 选择屏幕的输入类型
– 复杂输入。使用 SELECT-OPTIONS 语句创建一个复
杂输入框,这会在程序中创建一个同名内表同时在屏
幕上显示一个复杂输入框。
– 用户输入的项会自动填入内表中,内表有四个列:
sign、option、low 和 high 分别代表不同的意义
• sign:I(inclusive,包含),E(exclusive,排除)
• option:逻辑运算符,EQ、GT、LT、GE、LE、BT 等等
• low和high:值的上下限范围
– 输入变量的名字、类型、默认值的定义以及基本处理
方式跟 PARAMETERS 类似
– 另外,复杂输入也可以用在一般的逻辑表达式里:
IF wa_spfli-carrid IN so_car.

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 162
第九单元 用户会话
第二课 选择屏幕
• AT SELECTION-SCREEN 事件
– 在选择屏幕之后,按了回车或者 F8 会触发 AT
SELECTION-SCREEN 事件。如果按了 F8,这个事
件块执行完后,继续触发 START-OF-SELECT,如果
按回车,则重新显示当前选择屏幕。
– 在处理 AT SELECTION-SCREEN 事件前,用户输入
会自动传给输入变量,因此可以在这个事件块里面处
理输入检查和权限检查。如果检查失败,就给用户一
个错误消息并且重新显示选择屏幕,让用户重新输入
新值。
– 而在 START-OF-SELECT 事件块中的错误消息则会
终止程序运行。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 163
第九单元 用户会话
第三课 屏幕

• 本课内容
– 列出屏幕的属性和用处
– 应用带输入、输出和按钮调用的简单屏幕
– 解释和应用在屏幕上调用程序内部进程

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 164
第九单元 用户会话
第三课 屏幕
• 屏幕的基本特性
– 屏幕不仅仅包括其中输入/输出字段、按钮和其他屏幕
元素,还包括处理流程(表明程序是在屏幕显示前还
是显示后执行)。
– 系统自动提供了对与 ABAP字典 相关的屏幕输入字段
进行的有效性检查,包括类型检查、外键检查和固定
值检查等。所有这些检查都由 ABAP字典 自动支持。
– 上述检查也可以在程序中进行,这样我们就能控制检
查的顺序和在出现错误时重新定位输入字段。
– 布局的设计可以非常灵活,包括输入字段、输出字段、
单选按钮、复选按钮以及决定哪段代码被执行的按钮。
– 屏幕上各个字段的输入和输出格式跟在列表和选择屏
幕中一样,都根据用户设置来显示。例如:日期格式、
小数点、千分位、货币、长度和重量等等。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 165
第九单元 用户会话
第三课 屏幕
• 屏幕序列
– 通过调用程序块的第一个屏幕开始屏幕序列,一个屏
幕执行后,就会处理动态或者静态的屏幕序列,Next
Screen = 0 这个固定用法是把处理还给屏幕调用点。
• 屏幕的组件
– 每个屏幕都有下列组件
• 属性:包括 4 位数字的屏幕号,短文本,屏幕类型信息,通
常还会指定一个默认的下一个屏幕。
• 布局:放置各种输入/输出字段、文本、按钮和其他屏幕元素。
• 元素清单:列出屏幕元素和它们的属性,如位置、大小、数
据类型等信息。
• 逻辑流:屏幕的逻辑流包括 PBO(Process Before Output)
和 PAI(Process After Input),PBO 包含了发送屏幕前准备
屏幕显示的过程块,PAI 包含了对用户输入的处理过程块。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 166
第九单元 用户会话
第三课 屏幕
• 图形布局编辑器
– 使用图形化的屏幕绘制器,可以设计屏幕布局,还可
以用下面三个按钮实现维护功能。
• 维护元素属性:在一个对话框里会显示所选屏幕元素的属性。
• 获取字典或屏幕字段:可以在对话框里通过引用 ABAP字典
或程序字段来创建屏幕字段。
• 显示元素清单:显示所有屏幕元素的属性以便维护。
• 应用实例
– 下面将一步步的建立一个程序。这个程序让用户修改
航班时间表主数据。
– 航班显示在基本列表里,当用户选择一行时,就会进
入修改界面,可以使用“返回”按钮取消修改或者按“保
存”按钮修改数据。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 167
第九单元 用户会话
第三课 屏幕
• 应用实例
– 创建和调用屏幕
• 首先要创建屏幕、指定布局、定义字段属性,字段 Airline
Carrier, Flight Number, Departure Airport, 和 Destination
Airport 都是输出字段,Flight Duration 和 Departure Time 是
允许修改的字段。
• 用户应该能在基本列表中双击一行调用屏幕,还要在屏幕上
选择适当功能返回基本列表。
• 创建屏幕有两种方法,可以在代码中双击调用屏幕号,由系
统提示创建,或在对象浏览器中直接创建。
• 创建屏幕时首先要指定屏幕属性,输入短文本,选择屏幕类
型 Normal,输入后续屏幕号。
• 如果后续屏幕是 0,就在执行完当前屏幕后返回屏幕的调用点。
• 在例子中,是通过基本列表调用屏幕的,因此 CALL
SCREEN 应该写在 AT LINE-SELECTION 事件块中。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 168
第九单元 用户会话
第三课 屏幕
• 应用实例
– 创建输入/输出字段
• 创建屏幕字段时有两种方法指定字段属性。
• 从字典中获取:可以把字典字段的属性拷贝给屏幕字段,这
样可以带来字典对象的全部属性,如语义信息和外键依赖,
一般字段名字也会拷贝过来。
• 从程序中获取:可以把程序内部定义的数据对象拷贝给屏幕
字段,这种用法必须首先激活程序。
• 图形化的屏幕绘制器可以很方便的定义更多的屏幕元素,如:
文本、选项卡、单选按钮、复选框等等,首先单击工具栏上
的屏幕元素,再把它放置到屏幕上指定位置。
• 可以选中一个元素并按 Delete 键删除它。
• 可以拖拽一个元素改变它的位置。
• 可以拖拽元素的边缘改变它的大小。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 169
第九单元 用户会话
第三课 屏幕

• 应用实例
– 维护屏幕元素的属性
• 双击屏幕元素可以打开它的属性对话框,它的所有属性都显
示在这个窗口中。不用双击的话,也可以选中元素再按“属性”
按钮。
• 若要某个屏幕字段强制必输,可以选中属性中的 Require。在
运行时,如果它为空的时就显示一个提示,如果提交时未输
入,就会出现一个错误提示,然后继续等待输入。
– 在屏幕上显示数据
• 在实现的第一层,当基本列表上的一行被选中时就显示屏
幕,但是所有字段都还是初始值,在第二层上,要编写程序
把程序中的数据传递给屏幕并显示出来。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 170
第九单元 用户会话
第三课 屏幕
• 应用实例
– 用 TABLES 结构做为屏幕的接口
• TABLES 语句用来在程序中定义一个与参考字典结构(如透
明表)具有相同类型和名字的结构变量。这个结构变量可以
做为程序和屏幕之间的接口。
• 如果屏幕字段和 TABLES 语句具有相同结构的类型,它们字
段的数据会自动的根据相同名字进行交换。在
自动 PBO 后从表结
构传给屏幕,在 PAI 前从屏幕传给表结构。
• 通常为了数据交换会明确定义字典结构,这个结构包含了多
个数据库表的字段和类型,在屏幕上字段根据这个结构来定
义,并且在程序中用 TABLES 语句声明结构接口。这样就可
以得到一个清晰的接口结构在程序和屏幕间交换数据,而不
用管它们的字段来自多个表。在我们的航班数据模型中,就
创建了 SDYN_CONN 结构使用来自SCARR, SPFLI和
SFLIGHT 表的字段,还有SDYN_BOOK 结构使用来自
SBOOK 和 SCUSTOM表的字段。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 171
第九单元 用户会话
第三课 屏幕
• 应用实例
– 用 TABLES 结构做为屏幕的接口
• 在 PBO 事件处理之后,把屏幕发送给表示层服务器之前,程
序中 TABLES 结构的字段内容被自动的拷贝到具有相同名字
的屏幕字段。可以在 PBO 模块准备屏幕显示的数据。
• 在屏幕上用户操作时,屏幕字段的内容在 PAI 事件执行之前
被拷贝给同名的 TABLES 结构字段。这样就可以把用户输入
传递给 PAI 进一步处理。
– 示例程序中的数据传输
• 基本列表建立时,数据对象和值都保存在 HIDE 区中,选中
行的数据会写回到相应对象中。在这里我们把键字段写入
HIDE 区,选中行时就可以得到相关信息。
• 用适当语句把要显示的数据写入 TABLES 结构,例子中字典
结构 SDYN_CONN,会同时定义屏幕字段和 TABLES 结构。
• 屏幕上用户操作时,用户输入会传递给 TABLES 结构
SDYN_CONN 进一步处理,这在 PAI 前发生。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 172
第九单元 用户会话
第三课 屏幕
• 应用实例
– 读取数据的时机和优缺点
• 在把屏幕发送给表示层服务器前,任何时候都能读取需要显
示的数据。
• 1、在显示基本列表之前就把需要显示的数据从数据库里读出
来,然后把数据和键信息放在 HIDE 区域中,在 AT LINE-
SELECTION 事件中,只需要把数据拷贝到 TABLES 结构中
即可。这种方法的坏处是会读出很多用户不需要的数据,并
且万一在创建基本列表和显示屏幕之间修改了数据,则会显
示出过时数据。
• 2、在调用屏幕前用 SELECT SINGLE 的方法读取一条数据
显示。缺点是每次用户双击列表都要访问数据库,优点是只
读需要的数据,而且总是最新的。
• 如果要修改数据,则必须保证数据是最新的,并且需要设定
一个锁以避免其他人进行修改。BC414课程详细讲述这些。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 173
第九单元 用户会话
第三课 屏幕

• 应用实例
– 应用按钮
• 显示了屏幕之后,还要使不同的按钮对应不同的程序,在用
户进行不同操作时执行相应过程。
• 如果按了“返回”按钮,则直接返回基本列表,不向数据库写入
数据,并且在基本列表的状态栏显示“你没有保存就离开屏幕”。
• 如果选择“保存”按钮,则在数据库执行修改,并且在基本列表
的状态栏显示相应信息。(数据库更新在程序里迟一点再
做,而按钮已经准备好了。)
• 如果按了“回车”,则重新显示屏幕。
• 本节主要包含下列细节:
– 在 PBO 和 PAI 事件块中的屏幕逻辑流
– 为相应事件编写的 PBO 和 PAI 模块作为处理块
– 应用按钮和评估用户操作
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 174
第九单元 用户会话
第三课 屏幕
• 应用实例
– 应用按钮
• 如果用户选择了一个按钮,运行时系统就把指定的功能码拷
贝到一个专门的屏幕字段,这个字段一般叫做 ok_code。
• 如果程序中有一个同名的数据对象,这个特殊屏幕字段的值
就会自动拷贝过去,然后,触发 PAI 过程,这里就可以通过
传输的功能码来确定用户操作,从而执行相应处理。
• 在屏幕绘制器中需要添加按钮,指定名称、显示文字和功能
码,同时在屏幕的元素清单中总会有一个默认的 OK 类型的
命令字段,一般我们用 OK_CODE 做为它的名字。而在程序
中要对应定义一个 sy-ucomm 类型的变量 ok_code(DATA
ok_code TYPE sy-ucomm)。这样在触发按钮的时候,系统
就会自动把屏幕元素 OK_CODE 的值传给程序变量 ok_code。
– 从前面几节可以看出,屏幕跟程序变量的赋值完全是
自动进行的,只要它们的名字相互对应即可。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 175
第九单元 用户会话
第三课 屏幕
• 应用实例
– 屏幕流控制的运行时结构
• CALL SCREEN 语句用来触发屏幕处理,包括以下几步。
• PBO 处理:为了准备显示屏幕,PBO 模块在 PBO 块中列出
并依次执行。
• 从程序到屏幕的字段传输:在 PBO 模块后,TABLES 结构的
字段内容被传输到同名的屏幕字段中。
• 屏幕显示:指定了值的屏幕被发送给表示层服务器(SAPgui)
显示给用户。
• 从屏幕到程序的字段传输:在屏幕上的任何用户操作都会触
发这一传输,屏幕字段内容传输给同名的 TABLES 结构字段。
• PAI 处理:做为对用户操作的响应,PAI 中列出的模块将会依
次执行。
• 模块是没有接口的程序块,包括在 ABAP 语句 MODULE 和
ENDMODULE之间。在 PBO 和 PAI 中的每个子功能,都应
该实现相应的模块。
– 屏幕的逻辑流仅包含对模块的引用,而没有其他代码。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 176
第九单元 用户会话
第三课 屏幕
• 应用实例
– 响应 PAI 事件的功能码
• 在 PAI 开始后,就应该开始处理功能码。
• 通常,在 PAI 中的主过程叫做 USER_COMMAND_nnnn,
nnnn就是屏幕号。
• 在模块中可以访问程序的所有全局数据对象,在模块中定义
的数据对象也是全局的。
– 创建模块
• 在程序中写 MODULE module_name,双击这个模块名,系
统就会自动提示创建。
• 在对象浏览器中用上下文菜单来创建,但是要注意,之后必
须手工在屏幕逻辑流中增加相应模块调用。
• 一个模块可以被多个不同屏幕的逻辑流调用。
• PBO 模块必须以 MODULE … OUTPUT 开始定义,而 PAI
模块必须用 MODULE … INPUT 开始定义。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 177
第九单元 用户会话
第三课 屏幕
• 应用实例
– Next Screen 属性
• 如果在屏幕属性的 Next Screen 属性填了 0,则系统首先处
理屏幕,然后返回这个屏幕的调用点。
• 如果 Next Screen 属性填了当前屏幕号,则在屏幕关闭后将
再次执行。
– 动态修改 Next Screen 属性
• 在 ABAP 程序的模块(通常是 PAI 模块)中可以使用 SET
SCREEN 语句来覆盖 Next Screen 属性所指定的默认屏幕。
这样就可以实现按下“输入”按钮就保留在当前屏幕,而按下其
他按钮则转到相应其他屏幕。默认情况下“输入”按钮在屏幕字
段没有功能码,因此,就会传递 space 给程序的功能码。
• 注意:如果系统再次处理当前屏幕,所有 PBO 模块都会重新
执行,如果决定在 PBO 中填写 TABLES 结构,必须确保再
次调用模块时,用户对屏幕的修改不被覆盖。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 178
第九单元 用户会话
第三课 屏幕
• 应用实例
– 无意识的功能码传输
• SAP 的一个固有特点会造成功能码异常传输。
• 用户选择了基本列表的一行,发送屏幕修改数据,在按了“保
存”按钮后,将修改保存到数据库然后返回基本列表,如果用
户选了其他行,当他按了回车时就不会再显示屏幕,而是把
数据保存到数据库并且返回了基本列表,这是为什么?
• 当用户保存数据是,系统把’SAVE’这个功能码记录到程序变
量 ok_code 里,当选择另外一行,重新调用 PBO 模块时,
相应字段传给屏幕,而 ok_code 的值仍是 ’SAVE’,当按下回
车时,没有填写功能码,因此这个 ’SAVE’值保留了下来。
• 可以用下列方法避免这种功能码异常
– 在字段传输给屏幕之前的 PBO 模块中初始化变量 ok_code。
– 在 PAI 模块中添加一个附加变量,用它保存 ok_code 的值,并
且立即清除 ok_code 的值。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 179
第九单元 用户会话
第四课 用户接口

• 本课内容
– 应用 GUI 标题(窗口标题)
– 应用 GUI 状态(菜单、系统和应用工具栏)
– 维护屏幕的功能键定义

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 180
第九单元 用户会话
第四课 用户接口
• 用户接口
– 屏幕的用户接口包括以下元素
• 标题栏包含当前屏幕的标题(GUI title)。
• 菜单栏包含可扩展的菜单,每个菜单项和子菜单都具有一定
程序功能。
系统和帮助两个菜单项在每个屏幕上都有并具有相同的功
能,它们不能隐藏或修改。
• 在 SAP 的每个屏幕,标准工具栏都是一样的,包含了最常用
的功能,如果当前屏幕不能使用就变灰。
• 屏幕的功能键指定可以显示在右键菜单,理论上,可以使用
功能键执行任何菜单功能。
• 在应用工具栏,显示当前屏幕的常用功能。
• 菜单栏、标准工具栏、功能键和应用工具栏组成 SAP status。
– 在屏幕上应用 GUI title 和 GUI status 需要相应语句,
SET TITLEBAR 和 SET PF-STATUS。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 181
第九单元 用户会话
第四课 用户接口
• 用户接口
– 应用 GUI title
• 创建 GUI title 的方法,一个是在对象浏览器中创建并在程序
中应用,一种是在程序中写好再双击创建。
• 对象名最多 20 个字符。
• 给一个屏幕指定 GUI title 后,所有后续屏幕也都继承,除非
单独为新屏幕指定。
(对于 GUI status 也是类似的,后续屏幕会继承前面屏幕的
菜单和工具栏,除非单独指定新的。)
– 示例程序的目标
• 在列表和屏幕上显示相同的菜单,当前可执行的功能都显示
为黑色,而不可执行的功能显示为灰色。
• 工具栏跟菜单类似,可执行的为彩色,不可执行的灰色。
• 这个目标实现了整个程序的接口一致性。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 182
第九单元 用户会话
第四课 用户接口

• 用户接口
– 通过引用重用已定义的子对象
• 为了便于维护,维护屏幕状态的时候不需要重新指定子对象
的菜单、应用工具栏和功能键,而是引用现有的状态。当
然,我们仍将必须决定每个单独状态的定义和相应屏幕的功
能以及是否激活。
• 创建 GUI status 的方法跟创建 GUI title 类似。
• 对于一般的屏幕指定屏幕类型为“dialog status”。
• 维护状态的工具叫做菜单绘制器。
• 如果使用了屏幕逻辑流 PBO 模块中预定义的 STATUS_nnnn
模块,并且用向前导航功能创建相应的程序模块,则系统自
动在模块中生成 SET PF-STATUS 和 SET TITLEBAR 两个
注释语句。我们可以移除注释,修改对象名,并双击生成相
应的标题和菜单。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 183
第九单元 用户会话
第四课 用户接口
• 设计用户接口
– 包含模版
• 为了调用现有的状态(列表或选择屏幕的标准菜单,其他程
序的状态)做为自己状态的模版,可以在菜单绘制器中使用
菜单“Extras-Adjust Template”,把其他程序的菜单调用过来。
– 维护菜单栏
• 可以按“使用标准”按钮显示标准的菜单值,并允许自己修改。
• 菜单栏最多包含 8 项,由于 System 和 Help 占用了两项,用
户可以定义 6 项自己的菜单。
– 维护功能键
• 标准工具栏:标准工具栏上的按钮连接到固定的功能。
• 建议的功能键:系统建议某些功能键对应到特定功能,用户
习惯于这种用法,因此尽量不要修改。
• 自由分配:其他的功能键则可以根据需要自由分配。
• 可以把经常用的功能键定义到应用工具栏上,可以显示为一
个图标或者带文字的图标。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 184
第九单元 用户会话
第四课 用户接口

• 设计用户接口
– 功能键和屏幕按钮
• 在应用工具栏的按钮和通过屏幕绘制器放在屏幕上的按钮不
太一样,但是效果很相似。它们把功能码放到屏幕的命令
行,把字段传输给程序和 PAI 过程。不同点在于,工具栏按
钮还会触发 ABAP 事件 AT USER-COMMAND,功能码会传
递给 sy-ucomm。
– 可以使用 图标显示为程序定义的所有子对象(菜
单、功能键和应用工具栏),选择一个子对象时,为
它建立一个引用,……(实在没看懂)
– 编辑保存现有状态后,它处于非激活状态,需要使用
按钮 来激活功能码,以便在程序中使
用,没有激活在运行中是看不到的。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 185
第九单元 用户会话
第五课 ABAP Web Dynpro 程序

• 本课内容
– 列出 ABAP Web Dynpro 程序的属性和使用
– 列出 ABAP Web Dynpro 程序的运行时结构

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 186
第九单元 用户会话
第五课 ABAP Web Dynpro 程序

• ABAP Web Dynpro 的属性和编程模型


– 在 SAP NetWeaver 应用服务器 7.0 中,引入了
ABAP Web Dynpro,它是一个与客户端和各自协议无
关的新编程模型。这种无关是通过使用元数据完成的。
– ABAP Web Dynpro 将成为在 ABAP 环境中开发 Web
应用的标准 UI(用户界面) 技术。
– 在它自己的运行时环境之外,ABAP Web Dynpro 通
常有一个图形化的开发环境(Web Dynpro
Explorer),它的工具与 ABAP 开发环境(对象浏览
器)完全集成。使用 SAPgui 在 SAP 系统中开发
Web Dynpro 程序,通过各自的链接、或互联网浏览
器、或 SAP 门户来调用。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 187
第九单元 用户会话
第五课 ABAP Web Dynpro 程序

• ABAP Web Dynpro 的属性和编程模型


– ABAP Web Dynpro 程序维护和进一步开发由于组件
重用和布局、程序流和业务逻辑的严格分开而变得简
单。由于支持 Accessibility Standard 508, Web
Dynpro 应用程序可以通过键盘输入和屏幕读取功能让
视力障碍的用户也可以使用。
– ABAP Web Dynpro 支持使用 Web Services。从任何
应用上都可以以标准、舒适的方法访问各种系统的业
务功能。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 188
第九单元 用户会话
第五课 ABAP Web Dynpro 程序

• 减少业务逻辑、布局和程序流的耦合
– ABAP Web Dynpro 应用程序根据“模型-视图-控制
器”编程模型(MVC programming model)进行组织。
– 业务交互层的模型为终端系统提供可靠的显示无关的
数据访问。视图在用户交互层,只关注数据显示(布
局),不管数据源。在绑定层的控制器在视图和模型
中间,它格式化要在视图中显示的模型数据,处理用
户输入返回给模型,另外还控制程序流程。
– 在 ABAP Web Dynpro 中,模型包括包装数据访问的
应用程序类。但是现存的 BAPIs,功能模块,或者
Web Services 仍旧可以用。
– 视图和控制器都可以用可视化的工具维护。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 189
第九单元 用户会话
第五课 ABAP Web Dynpro 程序
• ABAP Web Dynpro 的元素
– 视图的布局包含了一系列 UI 元素(诸如输入字段、表、
按钮等屏幕元素),分组放在图形化工具中。运行
时,视图一个接一个显示在屏幕上,不是并列的。因
此相当于传统屏幕,不带逻辑流。
– 象传统的 ABAP Dynpro 一样,输入检查和输入帮助
(F4)不需要人工指定,可以通过 UI 服务直接引用
ABAP 字典。
– 可以用容器技术把视图包含在另一个视图里,这实现
了模块化。
– 每个视图有其视图控件,从技术角度讲,视图控件就
是一个 ABAP 类。直接由开发者编写的视图控件的代
码很少,多数都是自动生成。跟传统 Dynpro 中
TABLES 结构的用法类似,视图控件的上下文就象个
数据容器,包含了要在视图中显示的内容。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 190
第九单元 用户会话
第五课 ABAP Web Dynpro 程序
• ABAP Web Dynpro 组件
– 窗口用来捆绑多个视图,并且定义它们的导航选项
(视图序列),一个组件包括一个或多个窗口,并且
包含自己的上下文控件,用来存储同时显示在几个组
件视图中的数据。
– Web Dynpro 应用程序指向一个窗口做为默认视图
(开始视图),在程序被调用的时候首先显示。
– 一个具有相应窗口的组件可以在不同应用中做为自包
含单元使用,因此应用和维护的工作就减到了最小。
– 每个视图控件的上下文包含了要显示在视图中的数
据,当相应指派执行(数据绑定)时,数据在视图上
下文和 UI 控件之间传输。
– 组件也包含上下文,这里数据保存并为组件中的不同
视图显示。这时,经常通过相应的视图上下文(上下
文映射)来实现对组件数据的显示。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 191
第十单元 可重用组件

• 单元目标
本单元完成后,应该能:
– 查询功能模块
– 获得功能模块的功能和用法信息
– 在程序中调用功能模块
– 使用 SAP 提供的面向对象的类和方法
– 使用 SAP 网格控件显示内表
– 查找合适的 BAPIs
– 在程序中调用 BAPI

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 192
第十单元 可重用组件
第一课 使用功能模块

• 本课内容
– 查找功能模块
– 获得功能模块的功能和用法信息
– 在程序中调用功能模块
– SAP 会把一些经常使用的函数放到功能模块
中,我们就不需要重复编写相应的代码了。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 193
第十单元 可重用组件
第一课 使用功能模块
• 使用功能模块
– 功能模块就是存储在
功能模块 SAP 功能库中的完成一定功能的
子程序。每个功能模块都包含一定的输入和输出接
口,使用功能模块的主要意图就是重用,也就是说,
它们属于可重用组件。
– 功能模块被组织在功能组中,所谓功能组就是完成相
功能组
似功能或处理同类数据的功能模块的集合。
– 功能模块可以包含跟程序一样的组件,包括:
• 数据对象:跟功能组全局相关,也就是说,可以被当前功能
组中的所有功能模块使用和修改
• 子程序:可以被当前功能组中的所有功能模块调用
• 屏幕:可以被当前功能组中的所有功能模块调用

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 194
第十单元 可重用组件
第一课 使用功能模块
• 使用功能模块
– 功能模块的属性包括了简短说明和所属功能组。
– 跟子程序类似,功能模块可以包含本地类型和数据对
象定义,它们只能在当前功能模块内使用。
象定义
– 功能模块的接口包括:
• 输入参数:当功能模块被调用时,它们接收值和变量,在调
用时,可选参数可以不必输入值。
• 输出参数:调用程序通过指定“接收变量”接受功能模块的输
出,输出参数多是可选的。
• 修改参数:调用程序把变量传递给参数模块并接受参数模块
对变量值的修改。
• 例外:在参数模块运行时可以触发一些指定的错误,并且提
供相应错误进程的信息,在调用程序里必须指定例外。
– 一般来说,接口参数都要指定 ABAP 字典中的类型。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 195
第十单元 可重用组件
第一课 使用功能模块

• 使用功能模块
– 程序调用功能模块时,整个功能组都被读出,然后执
行功能模块。直到程序结束,功能组一直都保留在内
存中。调用这个功能组中的另一个功能模块时就不需
要重复加载,而且功能组中的全局变量可以重用。
– 这意味着,如果功能组中的一个功能模块修改了全局
变量的值,这个功能组里其他功能模块被调用时就能
使用这个值。
– 除全局变量外,功能模块还要使用它自己定义的数据
对象例如接口参数等,它用来接收和返回调用程序的
数据。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 196
第十单元 可重用组件
第一课 使用功能模块
• 查找功能模块
– 查找功能模块的方法
• 指定应用的搜索:使用应用层次可以查找跟某个应用组件相
关的的功能模块。
• 不指定应用的搜索:通过知识库信息系统可以自由搜索与应
用无关的功能模块。
• 程序相关的搜索:当你知道一个现存程序包含所需功能模块
时,可以这样搜索。
– 当找到一个功能模块时,应该首先从功能模块的属性
中查看确定它是否是释放的,因为只有释放的功能模
块才具有支持和进一步的兼容性,SAP 也推荐使用释
放的功能模块。
– 可以使用功能模块的文档以获得进一步的信息。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 197
第十单元 可重用组件
第一课 使用功能模块
• 功能模块的接口
– 前面说过,功能模块的接口包括import、export、
changing 参数和 exception。
– 当调用时,非可选的参数必须指定值,要知道哪些参
数可选和非可选,可以查看功能模块的文档和接口定
义。
• 测试环境
– 可以使用测试环境来测试功能模块。系统会提供一个
输入模版来让我们指定输入的值,运行结束后会列出
相关的值。
– 如果运行时遇到异常,会显示出相应的提示消息。
– 还可以进入调试模式,整个环境跟前面的运行时分析
类似,可以查看各种运行时的值。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 198
第十单元 可重用组件
第一课 使用功能模块
• 调用功能模块
– 使用 ABAP 语句 CALL FUNCTION 来调用功能模
块,功能模块的名字必须大写,并且用单引号括起来。
– 在 EXPORTING 块中,传递功能模块 import 中定义
的参数;而在 IMPORTING 块中,则传递功能模块
export 中定义的参数,用来接收功能模块运行的结果。
– 上面是从调用程序的角度来看的,它向功能模块
import 定义的参数“输出”变量,而“输入”功能模块
export 定义的参数的值。
– 在调用语法中,把函数模块的接口参数(形式参数)
写在左面,而调用程序的的值或数据对象(实际参数)
写在右面。
– 为了避免拼写错误,可以用模式功能自动添加代码。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 199
第十单元 可重用组件
第一课 使用功能模块
• 处理异常
– 功能模块执行过程中很可能遇到错误(例如没有读到
所需数据),功能模块会触发异常。这将结束功能模
异常
块的执行,并把错误信息反馈给调用程序。如果在
EXPECTIONS 块中处理了异常,返回值会被指定到
调用程序的 sy-subrc 值中,只要在调用后检查该值,
就能知道执行过程中发生了什么。如果执行没有问
题,就返回 0。
– 有时候还需要指定一个功能模块内未指定的异常,用
来处理一般的其他错误情况,这时为一个预设的形式
参数 OTHERS 指定一个与前面都不一样的值即可。
– 在调用时应该捕获所有异常并在程序中处理,如果发
生了一个未捕获的异常,就会发生运行时错误。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 200
第十单元 可重用组件
第二课 使用方法

• 本课内容
– 许多 SAP 新版本的功能以类或方法的形式提
方法
交,这一课就简要介绍面向对象编程,和如何
在程序中使用 SAP 已有的类和方法。
– 最常用的 SAP 类是 SAP 清单查看器 也就是
alv 的面向对象版本,BC405 和 BC412 课程
还要详细描述,这里仅做简要说明。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 201
第十单元 可重用组件
第二课 使用方法
• 全局类和方法
– 类是形式化描述的对象(实例),在运行时,可以创
建一个类的多个实例,每个实例都有独立的属性和方
法,可以用实例的方法访问其属性。
– 以机票预约作为简单例子,这个类的每个实例都对应
了一个系统的记录,包括其记录的属性如:提交号、
提交时间、撤销号等等。一个提交实例的方法可以是
撤销提交。调用这个方法则将修改提交实例的“撤销标
记”。
– 类可以在程序本地定义,也可以定义在全局的类库中。
– SAP 已经开发了很多全局类和方法,用于完成某系功
能。这些类也属于可重用组件的一部分。
可重用组件
– 本课程只是对类的一个简要介绍,BC401 课程
《ABAP 对象》则详细说明了类的方方面面。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 202
第十单元 可重用组件
第二课 使用方法
• 创建对象和调用方法
– 实例没有名字,必须定义引用变量以生成和定位类的
实例,它们是定位相应实例的指针,引用变量都有名
字,可以定位相应实例。
DATA reference_name TYPE REF TO class_name.
– 上面的语句定义了一个引用变量。程序开始时,引用
变量只是个初始值(没有指向任何实例),当它用来
创建实例时,它才指向那个实例。
CREATE OBJECT reference_name.
– 上面语句创建一个类的实例,这时引用变量就指向新
建的类的实例了。
– 使用 CREATE OBJECT 时可能需要用一个特殊的方
法 CONSTRUCTOR 来传入一些数据,生成实例的初
始值。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 203
第十单元 可重用组件
第二课 使用方法
• 创建对象和调用方法
– 用下面的语句调用实例的方法
CALL METHOD reference_name->method_name.
– 由于一个类可能有多个实例,调用方法时不能只写一
个方法名,必须包含实例名。
– SAP 从 4.6 版以后就提供了 EnjoySAP 控件来更有效
地和有趣地设计屏幕,包含下面这些:
• Grid Control:网格控件,在屏幕上显示内表,并包含了排序、
过滤和合计等功能。
• Picture Control:图片控件,在屏幕上显示图片。
• HTML View Control:显示HTML控件,在屏幕上显示网页。
• Tree Control:树控件,用来显示层级结构的清单。
– BC412 课程将详细介绍各种 EnjoySAP 控件。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 204
第十单元 可重用组件
第二课 使用方法

• 使用 Grid 控件
– 用户可以在屏幕上调整列宽,或者根据内容自动调
整,通过拖放可以调整列的顺序。
– 这个控件的标准按钮可以用来执行下列功能
• 细节按钮可以用模式对话框显示当前行的内容。
• 可以用列实现复杂的排序标准。
• 可以在选中区域内查找字符。
• 可以对一个或多个数值列进行合计,或通过选择非数值列进
行小计。
• 或者通过相应按钮打印或下载成本地文件。
• 用户可以保存当前的控件布局为以后使用。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 205
第十单元 可重用组件
第二课 使用方法

• 使用 Grid 控件
– EnjoySAP 控件必须嵌入一个 SAP 容器控件(或简称
容器),容器必须集成在屏幕预设的控件区内。
– 从 GUI 角度,为了应用网格控件和容器,程序中必须
创建相应的实例作为替代品。可以在 GUI 里用这个实
例来定位元素,为此,SAP 提供了基本类来生成容器
和网格控件实例。
– 创建实例时,隐含调用了类的构造函数(类的特殊方
法 CONSTRUCTOR),它的作用是用输入参数填写
创建实例的相应字段,因此,在使用 CREATE
OBJECT 创建实例时必须提供构造器所要求的必要数
据。
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 206
第十单元 可重用组件
第二课 使用方法

• 使用 Grid 控件
– 可以用类制作器得到全局类或方法的信息。
– 在对象浏览器的导航区列出类的对象清单,双击希望
显示到类制作器里的类名(也可以在 ABAP 程序中双
击类名转到类制作器),选择需要的方法按参数按
钮,显示该方法的接口参数。
– 全局类 CL_GUI_CUSTOM_CONTAINER 的
CONSTRUCTOR 方法中有一个必要参数
CONTAINER_NAME,因此,当容器实例被创建时,
这个参数必须提供数据,用来指定屏幕上相应名称的
控件区域。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 207
第十单元 可重用组件
第二课 使用方法
• 使用 Grid 控件
– 全局类 CL_GUI_ALV_GRID 包含一系列可被调用的
能完成相应网格控件功能的方法,为了用 ALV网格控
件显示内表的内容,需要知道下列三个方法的细节。
• CONSTRUCTOR:网格类也有构造函数,唯一的必要参数是
i_parent ,做为一个指针的形式指向以存在的容器实例。
• SET_TABLE_FOR_FIRST_DISPLAY:已创建的网格实例用
这个方法来传输数据和设置,需要显示的内表要指定给参数
IT_OUTTAB,并且内表还必须是个标准表。此外网格列还需
要一些技术信息,最简单的方法是用字典结构或透明表来声
明内表的结构,只需要把字典对象的名字传给参数
I_STRUCTURE_NAME(或者把可以设置字段编目并传给参
数 IT_FIELDCATALOG )。
• REFRESH_TABLE_DISPLAY:当内表内容发生改变时调用
此方法,会重新读内表的值并显示。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 208
第十单元 可重用组件
第二课 使用方法

• 使用 Grid 控件的例子
– 1、在屏幕布局编辑器中,在屏幕上定义一个控件区,
从工具栏上选择客户控件按钮,把控件通过拖拉的方
式放到屏幕编辑区上,给它命名CONTAINER_1。使
用横向调整大小和纵向调整大小属性来设置容器在窗
口改变大小时是否跟着变,还可以用最小行和最小列
来设置区域最小包含的行和列数。
– 2、ABAP 程序需要两个引用参数:
• 一个是指向将要创建的容器实例的变量 container_r
• 一个是指向将要创建的网格实例的变量 grid_r

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 209
第十单元 可重用组件
第二课 使用方法
• 使用 Grid 控件的例子
– 3、用 CREATE OBJECT 语句创建实例,建议生成源
代码以避免类型错误和冗余。一般在此时需要插入参
数的值,这种调用语法跟功能模块很相似。创建实例
必须在屏幕显示之前,也就是 PBO 模块中执行。一个
屏幕上的控件只需要实例化一次,可以用IF
container_r IS INITIAL.来检查它是否实例化过。
– 4、要把内表的内容传输到网格控件中,需要调用网格
控件的方法SET_TABLE_FOR_FIRST_DISPLAY,同
样可以使用拖拽的方法自动生成代码。只需要用实际
的变量和对象替换自动生成的xxxxxxx。 如果程序运
行修改了内表,可以用REFRESH_TABLE_DISPLAY
方法在重新显示屏幕前更新网格的内容。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 210
第十单元 可重用组件
第三课 使用BAPIs

• 本课内容
– SAP 为了使开发者能够根据自己需要向系统加
入新的数据,而这些数据又不违反基本的数据
相关性原则,设计了 BAPI 用基本的业务数据
生成相应的数据记录,而无需直接写表。
– 本课讲如何查询所需 BAPI 和如何调用

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 211
第十单元 可重用组件
第三课 使用BAPIs
• 业务对象和 BAPIs
– SAP 系统的业务对象知识库包含了业务对象。通常一
业务对象知识库
个业务对象是对应一个或多个表的类,业务对象把
BAPI(Business Application Programming Interface)
作为方法,可以使用 BAPI 访问相应的表,也就是
说,BAPI 是 SAP 系统访问数据的一种方法。
– BAPI 通常作为业务对象的基本方法存在,如:
• 创建对象
• 获取对象的属性
• 修改对象的属性
• 列出对象
– BAPI 不但能用 ABAP 调用,也可以用其他外部的编
程语言调用。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 212
第十单元 可重用组件
第三课 使用BAPIs
• 标准 BAPIs
– 对于不同的业务对象,通常会用相同的名字表示相同
的方法,例如
• GetList:返回符合选择条件的业务对象的列表
• GetDetail:返回指定主键的业务对象的详情
• Create、Change、Delete、Cancel:创建、修改、删除、撤
销对象。
• AddItem、RemoveItem:增加或删除子对象。
– 可以用 BAPI 浏览器按应用列出相应的 BAPI,事务码
是 BAPI。
– 找到所需的 BAPI 后,可以在右面看它的作用,还可
以通过 Function Builder 查看它的功能模块代码。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 213
第十单元 可重用组件
第三课 使用BAPIs
• BAPI 功能模块及使用方法
– BAPI 的功能模块必须符合以下技术特点:
• 名字是 BAPI_<business_object_name>_<method_name>
• 允许远程调用
• 无用户对话框和消息
• 接口参数的类型必须是 ABAP 字典中为 BAPI 创建的组件和
结构,(名字是 BAPI_)
• 在 4.6 版以前不允许有 changing 参数
• 错误必须用特别的输出参数 RETURN 来报告
– 程序中的调用方法则与一般的参数模块完全一样。
– 由于 BAPI 可以被非 SAP 系统调用,因此必须注意相
应的转换规则。可以使用包 SBF_BAPI 中的 BACV 功
能组中的功能模块来进行转换。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 214
第十一单元 调整 SAP 标准程序

• 单元目标
本单元完成后,应该能:
– 解释术语:original, copy, correction, repair,
customizing, modification,和 enhancement
– 说明为了使 SAP 标准程序适合企业可以有哪
些选择
– 说出直接修改的不利和 SAP 增强的好处
– 说出和解释不同的增强类型

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 215
第十一单元 调整 SAP 标准程序
第一课 调整 SAP 标准程序(概览)

• 本课内容
– 解释术语:original, copy, correction, repair,
customizing, modification,和 enhancement
– 说明为了使 SAP 标准程序适合企业可以有哪
些选择
– 说出直接修改的不利和 SAP 增强的好处
– 说出和解释不同的增强类型
– 很多时候要对 SAP 标准做一些更改,但要注
意尽量避免直接修改代码,而尽量使用增强。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 216
第十一单元 调整 SAP 标准程序
第一课 调整 SAP 标准程序(概览)
• SAP 标准调整的基本术语和选项
– 在被开发的系统中,知识库对象被称为original(原始
的)。在另一个对象被传输进来的系统,它们只存在
copy(副本)。知识库对象的原始系统(出生地)被
记录在对象的属性中。
– 通常,只会对原始对象修改。然后,这些修改会被传
输到后续系统修改相应的拷贝,这保证了知识库对象
在所有系统上都一致。修改拷贝也是允许的,但是为
了保证一致性,避免修改了拷贝却没有修改原始系统
造成两个系统不同,将来再修改原始系统又覆盖拷贝
的修改等等不一致问题,强烈建议不要修改拷贝。
– 原始系统无论怎么传输都不会被覆盖。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 217
第十一单元 调整 SAP 标准程序
第一课 调整 SAP 标准程序(概览)

• SAP 标准调整的基本术语和选项
– 修改一个原始系统称为correction(修正),修正在开
发/修正类型的请求中进行。
– 对应的,修改一个拷贝称为repair(修补),修补在修
补类型的请求中进行。
– 在客户对象被修补后(例如,生产系统的一个紧急修
改),需要对原始系统做相同的修补以保证系统一致。
– 在客户系统对 SAP 对象的修补也称为modification
(修改)。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 218
第十一单元 调整 SAP 标准程序
第一课 调整 SAP 标准程序(概览)

• SAP 标准调整的基本术语和选项
– 升级中的修改
• 在升级时,系统中的 SAP 对象会被 SAP 公司提供的新版本
覆盖。需要做修改调整使自己的修改重新回到系统中。这需
要首先比较两个版本,并且把旧版本中修改过的内容写到新
版本里。
• 这种比较可能很费时,因此可以用 SAP增强来代替修改。增
强也提供了对 SAP 功能的调整,并且与 SAP 版本无关,因
此是“低维护的”。本课的后面会对现有的增强类型做个简介。
• SAP 推荐只在开发系统中做修改调整,然后按顺序传输到其
他系统,这同样是为了保证一致性。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 219
第十一单元 调整 SAP 标准程序
第一课 调整 SAP 标准程序(概览)
• SAP 标准调整的基本术语和选项
– SAP软件调整的选择
• 客户开发:可以在规定的客户命名空间中开发自己的知识库
对象,在 SAP 标准无法提供跟用户需求类似的功能时可以使
用此方法。
• 定制:可以使用适当的维护事务码来设置系统属性和功能。
SAP 计划和组织了这类调整,定制是建立 SAP 系统的必要步
骤。
• 增强:SAP知识库对象可以用增强来调整而无需修改,增强
与版本无关并且无需任何调整,不过并非所有客户需求都能
用增强来解决。
• 修改:只有当系统没有适当的增强选项或者调整将带来巨大
工作量时才选择修改。为了提供有组织的修改和便利的调整
步骤,SAP 4.6b以后提供了修改助手的功能。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 220
第十一单元 调整 SAP 标准程序
第一课 调整 SAP 标准程序(概览)
• 增强的类型
– SAP 在一些程序中实现了程序出口,用户可以在用户
程序出口
出口中添加一些代码,运行时也会运行这些代码。这
样就可以不修改 SAP 程序而增加一些功能。程序出口
是非常重要的一类增强。
– SAP 用了一些技术实现程序出口:用户出口、客户出
口、业务事务事件(BTEs)和业务附加(BAdIs)。
每种增强技术都有一种特殊的查询功能,可以用它们
来查找 SAP 提供的程序出口。BC425课程会进一步介
绍。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 221
第十一单元 调整 SAP 标准程序
第一课 调整 SAP 标准程序(概览)
• 其他增强类型
– 除了程序出口外,还有其他的出口技术:
• 菜单出口:部分菜单带有 SAP 预备的条目,可以连接和执行
用户自己开发的功能(源代码)。
• 屏幕出口:部分屏幕带有 SAP 的子屏幕区,可以集成用户自
定义的屏幕。
• 字段出口:使用字段出口可以在 SAP 屏幕字段上执行用户自
定义的输入检查,这无需 SAP 提供。
– 可以在 ABAP 字典中覆盖字段文档和标签
• 覆盖字段文档:可以修改按 F1 时弹出的帮助文档。
• 覆盖字段标签:可以把 SAP 数据元素的字段标签替换成用户
自己的文字。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 222
第十一单元 调整 SAP 标准程序
第一课 调整 SAP 标准程序(概览)
• 其他增强类型
– 除了前面提到的增强,还有一些方法:
• 附加结构:可以为大多数透明表附加结构以添加所需的附加
字段。这样就不修改原始表定义而为应用添加了数据列。
• SAP 注释的源文本区:部分 SAP 源程序包含了注释的代码
段,如果 SAP 推荐,可以把这些注释去掉而实现附加的功能。
从技术上说,这属于一种修改。
– 当开发者创建或修改知识库对象时,系统会要求提供
一个开发号,可以到 SAP 网站申请 SSCR 开发注
册,开发号与用户登录名和安装号相关。
– 对于要修改的 SAP 知识库对象,也会需要输入一个对
象号,同样到 SSCR 申请这个号码,需要提供对象名、
对象类型、安装号和系统版本。

SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 223
后记
• 刚才看了一下这个文件的创建日期,是2007年4月29日,距今天正好
30 天,也算是冥冥中有天注定吧,经过一个月的努力,我总算完成
了这个 BC400 标准教程学习笔记。
• SAP 的标准教程都是英文的,而且是德式英文,跟以前习惯的美式
英文还是有不少差别,看起来确实费劲。很久没有这么认真的完成一
项工作了,突然完成,觉得心情很好。
• 谦虚一下是必须的,SAP 博大精深,我能了解到的仅仅是很少的一
部分,经过一年的经验积累,能对标准教程有一点认识并用自己的理
解写出来,我觉得对自己是个很大的挑战,当然肯定会存在错误之
处,希望读者朋友不吝赐教,多多发邮件交流,我还会不断的修改文
档,以臻完善。
• 如果这篇笔记能对您了解 SAP 开发有一点帮助,我会感到十分欣慰。
• 您可以在网络上转发这篇学习笔记,可以把它用在任何非盈利的培训
中,可以摘录其中内容用在您的免费文章中。但是为了表示对我劳动
的尊重,请不要以任何形式赢取利益(包括积分下载等可能引起别人
支付现金换取积分的情形),请保留我的署名。

强晟 2007年5月29日
SAP 学习笔记系列 (by 强晟 qiangsheng@gmail.com) BC400: ABAP Workbench Foundations and Concepts 224

You might also like