ABAP基本数据类型、通⽤类型ABAP基本数据类型
更多的类型请参考ABAP数据类型继承图
类型
允许最⼤长度(字符
数)默认长
度(省略时
采⽤)
说明初始值
C1~262143个字符 1 字符如果未在 DATA 语句中指定参数<length>和<type>,则创建长度为 1 的字符每个位置都是
空格
N1~262143个字符 1 字符
田中一光
0到9之间字符组成的数字字符串
如果未在 DATA 语句中指定参数<length>,则创建长度为 1 "0"每个位置都是阿拉伯数字0
D8 个字符⽇期格式必须为 YYYYMMDD 取值范围:YYYY (year): 0001 to 9999, MM(month): 01 to 12,
DD (day): 01 to 31
"00000000"
拂晓的意思
T 6 个字符格式为 24-hour的 HHMMSS
HH:00 to 23
MM: 00 to 59
SS: 00 to 59
"000000"
I 4 bytes -2.147.483.648 to +2.147.483.647(.点号为千分位分隔符,不是⼩数点,⽽,逗号则表⽰是⼩
数点)
如果运算出现⾮整型的结果(如⼩数)则进⾏四舍五⼊,⽽不是截断
F8 bytes ⼩数位最⼤可以到17位,即可精确到⼩数点后17位
取值范围:-1,7976931348623157EE+308 to -2,2250738585072014EE-308 for the negative
area, the value zero, and +2,2250738585072014EE-308 to +1,7976931348623157EE+308 for
the positive area.
如果要求⾼精度,则不应该使⽤类型 F 数据。⽽应代之以类型 P 数据
F赋值时,会转换为标准形式:<±尾数部分>E±<;指数部分>,且尾数部分的⼩数位最多
为17位
如果值是⼩
数,则要将
值使⽤引号
引起来
P 1 to 16 bytes8 bytes 有效长度为1到16个字节。
两个数字位压缩后才占⼀个字节,由于0-9的数字只需要4Bit位,所以⼀个字节实质上允许存储
⼆位数字,这就是P数据类型为压缩数据类型的由来,因为定义的的数据长度⽐存储于内存中
要长。并借⽤最后半个字节,即字⾯上的⼀位来存储⼩数点、正号、负号、或者是这三种中间
的组合————存储的可能是通过将⼩数点与正负号经过某种位运算后的结果,因为半个字节
不可能存储⼩数或正负号的所对应的ASCII码(都⽐15⼤)
P类型最多允许14位⼩数位,即可以精确到⼩数点后14,再除开⼩数点与正负号占半个字节,
即字⾯上1位4Bit,此时最⼤整数位最长可达16*2 = 32 – 1 = 31 -14 = 17位
Depending on the field length len(len表⽰定义时P的整个长度) and the number of decimal
places dec(dec表⽰⼩数位), the following applies for the value area: (-10^(2len -1) +1) /
(10^(+dec)) to (+10^(2len -1) -1) /(10^(+dec)) in steps of 10^(-dec). Values in between this
range are rounded off.
在计算过程中如果⼩数部分过长,则进⾏四舍五⼊
孕妇能吃芒果么
若⼩数部分超
过长度,则⾃
动按四舍五⼊
将多余的⼩数
除掉;如果整
数部分超过长
度,则系统运
⾏出错
如果值是⼩
截拳道创始人
数,则要将
值使⽤引号
引起来
X1~524,287 bytes 1 byte ⼗六进制字符 0-9, A-F具体的范围为:00~FF
类型X是⼗六进制类型,可表⽰内存字节实际内容,使⽤两个⼗六制字符表⽰⼀个字节中所
存储的内容。但直接打印输出时,输出的还是赋值时字⾯意义上的值,⽽不是Unicode解码后
的字符
如果未在 DATA 语句中指定参数<length>,则创建长度为 1⼗六进制的00
X1~524,287 bytes 1 byte如果未在 DATA 语句中指定参数<length>,则创建长度为 1
注:如果值是字母,则⼀定要⼤写,否则赋值不进
DATA: x2(2) TYPE x.
x2 = '3AA'.
WRITE : / x2."输出赋值时字⾯上的值:3AA0
⼗六进制的00
string不限定在系统内部,长度可变的内置类型(String、XString)是通过引⽤实际动态的数据对象
李大奇的固定内存地址来进⾏操作,因⽽这两种内置类型和引⽤类型⼀样,属于纵深类型。长度为0的空字符串''
xstring不限定由⼗六进制字符 0-9, A-F组成字符串。直接打印输出时,输出的还是赋值时字⾯意义上的值,
⽽不是Unicode解码后的字符串
注:如果值是字母,则⼀定要⼤写,否则赋值不进
DATA : xs TYPE xstring .
xs = '303132'."表⽰字符串 012
WRITE :/ xs."但输出的还是303132
长度为0的空
字符串''
b 1 Byte0 to 255属于ABAP内部类型,在ABAP程序中不能直接使⽤0
s 2 bytes-32.768 to +32.767属于ABAP内部类型,在ABAP程序中不能直接使⽤0
P类型(压缩型)数据
是⼀种压缩的定点数,其数据对象占据内存字节数和数值范围取定义时指定的整个数据⼤⼩和⼩数点后位数,如果不指定⼩数位,则将视为I类型。其有效数字位⼤⼩可以是从1~31位数字(⼩数点与正负号占⽤⼀个位置,半个字节),⼩数点后最多允许14个数字。
P类型的数据,可⽤于精确运算(这⾥的精确指的是存储中所存储的数据与定义时字⾯上所看到的⼤⼩相同,⽽不存在精度丢失问题——看到的就是内存中实实在在的⼤⼩)。在使⽤P类型时,要先选择程序属性中的选项Fixed point arithmetic(即定点算法,⼀般默认选中),否则系统将P类型看⽤整型。其效率低于I或F类型。
"16 * 2 = 32表⽰了整个字⾯意义上允许的最⼤字⾯个数,⽽14表⽰的是字⾯上⼩数点后⾯允许的最⼤⼩数位,⽽不是指14个字节,只有这⾥定义时的16才表⽰16个字节
DATA: p(16) TYPE p DECIMALS 14 VALUE '12345678901234567.89012345678901'.
"正负符号与⼩数点固定要占⽤半个字节,⼀个字⾯上位置,并包括在这16个字节⾥⾯。
"16 * 2 = 32位包括了⼩数点与在正负号在内
"在定义时字⾯上允许最长可以达到32位,除去⼩数点与符号需占半个字节以后
"有效数字位可允许31位,这31位中包括了整数位与⼩数位,再除去定义时⼩
"数位为14位外,整数位最多还可达到17位,所以下⾯最多只能是17个9
DATA: p1(16) TYPE p DECIMALS 14 VALUE '-99999999999999999'.
"P类型是以字符串来表⽰⼀个数的,与字符串不⼀样的是,P类型中的每个数字位只会占⽤4Bit位,所以两个数字位才会占⽤⼀个字节。另外,如果定义时没有指定⼩数位,表⽰是整型,但⼩数点固定要占⽤半个字节,所以不带⼩数位与符号的最⼤与最⼩整数如下(最多允许31个9,⽽不是32个)
DATA: p1(16) TYPE p VALUE'+9999999999999999999999999999999'.
DATA: p2(16) TYPE p VALUE'-9999999999999999999999999999999'.
其实P类型是以字符串形式来表⽰⼀个⼩数,这样才可以作到精确,就像Java中要表⽰⼀个精确的⼩数要使⽤BigDecimal⼀样,否则会丢失精度。
DATA: p(9) TYPE p DECIMALS 2 VALUE '-123456789012345.12'.
WRITE: / p."123456789012345.12-
DATA: f1 TYPE f VALUE '2.0',
f2 TYPE f VALUE '1.1',
f3 TYPE f.
f3 = f1 - f2."不能精确计算
"2.0000000000000000E+00 1.1000000000000001E+00 8.9999999999999991E-01
WRITE: / f1 , f2 , f3.
DATA: p1 TYPE p DECIMALS 1 VALUE '2.0',
p2 TYPE p DECIMALS 1 VALUE '1.1',
p3 TYPE p DECIMALS 1.
p3 = p1 - p2."能精确计算
"2.0 1.1 0.9
WRITE: / p1 , p2 , p3.
DATA: P TYPE P.
P = 1 / 3 * 3.
WRITE P.
如果未设置程序属性“定点算法”,则结果为 0,这是因为除法结果被内部取整为 0。
如果设置程序属性“定点算法”,则结果为 1,这是因为除法结果被内部存储 0.333333333333333333333333333333,精度达 31 位数字。
Java中精确计算:
publicstaticvoid main(String[] args) {
System.out.println(2.0 - 1.1);// 0.8999999999999999
宠物刺猬
System.out.println(sub(2.0, 0.1));// 1.9
}计算机学习
publicstaticdouble sub(double v1, double v2) {
BigDecimal b1 = new String(v1));
BigDecimal b2 = new String(v2));
return b1.subtract(b2).doubleValue();
}
ABAP数据类型继承图
下图中左边展⽰了ABAP类型的继承关系(黄⾊表⽰类型、灰⾊表⽰可⽣成相应的数据),右边为通⽤数据类型(但只⽤在formalparameters(形式参数)与field symbols字段符号,Data通⽤类型只可⽤于定义data references变量,object通⽤类型只可⽤于定义object references变量)。
character-type:text fields (c)、numeric text fields (n)、date fields (d)、and time fields (t)、text string (string),相应的通⽤类型为clike
numeric-type:Integer (i)、floating point numbers (f)、and packed numbers (p),相应的通⽤类型为numeric.
byte-type:Byte fields (x)、byte string (xstring),相应的通⽤类型为xquence.
Byte-type 与 Character-type
Byte-type :x or xstring.
Character-type :c, n, d, t, string或者是由纯的character-type类型字段组成的结构structure
通⽤类型
除了object,所有的通⽤类型都能直接⽤TYPE后⾯(如TYPE data,但没有TYPE object,object不能直接跟在TYPE后⾯,只能跟在TYPE REF TO后⾯)
TYPE REF TO 后⾯可接的通⽤类型只能是data(数据引⽤)或者是 object(对象引⽤)通⽤类型,其他通⽤类型不⾏:TYPE REF TO data :表⽰的是数据引⽤data references
TYPE REF TO object: 表⽰的是对象引⽤object references
ANY代表了除data、 object 任何数据类型
下表为ABAP预置的通⽤类型。ABAP数据类型继承图
Type Description
any table Internal table with any table type
hashed table
index table
sorted table
standard table
table Standard table
c Text fiel
d with a generic length
n with generic length
p Packed number with generic length and generic number of
x Byte field with generic length
C、N、P、X⽤在Form的形式参数中
clike Character-like (c, d, n, t, string, and character-like )
cquence Text-like (c, string)
xquence Byte-like (x, xstring)
numeric Numeric (i (b, s), p, decfloat16, decfloat34, f)
data Any data type
any Any data type
simple基础数据类型,以及只包含character-like扁平组件的数据结构
Elementary data type including structured types with exclusively character-like flat components
object Any object type (root class of the inheritance hierarchy继承层次结构)
字符类型C作为接⼝参数类型使⽤时,则传递的参数的长度可以是任意的,但如果采⽤C(XX)形式定义的,则传递进去的长度固定为XX。
如果字符符号定义成⼀般类型(通⽤类型)内表,则在使⽤时,你只能动态的访问各字段的名称:
TYPES: BEGIN OF line,
col1,
col2,
END OF line.
DATA: wa TYPE line,
itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1,
key(4) VALUE'col1'.
FIELD-SYMBOLS <fs> TYPE ANY TABLE.
wa-col1 = 'X'.
wa-col2 = 'Y'.
INSERT wa INTO TABLE itab.
ASSIGN itab TO <fs>.
CLEAR: wa.
READ TABLE <fs> WITH TABLE KEY(key) = 'X'INTO wa.
"编译会出错
*READ TABLE <fs> WITH TABLE KEY col1 = 'X' INTO wa.
WRITE:/ sy-subrc, wa-col1, wa-col2.
因为上⾯的字段符号为ANY TABLE,⾏的结构类型不明确,所以不能静态的指定⾏的字段名。如果上⾯将字段符号定义成ANY或什么都不写是写时,根本就不可以使⽤READ TABLE这样的语句,原因是在静态编译的情况下,根本不为会它指向的是⼀个内表。
当使⽤完全限定类型定义字段符号时,可以静态的使⽤技术属性。如,某个结构的组件元素、循环某个内表、创建某个对象(引⽤类型的字段符号):DATA: BEGIN OF line,
col1,
col2 VALUE'X',
END OF line.
FIELD-SYMBOLS <fs> LIKE line.
ASSIGN line TO <fs>.
MOVE <fs>-col2 TO <fs>-col1.大高加索山
WRITE: / <fs>-col1,<fs>-col2.