SAP ABAP - 快速指南


SAP ABAP - 概述

ABAP 代表高级业务应用程序编程,是一种 4GL(第四代)语言。目前,它与 Java 一起被定位为 SAP 应用服务器编程的主要语言。

我们先从SAP系统的高层架构开始。典型 SAP 系统的 3 层客户端/服务器架构如下所示。

三层客户端/服务器架构

表示由可用于控制 SAP 系统的任何输入设备组成。这可以是网络浏览器、移动设备等。所有的中央处理都发生在应用程序服务器中。应用程序服务器本身不仅仅是一个系统,而且可以是处理系统的多个实例。服务器与数据库层通信,数据库层通常保存在单独的服务器上,主要是出于性能原因和安全性考虑。通信发生在系统的每一层之间,从表示层到数据库,然后备份链。

- ABAP 程序在应用程序服务器级别运行。软件的技术分发与其物理位置无关。这意味着基本上所有三个级别都可以安装在一台计算机上,或者每个级别都可以安装在不同的计算机或服务器上。

ABAP 程序驻留在 SAP 数据库内。它们在运行时系统的控制下执行,该运行时系统是 SAP 内核的一部分。运行时系统处理所有ABAP语句,控制流程逻辑并响应用户事件。

因此,与 C++ 和 Java 不同,ABAP 程序不存储在单独的外部文件中。在数据库内部,ABAP 代码以两种形式存在 -

  • 可以使用ABAP工作台工具查看和编辑的源代码。

  • 生成的代码,它是二进制表示形式。如果您熟悉 Java,则此生成的代码在某种程度上可与 Java 字节代码相比较。

运行时系统可以被认为是一个虚拟机,类似于Java虚拟机。ABAP 运行时系统的一个关键组件是数据库接口,它将独立于数据库的语句 (Open SQL) 转换为底层数据库可以理解的语句 (Native SQL)。SAP 可以与多种数据库配合使用,并且同一个 ABAP 程序可以在所有这些数据库上运行。

SAP ABAP - 环境

报告是熟悉一般 ABAP 原则和工具的良好起点。ABAP 报告用于许多领域。在本章中,我们将看到编写简单的 ABAP 报告是多么容易。

你好ABAP

让我们从常见的“Hello World”示例开始。

每个 ABAP 语句都以 ABAP 关键字开头,以句点结尾。关键字必须至少用一个空格分隔。对于 ABAP 语句使用一行或多行并不重要。

您需要使用 ABAP 编辑器输入代码,该编辑器是随 SAP NetWeaver 应用程序服务器 ABAP(也称为“AS ABAP”)提供的 ABAP 工具的一部分。

‘AS ABAP’是一个应用服务器,拥有自己的数据库、ABAP运行时环境以及ABAP编辑器等ABAP开发工具。AS ABAP提供了一个独立于硬件、操作系统和数据库的开发平台。

使用ABAP编辑器

步骤 1 - 启动事务 SE38 以导航到 ABAP 编辑器(在下一章中讨论)。让我们开始创建一个报表,它是众多 ABAP 对象之一。

步骤 2 - 在编辑器的初始屏幕上,在输入字段“程序”中指定报告的名称。您可以将名称指定为 ZHELLO1。前面的 Z 对于名称很重要。Z 确保您的报告驻留在客户命名空间中。

客户命名空间包括带有前缀 Y 或 Z 的所有对象。当客户或合作伙伴创建对象(如报表)时始终使用它,以区分这些对象与 SAP 的对象并防止与对象发生名称冲突。

步骤 3 - 您可以以小写字母键入报告名称,但编辑器会将其更改为大写字母。因此 ABAP 对象的名称“不”区分大小写。

步骤 4 - 指定报告名称后,单击“创建”按钮。将弹出一个弹出窗口 ABAP:程序属性,您将提供有关报告的更多信息。

步骤 5 - 选择“可执行程序”作为报告类型,输入标题“我的第一个 ABAP 报告”,然后选择“保存”继续。接下来将弹出“创建对象目录条目”窗口。选择“本地对象”按钮,弹出窗口将关闭。

您可以通过在 REPORT 语句下方输入 WRITE 语句来完成第一份报告,以便完整的报告仅包含两行,如下所示 -

REPORT ZHELLO1. 
WRITE 'Hello World'.

开始报告

我们可以使用键盘(Ctrl + S)或保存图标(命令字段右侧)来保存报告。ABAP 开发在 AS ABAP 中进行。

启动报告就像保存报告一样简单。单击“激活”按钮(启动图标旁边的左侧)并使用“直接处理”图标或 F8 功能键启动报告。标题“My First ABAP Report”以及输出“Hello World”也会显示。这是输出 -

My First ABAP Report 
Hello World 

只要您不激活新报告或激活对现有报告的更改,就与其用户无关。这在中央开发环境中非常重要,您可以在其中处理其他开发人员在其项目中使用的对象。

查看现有代码

如果您查看“程序”字段并双击值 ZHELLO1,ABAP 编辑器将显示您的报告的代码。这称为前向导航。双击对象的名称会在适当的工具中打开该对象。

SAP ABAP - 屏幕导航

为了理解 SAP ABAP,您需要具备登录、ABAP 编辑器、注销等屏幕的基本知识。本章重点介绍屏幕导航和标准工具栏功能。

登录屏幕

登录 SAP 服务器后,SAP 登录屏幕将提示输入用户 ID 和密码。您需要提供有效的用户 ID 和密码,然后按 Enter(用户 ID 和密码由系统管理员提供)。以下是登录屏幕。

SAP 登录屏幕

工具栏图标

以下是 SAP 屏幕工具栏。

SAP 屏幕工具栏

菜单栏- 菜单栏是对话框窗口的顶行。

标准工具栏- 此工具栏中提供大多数标准功能,例如页面顶部、页面结尾、向上翻页、向下翻页和保存。

标题栏- 标题栏显示您当前所在的应用程序/业务流程的名称。

应用程序工具栏- 此处提供应用程序特定的菜单选项。

命令字段- 我们可以启动应用程序,而无需浏览菜单事务,并且一些逻辑代码被分配给业务流程。在命令字段中输入事务代码即可直接启动应用程序。

ABAP编辑器

您只需启动事务 SE38(在命令字段中输入 SE38)即可导航到 ABAP 编辑器。

ABAP编辑器

标准按键和图标

退出键用于退出程序/模块或注销。它们还用于返回到上次访问的屏幕。

如图所示,以下是 SAP 中使用的标准退出键。

标准按键图标

以下是检查、激活和处理报告的选项。

激活和处理报告

注销

完成工作后退出 ABAP 编辑器或/和从 SAP 系统注销始终是一个好习惯。

ABAP 编辑器注销

SAP ABAP - 基本语法

声明

ABAP源程序由注释和ABAP语句组成。ABAP 中的每个语句都以关键字开头并以句点结尾,并且 ABAP 不区分大小写。

程序中的第一个非注释行以 REPORT 一词开头。该报告将始终是所创建的任何可执行程序的第一行。该语句后面是先前创建的程序名称。然后该线路以句号结束。

语法是 -

REPORT [Program_Name]. 
 
[Statements…]. 

这使得语句可以根据需要在编辑器中占用尽可能多的行。例如,报告可能如下所示 -

REPORT Z_Test123_01. 

语句由命令以及任何变量和选项组成,以句点结尾。只要语句末尾出现句点,就不会出现问题。这段时期标志着声明的结束。

我们来写代码吧。

在 REPORT 语句下面的行中,只需键入以下语句:Write 'ABAP Tutorial'。

REPORT Z_Test123_01.

Write 'This is ABAP Tutorial'. 

撰写声明时要考虑的四件事-

  • write 语句将引号中的内容写入输出窗口。

  • ABAP 编辑器将除用单引号括起来的文本字符串之外的所有文本转换为大写。

  • 与一些较旧的编程语言不同,ABAP 不关心语句在一行中的何处开始。您可以利用这一点,通过使用缩进来指示代码块来提高程序的可读性。

  • ABAP 对语句的布局没有限制。也就是说,多个语句可以放在一行上,或者单个语句可以跨多行。

冒号表示法

如果每个语句的开头相同,则连续语句可以链接在一起。这是通过冒号 (:) 运算符和逗号来完成的,它们用于终止各个语句,就像句点结束普通语句一样。

以下是一个可以节省一些按键操作的程序示例 -

WRITE 'Hello'. 
WRITE 'ABAP'. 
WRITE 'World'. 

使用冒号符号,可以这样重写 -

WRITE: 'Hello', 
       'ABAP', 
       'World'.

与任何其他 ABAP 语句一样,布局并不重要。这是一个同样正确的陈述 -

WRITE: 'Hello', 'ABAP', 'World'.

评论

内联注释可以通过以下两种方法之一在程序中的任何位置声明 -

  • 全行注释通过在行的第一个位置放置星号 (*) 来表示,在这种情况下,系统将整行视为注释。注释不需要以句点终止,因为它们可能不会超过一行 -

* This is the comment line
  • 部分行注释通过在语句后输入双引号 (") 来表示。系统将双引号后面的所有文本视为注释。您不需要以句点终止部分行注释,因为它们可能不会延伸到更多行。比一行 -

WRITE 'Hello'. "Here is the partial comment

注意- ABAP 编辑器不会将注释代码大写。

抑制空白

NO-ZERO 命令跟在 DATA 语句之后。它抑制包含空格的数字字段的所有前导零。输出通常更容易让用户阅读。

例子

REPORT Z_Test123_01. 

DATA: W_NUR(10) TYPE N.
      MOVE 50 TO W_NUR.
      WRITE W_NUR NO-ZERO.

上面的代码产生以下输出 -

50

注意- 如果没有 NO-ZERO 命令,输出为:0000000050

空行

SKIP 命令有助于在页面上插入空行。

例子

消息命令如下 -

WRITE 'This is the 1st line'. 
SKIP. 
WRITE 'This is the 2nd line'. 

上面的消息命令产生以下输出 -

This is the 1st line 
This is the 2nd line

我们可以使用SKIP命令来插入多个空行。

SKIP number_of_lines. 

输出将是由行数定义的几个空行。SKIP 命令还可以将光标定位在页面上所需的行上。

SKIP TO LINE line_number. 

该命令用于动态地在页面中上下移动光标。通常,在此命令之后会出现 WRITE 语句,以将输出放在所需的行上。

插入行

ULINE 命令自动在输出中插入一条水平线。还可以控制线的位置和长度。语法非常简单 -

ULINE.

例子

消息命令如下 -

WRITE 'This is Underlined'.
ULINE.

上面的代码产生以下输出 -

This is Underlined (and a horizontal line below this).

留言

MESSAGE 命令显示由程序开头的 REPORT 语句中指定的消息 ID 定义的消息。消息 ID 是 2 个字符的代码,定义使用 MESSAGE 命令时程序将访问哪一组 1,000 条消息。

这些消息的编号范围为 000 到 999。每个数字都关联一个最多 80 个字符的消息文本。当调用消息号码时,会显示相应的文本。

以下是与消息命令一起使用的字符 -

信息 类型 结果
错误 出现该消息并且应用程序在当前位置停止。如果程序在后台模式下运行,作业将被取消,并且消息将记录在作业日志中。
警告 将出现该消息,用户必须按 Enter 键才能继续应用程序。在后台模式下,消息记录在作业日志中。
信息 将打开一个包含消息文本的弹出窗口,用户必须按 Enter 才能继续。在后台模式下,消息记录在作业日志中。
A 异常结束 该消息类取消用户当前正在使用的事务。
S 成功 这会在屏幕底部提供一条信息消息。显示的信息本质上是积极的,仅供用户反馈。该消息不会以任何方式妨碍程序。
X 中止 此消息中止程序并生成 ABAP 短转储。

错误消息通常用于阻止用户做他们不应该做的事情。警告消息通常用于提醒用户其Behave的后果。信息消息为用户提供有用的信息。

例子

当我们为 ID AB 创建消息时,MESSAGE 命令 - MESSAGE E011 给出以下输出 -

EAB011 This report does not support sub-number summarization.

SAP ABAP - 数据类型

在ABAP编程中,我们需要使用各种变量来存储各种信息。变量只不过是用于存储值的保留内存位置。这意味着当您创建变量时,您会在内存中保留一些空间。您可能喜欢存储各种数据类型的信息,例如字符、整数、浮点等。操作系统根据变量的数据类型分配内存并决定可以在保留内存中存储什么。

基本数据类型

ABAP 为程序员提供了丰富的固定长度和可变长度数据类型。下表列出了 ABAP 基本数据类型 -

类型 关键词
字节字段 X
文本域 C
整数
浮点 F
装箱数量
文本字符串 细绳

一些字段和数字可以使用一个或多个名称进行修改,如下所示 -

  • 字节
  • 数字
  • 性格似的

下表显示了数据类型、在内存中存储值需要多少内存,以及此类变量可以存储的最小值和最大值。

类型 典型长度 典型范围
X 1字节 任何字节值(00 到 FF)
C 1 个字符 1 至 65535
N(数字文本字段) 1 个字符 1 至 65535
D(类似字符的日期) 8 个字符 8 个字符
T(类似字符的时间) 6 个字符 6 个字符
4字节 -2147483648 至 2147483647
F 8字节 2.2250738585072014E-308 至 1.7976931348623157E+308 正或负
8字节 [-10^(2len -1) +1] 到 [+10^(2len -1) 1](其中 len = 固定长度)
细绳 多变的 任何字母数字字符
XSTRING(字节字符串) 多变的 任何字节值(00 到 FF)

例子

REPORT YR_SEP_12. 
DATA text_line TYPE C LENGTH 40. 
text_line = 'A Chapter on Data Types'. 
Write text_line. 

DATA text_string TYPE STRING. 
text_string = 'A Program in ABAP'. 
Write / text_string. 

DATA d_date TYPE D. 
d_date = SY-DATUM. 
Write / d_date.

在此示例中,我们有一个预定义长度为 40 的 C 类型字符串。STRING 是一种可用于任何可变长度字符串(文本字符串)的数据类型。STRING 类型数据对象通常应用于固定长度不重要的类似字符的内容。

上面的代码产生以下输出 -

A Chapter on Data Types 
A Program in ABAP 
12092015 

DATE类型用于存储日期信息,可以存储如上所示的八位数字。

复杂类型和引用类型

复杂类型分为结构类型表类型。在结构类型中,基本类型和结构(即嵌入结构中的结构)被分组在一起。您可以仅考虑基本类型的分组。但您必须意识到结构嵌套的可用性。

当基本类型被分组在一起时,数据项可以作为分组数据项来访问,或者可以访问单独的基本类型数据项(结构字段)。在其他编程语言中,表类型更被称为数组。数组可以是简单数组或结构数组。在 ABAP 中,数组称为内表,与其他编程语言相比,可以通过多种方式声明和操作数组。下表显示了表征内部表的参数。

编号 参数及说明
1

线型或行型

内表的行可以是基本类型、复杂类型或引用类型。

2

钥匙

指定一个字段或一组字段作为内表的键,用于标识表行。键包含基本类型的字段。

3

接入方式

描述 ABAP 程序如何访问各个表条目。

引用类型用于引用类、接口和运行时数据项的实例。ABAP OOP 运行时类型服务 (RTTS) 支持在运行时声明数据项。

SAP ABAP - 变量

变量是命名的数据对象,用于在程序分配的内存区域中存储值。顾名思义,用户可以借助ABAP语句来更改变量的内容。ABAP中的每个变量都有一个特定的类型,它决定了变量内存的大小和布局;该内存中可以存储的值的范围;以及可以应用于变量的操作集。

您必须先声明所有变量,然后才能使用它们。变量声明的基本形式是 -

DATA <f> TYPE <type> VALUE <val>. 

这里<f>指定变量的名称。变量名称的长度最多为 30 个字符。<type> 指定变量的类型。任何具有完全指定的技术属性的数据类型都称为<type>。<val> 指定<f> 变量的初始值。如果定义基本固定长度变量,DATA 语句会自动使用特定于类型的初始值填充变量的值。<val> 的其他可能值可以是文字、常量或显式子句,例如 Is INITIAL。

以下是变量声明的有效示例。

DATA d1(2) TYPE C.  
DATA d2 LIKE d1.  
DATA minimum_value TYPE I VALUE 10. 

在上面的代码片段中,d1是C类型的变量,d2是d1类型的变量,minimum_value是ABAP整数类型I的变量。

本章将解释 ABAP 中可用的各种变量类型。ABAP 中有三种变量 -

  • 静态变量
  • 参考变量
  • 系统变量

静态变量

  • 静态变量在子例程、功能模块和静态方法中声明。

  • 生命周期与声明的上下文相关联。

  • 使用“CLASS-DATA”语句,您可以在类中声明变量。

  • “PARAMETERS”语句可用于声明链接到选择屏幕上的输入字段的基本数据对象。

  • 您还可以使用“SELECT-OPTIONS”语句声明链接到选择屏幕上的输入字段的内部表。

以下是命名变量时使用的约定 -

  • 不能使用“t”和“,”等特殊字符来命名变量。

  • 预定义数据对象的名称无法更改。

  • 变量的名称不能与任何 ABAP 关键字或子句相同。

  • 变量的名称必须传达变量的含义,无需进一步注释。

  • 连字符被保留来表示结构的组成部分。因此,您应该避免变量名称中使用连字符。

  • 下划线字符可用于分隔复合词。

该程序展示了如何使用 PARAMETERS 语句声明变量 -

REPORT ZTest123_01. 
PARAMETERS: NAME(10) TYPE C, 
CLASS TYPE I, 
SCORE TYPE P DECIMALS 2, 
CONNECT TYPE MARA-MATNR. 

这里,NAME代表10个字符的参数,CLASS指定整数类型参数,默认大小以字节为单位,SCORE代表压缩类型参数,值最多两位小数,CONNECT指ABAP字典的MARA-MATNF类型。

上面的代码产生以下输出 -

ABAP词典

参考变量

声明引用变量的语法是 -

DATA <ref> TYPE REF TO <type> VALUE IS INITIAL. 
  • REF TO 加法声明了一个引用变量 ref。

  • REF TO 之后的规范指定了引用变量的静态类型。

  • 静态类型限制 <ref> 可以引用的对象集。

  • 引用变量的动态类型是它当前引用的数据类型或类。

  • 静态类型总是更通用或与动态类型相同。

  • TYPE 添加用于创建绑定引用类型并作为起始值,VALUE 添加后只能指定 IS INITIAL。

例子

CLASS C1 DEFINITION. 
PUBLIC SECTION. 
DATA Bl TYPE I VALUE 1. 
ENDCLASS. DATA: Oref TYPE REF TO C1 , 
Dref1 LIKE REF TO Oref, 
Dref2 TYPE REF TO I . 
CREATE OBJECT Oref. 
GET REFERENCE OF Oref INTO Dref1. 
CREATE DATA Dref2. 
Dref2→* = Dref1→*→Bl.
  • 在上面的代码片段中,声明了一个对象引用Oref和两个数据引用变量Dref1和Dref2。

  • 两个数据引用变量都是完全类型化的,并且可以在操作数位置使用解引用运算符 →* 来解引用。

系统变量

  • ABAP 系统变量可从所有 ABAP 程序访问。

  • 这些字段实际上是由运行时环境填充的。

  • 这些字段中的值指示系统在任何给定时间点的状态。

  • 您可以在 SAP 的 SYST 表中找到系统变量的完整列表。

  • 可以使用“SYST-”或“SY-”访问 SYST 结构的各个字段。

例子

REPORT Z_Test123_01. 

WRITE:/'SY-ABCDE', SY-ABCDE,       
      /'SY-DATUM', SY-DATUM, 
      /'SY-DBSYS', SY-DBSYS, 
      /'SY-HOST ', SY-HOST, 
      /'SY-LANGU', SY-LANGU,
      /'SY-MANDT', SY-MANDT,
      /'SY-OPSYS', SY-OPSYS,
      /'SY-SAPRL', SY-SAPRL,
      /'SY-SYSID', SY-SYSID,
      /'SY-TCODE', SY-TCODE,
      /'SY-UNAME', SY-UNAME,
      /'SY-UZEIT', SY-UZEIT.

上面的代码产生以下输出 -

SY-ABCDE ABCDEFGHIJKLMNOPQRSTUVWXYZ  
SY-DATUM 12.09.2015 
SY-DBSYS ORACLE                   
SY-HOST sapserver 
SY-LANGU EN 
SY-MANDT 800 
SY-OPSYS Windows NT 
SY-SAPRL 700 
SY-SYSID DMO 
SY-TCODE SE38 
SY-UNAME SAPUSER 
SY-UZEIT 14:25:48

SAP ABAP - 常量和文字

文字是您在程序源代码中创建的未命名数据对象。它们完全由其价值定义。您无法更改文字的值。常量是使用声明性语句静态创建的命名数据对象。常量是通过为其分配存储在程序内存区域中的值来声明的。分配给常量的值在程序执行期间不能更改。这些固定值也可以被视为文字。有两种类型的文字 - 数字和字符。

数字文字

数字文字是可以有前缀符号的数字序列。在数字文字中,没有小数点分隔符,也没有尾数和指数的表示法。

以下是数字文字的一些示例 -

183. 
-97. 
+326.

字符文字

字符文字是 ABAP 程序源代码中用单引号括起来的字母数字字符序列。用引号括起来的字符文字具有预定义的 ABAP 类型 C,并被描述为文本字段文字。用“反引号”括起来的文字具有 ABAP 类型 STRING,并被描述为字符串文字。字段长度由字符数定义。

注意- 在文本字段文字中,尾随空白将被忽略,但在字符串文字中,它们将被考虑在内。

以下是字符文字的一些示例。

文本字段文字

REPORT YR_SEP_12. 
Write 'Tutorials Point'. 
Write / 'ABAP Tutorial'.  

字符串字段文字

REPORT YR_SEP_12. 
Write `Tutorials Point `. 
Write / `ABAP Tutorial `. 

上述两种情况的输出相同 -

Tutorials Point  
ABAP Tutorial

注意- 当我们尝试更改常量的值时,可能会出现语法或运行时错误。在类或接口的声明部分中声明的常量属于该类或接口的静态属性。

常量声明

我们可以借助 CONSTANTS 语句来声明命名数据对象。

以下是语法 -

CONSTANTS <f> TYPE <type> VALUE <val>.

CONSTANTS 语句与 DATA 语句类似。

<f> 指定常量的名称。TYPE <type> 表示一个名为<f> 的常量,它继承了与现有数据类型<type> 相同的技术属性。VALUE <val> 将初始值分配给声明的常量名称 <f>。

注意- 我们应该在 CONSTANTS 语句中使用 VALUE 子句。子句“VALUE”用于在声明期间为常量分配初始值。

我们有 3 种类型的常量,例如初等常量、复数常量和参考常量。以下语句显示如何使用 CONSTANTS 语句定义常量 -

REPORT YR_SEP_12. 
CONSTANTS PQR TYPE P DECIMALS 4 VALUE '1.2356'. 
Write: / 'The value of PQR is:', PQR.

输出是 -

The value of PQR is: 1.2356

这里指的是基本数据类型,称为基本常量。

以下是复杂常量的示例 -

BEGIN OF EMPLOYEE,  
Name(25) TYPE C VALUE 'Management Team',  
Organization(40) TYPE C VALUE 'Tutorials Point Ltd',  
Place(10) TYPE C VALUE 'India',  
END OF EMPLOYEE.

在上面的代码片段中,EMPLOYEE 是一个复杂的常量,由 Name、Organization 和 Place 字段组成。

以下语句声明一个常量引用 -

CONSTANTS null_pointer TYPE REF TO object VALUE IS INITIAL.

我们可以在比较中使用常量引用,也可以将其传递给过程。

SAP ABAP - 操作员

ABAP 提供了一组丰富的运算符来操作变量。所有 ABAP 运算符分为四类 -

  • 算术运算符
  • 比较运算符
  • 按位运算符
  • 字符串运算符

算术运算符

算术运算符在数学表达式中的使用方式与在代数中的使用方式相同。以下列表描述了算术运算符。假设整数变量 A 为 20,变量 B 为 40。

编号 算术运算符及说明
1

+(加法)

在运算符两侧添加值。示例:A + B 将得到 60。

2

−(减法)

从左手操作数中减去右手操作数。示例:A − B 将给出 -20。

3

*(乘法)

将运算符两侧的值相乘。示例:A * B 将得到 800。

4

/ (分配)

将左手操作数除以右手操作数。示例:B / A 将给出 2。

5

MOD(模数)

将左手操作数除以右手操作数并返回余数。示例:B MOD A 将给出 0。

例子

REPORT YS_SEP_08. 
DATA: A TYPE I VALUE 150, 
B TYPE I VALUE 50, 
Result TYPE I. 
Result =  A / B. 
WRITE / Result.

上面的代码产生以下输出 -

3

比较运算符

让我们讨论不同操作数的各种类型的比较运算符。

编号 比较运算符和描述
1

=(平等检验)。另一种形式是 EQ。

检查两个操作数的值是否相等,如果相等则条件为真。示例 (A = B) 不正确。

2

<>(不等式检验)。另一种形式是 NE。

检查两个操作数的值是否相等。如果值不相等,则条件成立。示例 (A <> B) 为真。

3

>(大于测试)。另一种形式是 GT。

检查左操作数的值是否大于右操作数的值。如果是,则条件成立。示例 (A > B) 不正确。

4

<(小于测试)。另一种形式是 LT。

检查左操作数的值是否小于右操作数的值。如果是,则条件成立。示例 (A < B) 为真。

5

>=(大于或等于)替代形式是 GE。

检查左操作数的值是否大于或等于右操作数的值。如果是,则条件成立。示例 (A >= B) 不正确。

6

<=(小于或等于测试)。另一种形式是 LE。

检查左操作数的值是否小于或等于右操作数的值。如果是,则条件成立。示例 (A <= B) 为真。

7

a1 a2 和 a3 之间(区间测试)

检查 a1 是否位于 a2 和 a3 之间(含)。如果是,则条件成立。示例(A BETWEEN B AND C)正确。

8

是初始的

如果变量的内容未更改并且已自动为其分配初始值,则条件为真。示例 (A IS INITIAL) 不正确

9

不是初始的

如果变量的内容已更改,则条件变为 true。示例(A 不是首字母)正确。

注意- 如果变量的数据类型或长度不匹配,则执行自动转换。在比较不同数据类型的两个值时,对其中一个或两个值执行自动类型调整。转换类型由数据类型和数据类型的优先顺序决定。

以下是优先顺序 -

  • 如果一个字段是类型 I,则另一个字段将转换为类型 I。

  • 如果一个字段的类型为 P,则另一字段将转换为 P 类型。

  • 如果一个字段是D类型,则另一个字段转换为D类型。但C和N类型不转换,直接比较。T型的情况也类似。

  • 如果一个字段的类型为 N,另一个字段的类型为 C 或 X,则这两个字段都将转换为 P 类型。

  • 如果一个字段的类型为 C,另一个字段的类型为 X,则 X 类型将转换为 C 类型。

实施例1

REPORT YS_SEP_08. 

DATA: A TYPE I VALUE 115,
      B TYPE I VALUE 119.
      IF A LT B.
      WRITE: / 'A is less than B'.
      ENDIF

上面的代码产生以下输出 -

A is less than B 

实施例2

REPORT YS_SEP_08. 

DATA: A TYPE I.
      IF A IS INITIAL.
      WRITE: / 'A is assigned'.
      ENDIF.

上面的代码产生以下输出 -

A is assigned.

按位运算符

ABAP还提供了一系列可用于构建布尔代数表达式的按位逻辑运算符。位运算符可以使用括号等组合在复杂的表达式中。

编号 位运算符及说明
1

位不

将十六进制数中的所有位翻转为相反值的一元运算符。例如,将此运算符应用于具有位级别值 10101010(例如“AA”)的十六进制数将得到 01010101。

2

位与

该二元运算符使用布尔 AND 运算符逐位比较每个字段。

3

位异或

使用布尔 XOR(异或)运算符逐位比较每个字段的二元运算符。

4

位或

使用布尔 OR 运算符逐位比较每个字段的二元运算符。

例如,下面的真值表显示了对字段 A 和字段 B 中包含的两位值应用布尔 AND、OR 或 XOR 运算符时生成的值。

场A B区 或者 异或
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

字符串运算符

以下是字符串运算符的列表 -

编号 字符串运算符及说明
1

CO(仅含有)

检查 A 是否仅由 B 中的字符组成。

2

CN(仅不包含)

检查 A 中是否包含 B 中不存在的字符。

3

CA(包含任何)

检查 A 是否至少包含 B 的一个字符。

4

不适用(不包含任何)

检查A是否不包含B的任何字符。

5

CS(包含字符串)

检查A中是否包含字符串B。

6

NS(不包含字符串)

检查A中是否不包含字符串B。

7

CP(包含模式)

它检查 A 是否包含 B 中的模式。

8

NP(不包含模式)

它检查 A 是否不包含 B 中的模式。

例子

REPORT YS_SEP_08. 
DATA: P(10) TYPE C VALUE 'APPLE',
      Q(10) TYPE C VALUE 'CHAIR'.
      IF P CA Q.
	
      WRITE: / 'P contains at least one character of Q'.
      ENDIF.

上面的代码产生以下输出 -

P contains at least one character of Q.

SAP ABAP - 循环控制

可能存在这样的情况:您需要多次执行一段代码。一般来说,语句是按顺序执行的:首先执行函数中的第一个语句,然后执行第二个语句,依此类推。

编程语言提供了各种控制结构,允许更复杂的执行路径。循环语句允许我们多次执行一条语句或一组语句,以下是大多数编程语言中循环语句的一般形式。

循环语句

ABAP 编程语言提供以下类型的循环来处理循环需求。

编号 循环类型和描述
1 WHILE循环

当给定条件为真时,重复一个语句或一组语句。它在执行循环体之前测试条件。

2 做循环

DO 语句对于重复特定任务特定次数非常有用。

3 嵌套循环

您可以在任何另一 WHILE 或 DO 循环中使用一个或多个循环。

循环控制语句

循环控制语句改变其正常顺序的执行。ABAP 包含允许提前结束循环的控制语句。它支持以下控制语句。

编号 控制语句和描述
1 继续

使循环跳过其主体的其余部分并开始下一个循环。

2 查看

如果条件为假,则忽略 CHECK 之后的剩余语句,系统开始下一个循环。

3 出口

完全终止循环并将执行转移到紧随循环后面的语句。

SAP ABAP - 决策

决策结构具有由程序评估或测试的一个或多个条件,以及如果确定条件为真则要执行的一个或多个语句,以及可选地,如果条件确定则要执行的其他语句确定为假。

以下是大多数编程语言中典型决策结构的一般形式 -

决策

ABAP编程语言提供以下类型的决策语句。

编号 声明及说明
1 IF 语句

IF 语句由一个逻辑表达式后跟一个或多个语句组成。

2 IF..Else 语句

IF 语句后面可以跟一个可选的 ELSE 语句,当表达式为 false 时执行该语句。

3 嵌套 IF 语句

您可以在另一个 IF 或 ELSEIF 语句中使用一个 IF 或 ELSEIF 语句。

4 CASE控制语句

当我们需要比较两个或多个字段或变量时,使用 CASE 语句。

SAP ABAP - 字符串

字符串在ABAP编程中广泛使用,是一个字符序列。

我们使用数据类型 C 变量来保存字母数字字符,最少 1 个字符,最多 65,535 个字符。默认情况下,它们左对齐。

创建字符串

以下声明和初始化创建一个由单词“Hello”组成的字符串。字符串的大小正好是单词“Hello”中的字符数。

Data my_Char(5) VALUE 'Hello'.

以下程序是创建字符串的示例。

REPORT YT_SEP_15. 
DATA my_Char(5) VALUE 'Hello'. 
Write my_Char.

上面的代码产生以下输出 -

Hello

字符串长度

为了求出字符串的长度,我们可以使用STRLEN语句。STRLEN() 函数返回字符串中包含的字符数。

例子

REPORT YT_SEP_15. 
DATA: title_1(10) VALUE 'Tutorials',
      length_1 TYPE I. 
	
length_1 = STRLEN( title_1 ). 
Write: / 'The Length of the Title is:', length_1.

上面的代码产生以下输出 -

The Length of the Title is: 9 

ABAP 支持多种操作字符串的语句。

编号 声明与目的
1

连接

两个字符串连接起来形成第三个字符串。

2

凝结

该语句删除空格字符。

3

斯特伦

用于查找字段的长度。

4

代替

用于替换字符。

5

搜索

在字符串中运行搜索。

6

转移

用于向左或向右移动字符串的内容。

7

分裂

用于将一个字段的内容拆分为两个或多个字段。

以下示例使用了上述一些语句 -

例子

REPORT YT_SEP_15. 
DATA: title_1(10) VALUE 'Tutorials', 
      title_2(10) VALUE 'Point',
      spaced_title(30) VALUE 'Tutorials  Point  Limited',
      sep,
      dest1(30),
      dest2(30).
	
CONCATENATE title_1 title_2 INTO dest1. 
Write: / 'Concatenation:', dest1. 

CONCATENATE title_1 title_2 INTO dest2 SEPARATED BY sep. 
Write: / 'Concatenation with Space:', dest2. 

CONDENSE spaced_title.
Write: / 'Condense with Gaps:', spaced_title. 

CONDENSE spaced_title NO-GAPS. 
Write: / 'Condense with No Gaps:', spaced_title.

上面的代码产生以下输出 -

Concatenation: TutorialsPoint 
Concatenation with Space: Tutorials Point 
Condense with Gaps: Tutorials Point Limited 
Condense with No Gaps: TutorialsPointLimited

注意-

  • 如果是串联,“sep”会在字段之间插入一个空格。

  • CONDENSE 语句删除字段之间的空格,但只留下 1 个字符的空格。

  • “NO-GAPS”是 CONDENSE 语句的可选补充,用于删除所有空格。

SAP ABAP - 日期和时间

ABAP 隐式引用了在世界大部分地区有效的公历。我们可以将输出转换为特定于国家/地区的日历。日期是相对于日历指定为精确的日、周或月的时间。时间被指定为相对于一天的精确秒或分钟。ABAP 始终以 24 小时格式保存时间。输出可以具有特定于国家/地区的格式。日期和时间通常被解释为当前时区有效的本地日期。

ABAP 提供了两种内置类型来处理日期和时间 -

  • D 数据类型
  • T 数据类型

以下是基本格式 -

DATA: date TYPE D, 
      time TYPE T.  
	
DATA: year TYPE I, 
month TYPE I,  
day TYPE I, 
hour TYPE I,  
minute TYPE I, 
second TYPE I.

这两种类型都是固定长度字符类型,其形式分别为 YYYYMMDD 和 HHMMSS。

时间戳

除了这些内置类型之外,许多标准应用程序表中还使用其他两种类型TIMESTAMPTIMESTAMPL来存储 UTC 格式的时间戳。下表显示了 ABAP 中可用的基本日期和时间类型。

编号 数据类型和描述
1

D

YYYYMMDD 形式的内置固定长度日期类型。例如,值 20100913 表示日期 2010 年 9 月 13 日。

2

时间

HHMMSS 形式的内置固定长度时间类型。例如,值 102305 表示时间 10:23:05 AM。

3

TIMESTAMP(类型 P – 长度 8 无小数)

该类型用于以 YYYYMMDDhhmmss 形式表示短时间戳。例如,值 20100913102305 表示日期 2010 年 9 月 13 日上午 10:23:05。

4

TIMESTAMPL(类型 P - 长度 11 位小数 7)

TIMESTAMPL 表示 YYYYMMDDhhmmss,mmmuuun 形式的长时间戳。这里附加的数字“mmmuuun”代表秒的分数。

当前日期和时间

以下代码片段检索当前系统日期和时间。

REPORT YR_SEP_15. 
DATA: date_1 TYPE D. 

date_1 = SY-DATUM. 
Write: / 'Present Date is:', date_1 DD/MM/YYYY. 

date_1 = date_1 + 06. 
Write: / 'Date after 6 Days is:', date_1 DD/MM/YYYY.

上面的代码产生以下输出 -

Present Date is: 21.09.2015 
Date after 6 Days is: 27.09.2015

变量 date_1 被赋予当前系统日期 SY-DATUM 的值。接下来,我们将日期值增加 6。就 ABAP 中的日期计算而言,这意味着我们将日期对象的日期部分增加 6 天。ABAP 运行时环境非常智能,可以在日期值到达月底时滚动该日期值。

时间计算的工作方式与日期计算类似。以下代码使用基本时间算术将当前系统时间增加 75 秒。

REPORT YR_SEP_15. 
DATA: time_1 TYPE T. 
      time_1 = SY-UZEIT. 

Write /(60) time_1 USING EDIT MASK 
'Now the Time is: __:__:__'. 
time_1 = time_1 + 75. 

Write /(60) time_1 USING EDIT MASK 
'A Minute and a Quarter from Now, it is: __:__:__'.

上面的代码产生以下输出 -

Now the Time is 11:45:05 
A Minute and a Quarter from Now, it is: 11:46:20

使用时间戳

您可以使用GET TIME STAMP检索当前系统时间并将其存储在时间戳变量中,如以下代码所示。GET TIME STAMP 语句根据所使用的时间戳数据对象的类型以长记或简写格式存储时间戳。时间戳值使用 UTC 标准进行编码。

REPORT YR_SEP_12. 
DATA: stamp_1 TYPE TIMESTAMP,
 
stamp_2 TYPE TIMESTAMPL. 
GET TIME STAMP FIELD stamp_1. 
Write: / 'The short time stamp is:', stamp_1 

TIME ZONE SY-ZONLO. 
GET TIME STAMP FIELD stamp_2. 
Write: / 'The long time stamp is:', stamp_2 
TIME ZONE SY-ZONLO.

上面的代码产生以下输出 -

The short time stamp is: 18.09.2015 11:19:40 
The long time stamp is: 18.09.2015 11:19:40,9370000

在上面的示例中,我们使用 WRITE 语句的 TIME ZONE 添加来显示时间戳。此添加根据指定时区的规则格式化时间戳的输出。系统字段 SY-ZONLO 用于显示用户首选项中配置的本地时区。

SAP ABAP - 格式化数据

ABAP 提供了各种类型的格式化选项来格式化程序的输出。例如,您可以创建一个包含不同颜色或格式样式的各种项目的列表。

WRITE 语句是用于在屏幕上显示数据的格式化语句。WRITE 语句有不同的格式选项。WRITE 语句的语法是 -

WRITE <format> <f> <options>.

在此语法中,<format> 表示输出格式规范,可以是正斜杠 (/),表示从新行开始显示输出。除了正斜杠之外,格式规范还包括列号和列长度。例如,WRITE/04 (6) 语句显示新行从第 4 列开始,列长度为 6,而 WRITE 20 语句显示当前行的第 20 列。参数 <f> 表示数据变量或带编号的文本。

下表描述了用于格式化的各种子句 -

编号 条款及说明
1

左对齐

指定输出左对齐。

2

居中

表示输出居中。

3

右对齐

指定输出右对齐。

4

在 <g> 下

输出直接从字段 <g> 下开始。

5

无间隙

指定拒绝字段 <f> 后的空白。

6

使用编辑蒙版<m>

表示格式模板<m>的规范。使用无编辑掩码:这指定 ABAP 字典中指定的格式模板已停用。

7

无零

如果字段仅包含零,则它们将被替换为空格。

以下是数字类型字段的格式选项 -

编号 条款及说明
1

没有征兆

指定屏幕上不显示前导符号。

2

指数<e>

指定在类型 F(浮点字段)中,指数在 <e> 中定义。

3

圆形 <r>

P 类型字段(压缩数值数据类型)首先乘以 10**(-r),然后四舍五入为整数值。

4

货币 <c>

表示格式化是根据 TCURX 数据库表中存储的货币 <c> 值完成的。

5

单位<u>

指定小数位数根据类型 P 的 T006 数据库表中指定的 <u> 单位固定。

6

小数 <d>

指定小数点后必须显示的位数<d>。

例如,下表显示了日期字段的不同格式选项 -

格式选项 例子
日/月/年 2015年1月13日
月/日/年 2015年1月13日
日/月/年 13/01/2015
月/日/年 2015年1月13日
日日日日月日 130115
MMDDYY 011315
年月日 150113

其中,DD 代表两位数的日期,MM 代表两位数的月份,YY 代表两位数的年份,YYYY 代表四位数的年份。

让我们看一下实现上述一些格式化选项的 ABAP 代码示例 -

REPORT ZTest123_01.
 
DATA: n(9) TYPE C VALUE 'Tutorials', 
m(5) TYPE C VALUE 'Point'. 

WRITE: n, m. 
WRITE: / n, 
/ m UNDER n. 

WRITE: / n NO-GAP, m. 
DATA time TYPE T VALUE '112538'. 

WRITE: / time, 
/(8) time Using EDIT MASK '__:__:__'.

上面的代码产生以下输出 -

Tutorials Point 
Tutorials  
Point 
TutorialsPoint 
112538 
11:25:38

SAP ABAP - 异常处理

异常是程序执行过程中出现的问题当异常发生时,程序的正常流程被打乱,程序应用程序异常终止,这是不推荐的,因此需要对这些异常进行处理。

异常提供了一种将控制从程序的一个部分转移到另一个部分的方法。ABAP 异常处理基于三个关键字 - RAISE、TRY、CATCH 和 CLEANUP。假设某个块将引发异常,则方法将使用 TRY 和 CATCH 关键字的组合来捕获异常。TRY - CATCH 块放置在可能生成异常的代码周围。以下是使用 TRY – CATCH 的语法 -

TRY.      
Try Block <Code that raises an exception> 
  
CATCH  
Catch Block <exception handler M>  
. . . 
. . . 
. . . 
CATCH  
Catch Block <exception handler R>
   
CLEANUP. 
   Cleanup block <to restore consistent state>
 
ENDTRY.

RAISE - 引发异常以表明发生了某些异常情况。通常,异常处理程序会尝试修复错误或找到替代解决方案。

TRY - TRY 块包含要处理异常的应用程序编码。该语句块是按顺序处理的。它可以包含进一步的控制结构和过程或其他 ABAP 程序的调用。其后跟随一个或多个 catch 块。

CATCH - 程序使用异常处理程序在程序中要处理问题的位置捕获异常。CATCH关键字表示捕获异常。

CLEANUP - 每当 TRY 块中发生异常且未由相同 TRY - ENDTRY 构造的处理程序捕获时,就会执行 CLEANUP 块的语句。在CLEANUP子句中,系统可以将对象恢复到一致状态或释放外部资源。即,可以对TRY块的上下文执行清理工作。

引发异常

可以在方法、功能模块、子例程等中的任何点引发异常。有两种方式可以引发异常 -

  • ABAP 运行时系统引发的异常。

    例如,Y = 1 / 0。这将导致 CX_SY_ZERODIVIDE 类型的运行时错误。

  • 程序员引发的异常。

    同时引发并创建异常对象。使用第一个场景中已存在的异常对象引发异常。语法为:引发异常 exep。

捕获异常

处理程序用于捕获异常。

让我们看一下代码片段 -

DATA: result TYPE P LENGTH 8 DECIMALS 2, 
exref TYPE REF TO CX_ROOT, 
msgtxt TYPE STRING. 
PARAMETERS: Num1 TYPE I, Num2 TYPE I. 
TRY. 
result = Num1 / Num2. 
CATCH CX_SY_ZERODIVIDE INTO exref. 
msgtxt = exref→GET_TEXT( ). 

CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref. 
msgtxt = exref→GET_TEXT( ).

在上面的代码片段中,我们尝试将 Num1 除以 Num2 以获得浮点类型变量中的结果。

可能会生成两种类型的异常。

  • 数字转换错误。

  • 除以零例外。处理程序捕获 CX_SY_CONVERSION_NO_NUMBER 异常以及 CX_SY_ZERODIVIDE 异常。这里异常类的GET_TEXT()方法用于获取异常的描述。

异常的属性

这是菲