第一个ABAP报告
REPORT ZHELLO1.
WRITE ‘Hello World’.
依次点击检查激活直接处理就可以
并且我们可以点击保存来存储报告
然后为了理解SAP ABAP,需要了解具有登录,ABAP编辑器,注销等屏幕的基本知识
输入SE38来导航到ABAP编辑器
ABAP源程序由注释和ABAP语句组成
ABAP中的每个语句都以关键词开头,以句号结尾,ABAP不区分大小写
程序中第一个非注释行以单词REPORT开头。报告将始终是创建任何可执行程序的第一行。该语句后面是以前创建的程序名称。然后用一个句号来终止该行
REPORT [Program_Name].
[Statements…].
这允许语句根据需要在编辑器中占用尽可能多的行。例如,REPORT可能看起来像这样
REPORT Z_Test123_01.
语句包括命令和任何以句号结尾的变量和选项,只要句号出现在语句的结尾,就不会出现问题。
接下来我们来编写代码
REPORT Z_Test123_01.
Write 'This is ABAP Tutorial'.
编写语句时需要考虑四件事情:
1.写语句将引号中的任何内容写入输出窗口。
2.ABAP编辑器将所有文本转换为大写,除了由单引号包围的文本字符串
3.与一些其他编辑语言不同,ABAP不讲究每行的缩进
4.ABAP对语句的布局没有限制,也就是既可以在单个行上放置多个语句,也可以单个语句跨越多个行扩展
如果每个语句的开头是相同的,则连续语句可以链接在一起,这时使用冒号运算符合都好,可以用于终止单个语句,就像句号结束正常语句一般
例如我们可以写出以下三个相同功能的语句
WRITE 'Hello'.
WRITE 'ABAP'.
WRITE 'World'.
WRITE: 'Hello',
'ABAP',
'World'.
WRITE: 'Hello', 'ABAP', 'World'.
内敛注释可以通过以下两种方式之一在程序中的任何位置声明:
1.通过在行的第一个位置放置星号来进行全行注释
2.在语句之后通过双引号来表示
抑制空白指令,即NO-ZERO
将数字字段的所有前缀零都抑制。从而使输出更容易让用户阅读
例子
REPORT Z_Test123_01.
DATA: W_NUR(10) TYPE N.
MOVE 50 TO W_NUR.
WRITE W_NUR NO-ZERO.
如果没有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 number_of_lines.插入多个空白行
ULINE命令自动在输出插入一条水平线
WRITE 'This is Underlined'.
ULINE.
输出如下:
This is Underlined (and a horizontal line below this).
当在ABAP中编程时,我们需要使用各种变量来存储信息。变量知识保留值得存储位置。这意味着,当您创建一个变量,你在内存中保留一些空间。您可能希望存储各种数据类型的信息,如字符,整数,浮点等。基于变量的数据类型,操作系统分配内存病决定在保留内存中可以存储的内容。
类型 关键词
字节字段 X
文本域 C
Integer I
浮点 F
打包数量 P
文本字符串 STRING
一些字段和数字可以使用一个或多个名称来修改,如下所示:
byte
numeric
character-like
下表显示数据类型,将值存储在内存中需要多少内存,以及可以存储在此类变量中的最小值和最大值。
类型 典型长度 典型范围
X 1字节 任何字节值(00到FF)
C 1个字符 1〜65535
N 1个字符 1〜65535
D 8个字符 8个字符
T 6个字符 6个字符
I 4字节 -2147483648至2147483647
F 8字节 2.2250738585072014E-308至1.7976931348623157E + 308正或负
P 8字节 [-10 ^(2len -1)+1]到[+ 10 ^(2len -1)1](其中len =固定长度)
STRING Variable 任何字母数字字符
XSTRING Variable 任何字节值(00到FF)
案例如下:
REPORT YR_SEP12.
DATA text_line TYPE C LENGTH 40.
text_line = 'A Chapter on Data Tyeps'.
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中变量声明的基本形式是
DATA TYPE VALUE .
这里的指定变量的名称,最多可包含30个字符
指定变量的类型。
指定的初始值。
以下是变量声明的有效示例。
DATA d1(2) TYPE C.
DATA d2 LIKE d1.
DATA minimum_value TYPE I VALUE 10.
在上面的代码片段中,d1是C类型的变量
d2,是d1类型的变量
minimun_value是整数类型的变量。
在ABAP中,有三种变量类型
即
1.Static Variables 静态变量
2.Reference Variables 参考变量
3.System Variables 系统变量
以下案例显示我们如何使用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类型。
上述代码的输出如下:
声明引用变量的语法是:
DATA TYPE REF TO VALUE IS INITIAL.
要点:
REF TO 附加声明一个引用变量ref。
REF TO 之后的规范指定了引用变量的静态类型。
静态类型限制的对象集合。可以参考。
引用变量的动态类型是它当前引用的数据类型或者类
静态类型总是更加通用或与动态类型相同
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程序访问
实际上这些字段是由运行时环境填充
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.
字符文字是用单引号括起来的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 `.
以上两种情况下的输出相同
我们可以在CONSTANTS语句的帮助下声明命名的数据对象。
以下是语法:
CONSTANTS TYPE VALUE .
CONSTANTS语句类似于DATA语句。
指定常量的名称。
TYPE 表示常数,其命名为;
其继承于现有数据类型相同的技术属性。
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.
我们可以在比较中使用常量引用,或者我们可以将其传递给过程。
ABAP提供了一组丰富的运算符来操纵变量。所有ABAP运算符分为四类:
1.算术运算符
2.比较运算符
3.按位运算符
4.字符串运算符
算术运算符在数学表达式中使用的方式与在代数中使用的方式相同。以下列表描述了算术运算符。假设整数变量A保持20并且变量B保持40。
案例:
REPORT YS_SEP_08.
DATA: A TYPE I VALUE 150,
B TYPE I VALUE 50,
Result TYPE I.
Result = A / B.
WRITE / Result.
A 150 B 50
A/B=3
上述代码产生以下输出:3
编号 比较运算符和描述
1 =(相等测试)替代形式是EQ
2 <>(不等式检验) 替代形式是NE
3 >(大于测试) 替代形式是GT
4 <(小于测试) 替代形式是LT
5 >=(大于或等于) 替代形式是GE
6 <=(小于等于) 替代形式是LE
7 a1 BETWEEN a2 AND a3(间隔测试)
8 is INITAL
如果变量的内容没有改变,并且它已被自动赋予其初始值,则条件为真。 示例(A IS INITIAL)不为真
9 不是初始
如果变量的内容已更改,则条件为真。 示例(A IS NOT INITIAL)为真。
注意:如果变量的数据类型或者长度不匹配,则执行自动转换。在比较不同数据类型的两个值时,对一个或两个值执行自动类型调整。转换类型由数据类型和数据类型的首选顺序决定
以下是喜好的顺序:
如果一个字段是类型I,则另一个字段转换为类型I.
如果一个字段是P类型,则另一个字段转换为类型P.
如果一个字段是类型D,则另一个字段转换为类型D.但是C和N类型不转换,它们直接比较。 类似于类型T的情况。
如果一个字段是类型N,另一个是类型C或X,则两个字段都转换为类型P.
如果一个字段是类型C,另一个是类型X,则X类型转换为类型C.
案例:
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=115
B=119
如果A
上述代码产生以下输出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 INITAL 判断A的值没有改变
上面的代码产生以下输出
A is assigned.
ABAP还提供了一系列可以用于构建布尔代数表达式的逐位逻辑运算符。位运算符可以使用括号等组合在复杂表达式中。
编号 按位运算符和说明
1 BIT-NOT
一元运算符,将十六进制数中的所有位翻转位相反的值,例如,将此运算符应用于具有位级值10101010(例如““AA””)的十六进制将给出01010101.
2 BIT-AND
此二进制运算符使用布尔AND运算符逐位比较每个字段
3 BIT-XOR
二进制运算符,使用布尔XOR异或运算符逐位比较每个字段
4 BIT-OR
二进制运算符,使用布尔OR运算符逐位比较每个字段
以下是字符串运算符的列表
编号 字符串操作符和说明
1 CO(仅包含)
检查A是否仅仅由B中的字符组成
2 CN(不包含)
检查A是否包含不在B中的字符
3 CA(包含任何)
检查A是否至少包含一个字符B
4 NA(不含任何)
检查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.
P CA Q 即 P 至少包含一个字符B
ABAP编程语言提供以下类型的循环来处理循环需求。
编号 循环类型和说明
1 WHILE loop
当给定条件为真时,重复一个语句或一组语句。它在执行循环体之前测试条件。
2 Do loop
DO 语句对于将特定任务重复特定次数很有用
3 Nested loop
您可以在任何另一个WHILE或DO循环中使用一个或多个循环
循环控制语句从其正常序列改变执行。ABAP包括允许循环提前结束的控制语句。它支持以下控制语句。
编号 控制语句和描述
1 CONTINUE
导致循环跳过其身体的剩余部分,并开始下一个循环传递
2 CHECK
如果条件为假,则在CHECK之后的剩余语句被忽略,并且系统开始下一循环通过。
3 EXIT
完全终止循环,并将执行转移到循环后立即执行的语句。
ABAP编程语言提供以下类型的决策语句。
编号 描述
1 IF Statement
IF 语句由逻辑表达式后跟一个或多个语句组成。
2 IF…Else Statement
IF语句后面可以是一个可选的ELSE语句,当表达式为false时执行。
3 Nested IF Statement
您可以在另一个IF或ELSEIF语句中使用一个IF或ELSEIF语句。
4 CASE Control Statement
当我们需要比较两个或多个字段或变量时,使用CASE语句。
在ABAP编程中广泛使用的字符串是一系列字符
我们使用数据类型C变量保存字母数字字符,最少为1个字符,最多为65535个字符。默认情况下,这些向左对其。
以下声明和初始化创建一个由’'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 CONCATENATE
两个字符串连接形成第三个字符串
2 CONDENSE
此语句删除空格字符
3 STRLEN
用于查找字段的长度
4 REPLACE
用于以字符进行替换
5 SEARCH
在字符串中运行搜索
6 SHIFT
用于向左或向右移动字符串的内容
7 SPLIT
用于将字段的内容拆分为两个或多个字段
案例
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.
title1=Tutorials
title2=Point
CONCATENATE title_1 title_2 INTO dest1
将title1和title2相连并赋值给dest1
Write: / ‘Concatenation:’, dest1.
输出:Concatenation: TutorialsPoint
CONCATENATE title_1 title_2 INTO dest2 SEPARATED BY sep.
将title1和title2相连并进入dest2,并且两个词中间中空格分开
Write: / ‘Concatenation with Space:’, dest2.
输出:Concatenation with Space: Tutorials Point
CONDENSE spaced_title.
删除spaced_title中的空格
Write: / ‘Condense with Gaps:’, spaced_title.
spaced_title=‘Tutorials Point Limited’
输出:Condense with Gaps: Tutorials Point Limited
注意CONDENSE语句删除字段之间的空格后,只留下一个字符的空格
CONDENSE spaced_title NO-GAPS
NO-GAPS代表删除所有空格
Write: / ‘Condense with No Gaps:’, spaced_title.
输出:Condense with No Gaps: TutorialsPointLimited
ABAP提供了两种内置类型来处理日期和时间:
D data type
T data type
以下是基本格式:
案例:
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格式的固定长度字符类型。
除了这些内置类型,其他两种类型TIMESTAMP和TIMESTAMPL在许多标准应用程序表中用于存储UTC格式的时间戳。下表显示了ABAP中可用的基本日期和时间类型。
编号 数据类型和说明
1 D
内置的固定长度日期类型,格式为YYYYMMDD。例如,值20100913表示2010年9月13日的日期。
2 T
内置固定长度时间类型,格式为HH MM SS。例如,值102305表示时间10:23:05 AM。
3 TIMESTAMP(类型P-长度8无小数)
此类型用于表示YYYYMMDDhhmmss表单中的短时间戳。例如值20100913102305表示2010年9月13日上午10:23:05的日期。
4 TIMESTAMPL(类型P-长度11小数7)
TIMESTAMPL表示YYYYMMDDhhmmsss,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
TIME ZONE 添加WRITE语句显示时间戳。此添加根据指定的时区的规则格式化时间戳的输出。系统字段SY-ZONLO用于显示在用户首选项中配置的本地时区