SAP的ABAP4语言中文培训教材第一部分第三章 声明数据.docx
《SAP的ABAP4语言中文培训教材第一部分第三章 声明数据.docx》由会员分享,可在线阅读,更多相关《SAP的ABAP4语言中文培训教材第一部分第三章 声明数据.docx(28页珍藏版)》请在冰豆网上搜索。
![SAP的ABAP4语言中文培训教材第一部分第三章 声明数据.docx](https://file1.bdocx.com/fileroot1/2022-12/29/132b5448-c56a-43bd-9a51-cf608414ddfd/132b5448-c56a-43bd-9a51-cf608414ddfd1.gif)
SAP的ABAP4语言中文培训教材第一部分第三章声明数据
第三章1声明数据
概览
内容
数据类型和对象简介
数据类型
基本数据类型-预定义的
基本数据类型-用户定义的
结构化数据类型
数据类型的兼容性
数据对象
文字
变量
常量
系统定义的数据对象
创建数据对象和数据类型
DATA语句
CONSTANTS语句
STATICS语句
TABLES语句
TYPES语句
示例汇总
预定义基本数据类型和对象示例
用户定义的基本数据类型和对象示例
字段串示例
内表示例
使用类型组
确定数据对象的属性
确定字段长度
确定数据类型
确定输出长度
确定小数位
确定转换例程
本节说明如何在ABAP/4程序中声明数据。
要能声明数据,应该熟悉定义数据类型数据对象之间关系的ABAP/4类型概念。
下列内容介绍ABAP/4类型概念
下列主题说明
在该指南中,术语“字段”用于数据对象。
通常情况下,字段可以是
_任何数据对象(参见数据对象(页7))
_字段符号或形式参数(参见使用字段符号和通过参数传递数据)
根据上下文,可以明确术语“字段”代表什么。
2数据类型和对象简介
数据类型和数据对象是ABAP/4类型概念的基本组件。
二者均可由用户声明和维护。
这与其它编程语言如C、FORTRAN或PASCAL不同,在这些语言中用户可以声明数据对象,但仅限于预定义的数据类型。
在ABAP/4中,可以使用与标准数据声明相似的语法处理数据类型,而与数据对象无关。
特殊程序以外的数据类型集中存储也是可能的。
下列列表是数据类型和对象主要特征的概述:
_数据类型(基本的或结构化的)
-数据类型是纯粹的说明。
-没有与数据类型相关联的内存。
-数据类型描述数据对象的技术属性。
-数据类型是数据对象的属性并与数据对象联系紧密。
_数据对象(文字、变量、常量等):
-数据对象是程序在运行时使用的物理单元。
-每个数据对象都有分配给它的特定数据类型。
-每个数据对象占据一些内存空间。
-ABAP/4根据数据对象的数据类型处理数据对象。
在程序中,必须声明要使用的全部数据对象。
声明过程中,必须给数据对象分配属性。
其中最重要的属性是数据类型。
在ABAP/4中,可以使用与其它程序语言相似的预定义的数据类型,或者使用用户定义的数据类型。
由于ABAP/4中用户定义的数据类型允许编程具有非常大的灵活性,所以提供了强有力的工具。
它们的范围从基本类型(例如,给定长度的字符串)到非常复杂的结构(例如,嵌套表)。
将用户定义的数据类型分配给数据对象使您能精确处理需要的数据对象。
可以按使用预定义数据类型的方式使用用户定义的数据类型。
可以在程序内对它们进行局部明,或在ABAP/4词典中对它们进行全局保存。
有三个层次级的数据类型和对象:
_在ABAP/4词典中定义的独立于程序的数据
_在一个程序中全局使用的内部数据
_在过程(子程序和功能模块)中局部使用的数据
在本指南的相应章节将了解到有关这些层次级的详细内容。
3数据类型
在ABAP/4中按结构和定义对数据类型分类。
数据类型是:
_基本的(非结构化的)或结构化的
_预定义的或用户定义的
因此,有四类数据类型,在下表中列出。
预定义数据类型的名称是固定的。
用户定义的数据类型的名称由程序员在程序中定义。
ABAP/4中的数据类型
预定义的
用户定义的
基本的
C、D、F、I、N、P、T和X:
ABAP/4包含8个预定义基本数据类型。
基本数据类型-预定义的(页3)
用户定义的基本数据类型基于预定义基本数据类型。
基本数据类型-用户定义的(页5)
结构化的
TABLE:
该预定义的结构化的数据类型仅用于形式参数和字段符号的键入。
字段串和内表:
这些结构化的数据类型可以用于数据对象并且是用户定义的。
结构化数据类型(页5)
使用数据时,了解数据类型是否兼容是很重要的。
关于该主题的详细信息,参见
3基本数据类型-预定义的
下表总结了ABAP/4中预定义的基本数据类型(有效大小以字节为单位):
ABAP/4数据类型
数据类型
默认大小
有效大小
初始值
说明
C
1
1-65535
SPACE
文本、字符
(字母数字字符)
D
8
8
'00000000'
日期
(格式:
YYYYMMDD)
F
8
8
0
浮点数
I
4
4
0
整型(整数)
N
1
1-65535
'00...0'
数字文本
P
8
1-16
0
压缩号
T
6
6
'000000'
时间
(格式:
HHMMSS)
X
1
1-65535
X'00'
十六进制
在各方面,数据类型D、F、I和T都是预定义的,但数据类型C、N、P和X可以有附加说明。
例如,可以在程序中定义大小。
关于数字数据类型I、F和P的详细信息,参见数字数据类型(页4)。
4数字数据类型
ABAP/4支持三种数字数据类型。
它们是:
_类型I的整型(整数)
_类型P的压缩号
_类型F的浮点数
类型I数据
类型I数据的数值范围是-2**31到2**31-1并且仅包括整数。
对算术运算的非整型结果(如分数)进行四舍五入,而不是截断。
类型I数据可用于计数器、项目号、索引和时间期段等。
类型P数据
类型P数据允许在小数点后有数字。
类型P数据的数值范围取决于大小和小数点后的位数。
有效大小可以是从1到16字节的任何值。
将两个十进制数字压缩到一个字节,而最后一个字节包含一个数字和符号。
在小数点后最多允许14个数字。
关于定义小数点后位数的详细信息,参见DATA语句的基本格式(页12)。
使用类型P数据时,最好将程序属性设置为“定点算法”(参见指定程序属性(页Error!
Notavalidlink.))。
否则,将类型P数字作为整型对待。
类型P数据可用于如距离、重量和钱数等数值。
类型F数据
对于正数和负数,类型F数的数值范围是1x10**-307到1x10**308,包括0(零)。
精确范围近似为15位十进制数,这取决于硬件平台的浮点算法。
由于是在内部将类型F数据转换为二进制系统,因此可能出现舍入误差。
尽管ABAP/4处理器试图将这些影响减至最小,但是如果要求高精度,则不应该使用类型F数据。
而应代之以类型P数据。
如果需要大的数值范围,而且舍入误差不重要,则可以使用类型F数据。
因为对类型I和F字段的算术运算与机器码语句关系更紧密,所以用类型I和类型F字段的计算比用类型P字段的计算要快;同时对P字段的运算要求更多的软件支持。
尽管如此,可能仍必须使用类型P数据以满足精度或数值范围的要求。
类型N数据不包含数值。
虽然由数字组成,但这些数字不用于计算。
科目号和邮编是典型的类型N字段。
5基本数据类型-用户定义的
用户定义的基本数据类型完全是以预定义的基本数据类型为基础的。
要定义自己的基本数据类型,请使用TYPES语句(参见TYPES语句(页18))。
用户定义的基本数据类型使程序的阅读和维护更加容易:
_例如,如果在程序中经常需要使用某数据类型集,通过为类型定义创建包括程序(参见包含程序),或者在ABAP/4词典的类型组中定义数据类型(参见使用类型组(页23)),可以确保总是使用相同的数据类型。
_若要使数据类型更易于理解和识别,可以赋予它们描述性的名称。
_在将用户定义的数据类型分配给几个数据对象之后,通过更改TYPES语句中数据类型的定义,可以用一个操作更改所有这些数据对象的数据类型。
TYPES:
NUMBERTYPEI,
LENGTHTYPEPDECIMALS2,
CODE(3)TYPEC.
.......
DATA:
NO_FLIGHTSTYPENUMBER,
NO_PASSENGERSTYPENUMBER,
DISTANCETYPELENGTH,
HEIGHTTYPELENGTH,
....
CITY_CODETYPECODE,
COUNTRY_CODETYPECODE,
......
示例中,定义了名为NUMBER的数据类型。
该数据类型除拥有不同名称以使程序更易于阅读外,与预定义的数据类型I相同。
该示例中还定义了数据类型LENGTH,该数据类型是以预定义的基本数据类型P为基础的。
为LENGTH定义了给定数目的小数位。
例如,如果需要更改长度规格的精度,仅须在程序中更改TYPES语句。
还定义了第三种数据类型CODE。
CODE是以预定义的类型C为基础的,具有给定长度3。
5结构化数据类型
通常情况下,ABAP/4程序中的结构化数据类型是用户定义的。
在ABAP/4中,没有可用的预定义结构化数据类型,但下列例外:
可以使用预定义的一般表类型TABLE,以便将具有一般行结构的内表传递到子程序(参见键入形式参数),或者键入字段符号(参见键入字段符号)。
有两种结构化数据类型:
_字段串
字段串是其它数据类型的集合。
字段串的组件可以是字段串本身或内表。
可以用TYPES语句或DATA语句(参见用于字段串的DATA语句(页15))定义字段串。
通过DATA语句不能定义独立数据类型,而可以定义具有结构化类型的数据对象。
_内表
内表由相同类型的几行组成。
与字段串仅“水平地”扩展不同,内表还“垂直地”扩展。
可以用TYPES或DATA语句的OCCURS参数定义内表(参见创建内表(页Error!
Notavalidlink.))。
由于字段串能包含任何类型的组件,而且可以为任何类型定义内表,所以自定义数据结构可能变得非常复杂。
结构化数据类型示例
下列是ABAP/4中结构化数据类型的示例
a)由一系列基本数据类型组成的字段串(平铺结构,仅“水平”)
b)为基本字段定义的内表(基本数据类型的动态排列,仅“垂直”)
c)为简单字段串定义的内表(带有行和列的表)
d)包含子结构的结构(嵌套结构)
e)结构,该结构包含内表作为组件(垂直结构)
f)为包含结构化组件的字段串定义的内表(垂直行类型的表)
g)为字段串定义的内表,该字段串包含内表作为组件
7数据类型的兼容性
使用数据时,有时需要将数据从一种类型转换到另一种类型。
要作到这一点,数据类型必须是可转换的(参见类型转换(页Error!
Notavalidlink.))。
可转换性的一个重要前提就是兼容性。
如果两个数据类型具有相同的技术属性,则它们是兼容的。
不同ABAP/4数据类型的后果如下:
基本数据类型
如果在类型、大小和(对于类型P)小数位等方面是相同的,则基本数据类型和其它基本数据类型是兼容的。
基本数据类型与结构化数据类型相互之间不兼容。
结构化数据类型
对于结构化数据类型,必须区分字段串和内表。
字段串
如果字段串的结构相同而且组件兼容,则字段串与其他字段串兼容。
这意味着从基本字段构造字段串,以便从子结构形成整个结构的方式必须相同,而且它们的基本组件必须相互兼容。
如果两个字段串由顺序相同的基本字段组成,但这些字段组合成不同的子结构,则字段串不兼容。
字段串与基本数据类型和内表不兼容。
内表
如果行类型兼容,则内表与其他内表兼容。
内表的兼容性不取决于行数。
内表与字段串和基本数据类型不兼容。
在上述情况下,由于在ABAP/4程序运行期间出现的每个数据类型是完全确定的(例如,数据类型C的长度总是已定义并已知的),所以数据类型之间的兼容性总是涉及到已完全指定的数据类型。
该兼容性是对称的。
在形式参数和字段符号键入的方面,使用有点不同的、非对称的兼容性(参见键入形式参数和键入字段符号)。
7数据对象
在ABAP/4中,可以使用几种数据对象,如下所示:
_内部数据对象
创建内部数据对象供在特定的程序中使用。
在该程序之外无效。
内部数据对象包括:
_外部数据对象
外部数据对象独立于程序。
不能直接使用外部数据对象,但能将其复制到内部数据对象,并在完成后将它们回写。
可以在整个系统环境中全局使用外部数据对象。
ABAP/4将外部数据对象保存在ABAP/4词典中定义的表中。
要从程序内部访问该数据,请用TABLES语句(参见TABLES语句(页17))在程序中声明该表。
_系统定义的数据对象
除用户定义的数据对象外,还有一些数据对象由系统自动定义。
_特殊数据对象
ABAP/4还包括一些具有特殊特征的数据对象,即:
-参数
参数是链接到选择屏幕的变量。
参数可以在程序启动后接受数值。
-选择标准
选择标准是用于指定数值范围的特殊内表。
它们也与选择屏幕相链接。
关于这些数据对象及其声明的详细信息,参见使用选择屏幕。
8文字
文字是固定值。
ABAP/4区分文本文字和数字文字。
文本文字
文本文字是单引号内的字母数字字符序列。
'AntonySmith'
'69190Walldorf'
文本文字最长可达254个字符。
如果某文本文字包含引号,必须重复引号,以使系统能够将内容识别为文本文字而不是文字的结尾。
WRITE:
/'ThisisJohn''sbicycle'.
该语句生成下列输出:
ThisisJohn'sbicycle
要确保程序仍易于维护并且独立于语言,请勿在程序的最终版本中显式地使用文本文字。
而应将其外部地定义为文本符号。
文本符号是ABAP/4文字基本概念的一部分。
关于这方面的详细信息,以及关于如何创建和使用文本符号的详细信息,参见处理文本摘要(页Error!
Notavalidlink.)。
数字文字
数字文字是可能包含前导符号的数字序列。
可包含多达15个数字。
123
-93
+456
如果需要非整型数值或较长的数字,则必须使用文本文字,该文本文字自动转换到正确的类型。
(详细信息,参见类型转换(页Error!
Notavalidlink.))。
'12345678901234567890'
'+0.58498'
'-8473.67'
同样,请使用文本文字表示浮点数值。
必须按照下列格式:
'[][E][]'
'-12.34567'
'-765E-04'
'1234E5'
'+12E+23'
'+12.3E-4'
'1E160'
9变量
变量用于以一定名称按一定格式保存并参考数据。
变量可能在下列方面不同
_名称
_类型
_长度
_结构
可以利用DATA语句在程序中声明变量(参见DATA语句(页11))。
DATA:
S1TYPEI,
S2TYPEI,
SUMTYPEI.
....
SUM=S1+S2.
....
10常量
常量是包含值的数据对象,该值是在初始化时确定的。
在程序执行期间不能更改常量。
在程序中利用常量语句声明常量(参见CONSTANTS语句(页16))。
如果试图在程序的其它地方更改常量,在语法检查或运行期间,系统将输出错误消息。
也可以在ABAP/4词典的类型组中声明常量(参见使用类型组(页23))。
如果在程序中频繁地需要某特殊数值,请使用常量。
在这种情况下,请勿使用文字。
如果需要修改该值,只须更改声明。
CONSTANTSPITYPEPDECIMALS10VALUE'3.1415926536'.
....
10系统定义的数据对象
启动ABAP/4程序时,一些数据对象自动可用而无需声明。
系统定义的数据对象包括:
_SPACE
数据对象SPACE是类型C的常量。
长为一个字符并包含空格。
由于SPACE是常量,所以不能更改。
_系统字段
所有系统字段都有格式为SY-的名称,其中指定单个字段。
若要在ABAP/4编辑器中显示可用系统字段的列表,请在命令行中键入“SHOWSY”(请选择“编辑->其它功能->命令输入”)。
该列表还包括系统字段的数据类型。
下面是系统字段示例:
_SY-SUBRC返回代码值(0,如果操作成功)
_SY-UNAME用户的登录名
_SY-DATUM当前日期
_SY-UZEIT当前时间
_SY-TCODE当前事务
系统字段是变量并且可以由程序更改。
但是,SAP不建议这样做,因为在继续执行程序时,将失去保存在这些字段中的信息。
11创建数据对象和数据类型
本节说明如何在程序中创建数据对象和数据类型。
除文字外,还必须利用声明语句声明每个数据对象。
在声明语句中,必须指定所有数据对象的数据类型。
要做到这一点,可以使用数据类型(页3)中说明的任何数据类型。
在声明语句中定义对象的数据类型,有下列方式之一
_直接地,使用...TYPE....
_间接地,使用LIKE....
对下面列出的大多数数据声明语句,TYPE和LIKE是可选的附加项。
利用TYPE选项,可以直接将数据类型分配给已声明的数据对象。
利用LIKE选项,可以将另一个数据对象的数据类型分配给已声明的数据对象。
这意味着间接引用数据类型。
对数据对象和数据类型有独立的名称空间。
这意味着一个名称既可以是数据类型名,同时又可以是数据对象名。
在程序中,可以使用数据声明语句静态地定义数据对象,或者利用操作语句动态地创建数据对象。
ABAP/4包括下列用于静态地创建数据对象和数据类型的关键字:
DATA语句(页11)
用于创建变量
CONSTANTS语句(页16)
用于创建常量
STATICS语句(页17)
用于创建变量,这些变量在程序运行期间一直存在,但仅在过程中可见
TABLES语句(页17)
用于创建表工作区
TYPES语句(页18)
用于创建用户定义的数据类型
在内表环境中,可以使用操作语句APPEND、COLLECT和INSERT以动态地创建内表的行(参见填充内表(页Error!
Notavalidlink.))。
在选择屏幕环境中,可以使用附加语句PARAMETERS和SELECT-OPTIONS以创建带特殊功能的数据对象(参见使用选择屏幕)。
11DATA语句
使用DATA语句定义局部和全局变量。
关于局部和全局变量间区别的详细信息,参见在调用程序和子系统之间传递数据。
DATA语句有一个基本格式和三个主要变式,如下所示:
_用于字段串的DATA语句
_用于内表的DATA语句
_用于公用内存块的DATA语句。
下列内容说明DATA语句的基本格式
下列内容说明用于字段串的DATA语句
由于内表性质的复杂性,将用一个独立章节来说明该主题。
关于定义内表的详细信息,参见创建和处理内表(页Error!
Notavalidlink.)。
由于声明用于几个程序的公用内存块与外部子程序有关,所以将在涉及子程序的章节中解释该主题(参见声明数据作为通用部分)。
12DATA语句的基本格式
可以在程序中使用DATA语句的基本格式以定义内部变量。
语法如下:
语法
DATA[()][][].
基本格式中,关键字DATA有下列参数:
参数
用途
命名变量(页12)
指定变量的数据类型和长度(页13)
指定初始值(页14)
指定小数位数(页15)
12命名变量
变量名最长可达30个字符。
除下面列出的这些字符外,可以使用任何字母数字字符。
_请勿使用下列字符
-加号+
-句点.
-逗号,
-冒号:
-圆括号()
_请勿创建完全由数字字符组成的名称
ABAP/4包含具有保留名(不允许使用这些保留名)的预定义数据对象(参见系统定义的数据对象(页10))。
另外,如果变量名与引导语句的关键字的参数相混淆,则请勿在语句中使用该变量名。
书写DATA语句时,请遵循这些指南: