ABAP数据类型总结
- ABAP:Advanced Business Application programming 高级商务应用编程语言。
- ABAP程序中有数据类型和数据变量:
-
数据类型(Data Type):定义程序中可以使用的数据类型
数据类型在ABAP程序中用于定义变量类型。数据类型和数据对象是单独声明的,数据对象则参照数据类型定义。在程序中利用TYPES语句声明数据类型,这种数据类型只能在该程序中使用,因此也称为本地数据类型。
本地数据类型参照已有的ABAP数据类型进行声明。从数据类型层面考虑,ABAP程序的特点是可以参照ABAP数据字典自身的数据类型定义变量,这种特征便于开发者编程。 -
数据变量(Data Variable):参照数据类型定义的、可以存储值的变量。
数据变量(Data variable)是在程序中参照数据类型定义的值。在ABAP程序中最常用的方法是用Data语句定义变量,变量名包括“_”,最长可以定义30位。
-
数据类型(Data Type):定义程序中可以使用的数据类型
数据对象:前面所定义的变量实际是指数据对象,所谓的数据对象只有在程序执行期间占用内存物理地址。ABAP语句首先利用数据对象名称确认地址,然后根据参照数据类型的字段长度及小数位等信息解析内容。数据对象里存在没有固定名称的类型。
ABAP程序包含三种数据类型:
数据类型层次结构1. 标准数据类型
ABAP基本数据类型是系统内部定义的数据类型,可以分为完整的和非完整的。
a. 完整的数据类型
- 完整的数据类型指它包含了与类型相关的固定长度的信息。
- D:日期类型,格式为YYYYMMDD,长度为8。
- T:时间类型,格式为HHMMSS,长度为6。
日期和时间,分属不同类型,分别是 D 和 T ,然后在显示时,字符间中间不带任何格式符;
例如,日期:20140224,时间:120535。
- I:整数类型,长度为4。
只支持整数类型,非整数型数据会进行四舍五入(Round)。
用于计算行数,,条目数,索引值等。 - F:浮点类型,长度为8 。
用于定义指数(exponent),因此需要调用“FLTP_CHAR_CONVERSION”函数把其类型转换成其他数据类型后才可以输出。
数值较大或者不需要进行四舍五入时可以使用类型F。 - string:变长字符串类型。
- xstring:变长字节序列类型。
b. 非完整的数据类型
- 非完整的数据类型指他所对应的变量长度是在数据对象定义时指定的。
-
N:数字字符串类型,定义变量时指定数值字符个数。
-
C:字符串类型,定义变量时指定字符个数。
C 和 N 为字符类型,C用于定义文字、数字、特殊文字,
N用于显示C类型数字,以字符串形式显示整数。 -
X:字节序列类型,定义变量时指定字节数。
-
P:组合数值类型,定义变量时指定长度和小数点后位数。
P的精确度比 F 高,用 P 类型频率会比 F 类型高。
P类型可用长度为1~16,小数位最大长度为14位
-
类型F、I更接近于机器代码,因此执行演算时类型F、I比P速度块(差异不明显)
字符串类型分为4中:C、N、D、T
C:默认大小(1),初始值(space)
N:默认大小(1),初始值('00…0')
P:默认大小(8),初始值(0)
F:默认大小(8),初始值(0)
I:默认大小(4),初始值(0)
D:默认大小(8),初始值('00000000')
string:默认大小(变长),初始值('')
2. 本地数据类型
- 本地数据类型(局部数据类型):存在于程序内部
- 在ABAP程序中,用ABAP基本数据类型定义局部数据类型。另外,还可以定义包含多个ABAP基本数据类型的结构体类型,但是他们只能作为当前程序的增强,这些定义用types语句来实现。
TYPES: BEGIN OF STU,
NAME(10) TYPE C,
AGE TYPE I,
SEX TYPR C,
END OF STU.
DATA: LISI TYPE STU.
LISI-NAME = '李四'.
LISI-AGE = 20.
LISI-SEX = 'BOY'.
WRITE:/ LISI.
3. 全局数据类型
- ABAP数据字典数据类型:在ABAP字典中定义的类型,可以在整个SAP系统中使用。系统定义的数据对象无需声明,可在程序中直接使用。
- 系统中有定义一些专有名词,如:
- SY-SUBRC:系统执行传回值,0表示成功
- SY-UNAME:当前系统登录的登录名
- ST-TCODE: 当前事务
- SY-DATUM:当前系统日期
- SY-UZEIT:当前系统时间
- SY-REPID:当前程序名
- SY-COLNO:当前列
- SY-LINNO:当前行
- SPACE:空白字符串
更多系统数据参见数据表SYST
全局数据类型详细内容:https://www.jianshu.com/p/402f9c79f64f
4. DATA语句
- DATA语句用于定义数据变量。变量名包括“_”,最长可以定义30位。
TYPE type
- 定义变量的数据类型。ABAP基本数据类型、局部数据类型、全局数据类型都可以用于TYPE语句后
DATA:gv_num TYPE i.
多次执行相同命令时使用冒号可以避免反复使用相同命令的现象。如下:
DATA gv_num1 TYPEⅠ, DATA:gv_num1 TYPEⅠ,
DATA gv_num2 TYPEⅠ. gv_num2 TYPEⅠ.
LIKE num
- 定义与前一个变量gv_num1相同类型的变量时使用该语句。num可以是任何一种数据类型变量(字段、参数、结构体、系统变量等)。
DATA:gv_num3 LIKE gv_num1.
VALUE int
- 所有数据类型都存在初始值。DATA语句中可以使用VALUE选项设置初始值int。如果使用VALUE IS INITIAL语句,则变量的初始值为所参照的数据类型的初始值(此语句可以省略,其结果相同),但是定义固定值时一定要使用VALUE语句定义其初始值。
DATA:gv_num TYPE i VALUE123
gv_flag VALUE 'X'
gv_val VALUE IS INITIAL,
gv_idx LIKE sy-tabix VAlUE 45
LENGTN n
- LENGTH n用于指定字段长度,但只能适用于C、N、P、X类型即非完整性数据类型。
DATA:gv_num TYPE n LENGTH 2.
DECIMALS n
- DECIMALS n用于指定1~14位小数,只适用于数据类型P。
DATA:gv_num TYPE p DECIMALS 3.
5. 变量
- 通常用data语句来定义数据对象。
- 数据对象的类型可以是基本类型,本地类型或全局类型。
- 实际开发中更多的是参考现有的数据对象(LIKE)
- 如果DATA语句没有指定TYPE,则默认为C类型
-
如果非完整类型没有指定长度,则使用默认长度
例:DATA myvar TYPE n. 定义一个长度为1的数字串类型变量
定义全局变量
- 全局变量(Global Variable):是指在一个程序或函数内可以访问的数据类型。在程序内部的所有领域里都可以参照并修改,因此没有局限性。在程序激活状态下全局变量一直占用着内存地址。定义全局变量时变量名以G开头。
定义局部变量
- 局部变量(Local Variable):只有在程序模块内部有效的变量。
-
模块:指函数、子程序等为了实现单位功能集合成块的代码。局部变量定义方法如下:
局部变量定义
6. 赋值
a. 给变量赋值
- 在ABAP/4中定义变量或处理实际数据时会给变量赋值。定义变量时可以通过VALUE语句赋初始值,实际处理数据的程序中使用MOVE num1 TO num2 或 WRITE num1 TO num2 (变量2只能是字符串:N,C,D,T)语句给变量赋值。
MOVE var1 TO var2. 将var1的值存至变量var2,也可以写成下列方式
var2 = var1.
如果var1和var2的数据类型不同,就存在类型冲突的可能性,这时候如果存在转换规则,则会进行自动类型转换。
MOVE-CORRESPONDING<STRING1>TO<STRING2>.
WRITE<f1>TO<f2>[<option>].
*CORRESPONDING:相当的,相应的,一致的
- MOVE TO语句与<f2> = <f1>.中的Equal(=)语句相同。
- 复制字符串字段值时可以使用MOVE-CORRESPONDING语句,这时<string1>和<string2>的字段名可以不相同。
MOVE-CORRESPONDING语句还经常用于不同结构体之间赋值,其特点是找到名字相同的字段名进行赋值。 - 当字段名及顺序不同的结构体之间相互赋值时,如果用MOVE语句,则会按顺序进行赋值,因此要使用MOVE-CORRESPONDING语句。
- MOVE语句还可以用于类型转换,即<f1>的数据类型会转换成<f2>类型。
- 在ABAP语言中除了类型D(Date)与类型T(Time)外都可以互相转换类型,一共有64种形态可以互相转换。
- WRITE语句主要有两种用法,一种是输出报表,另一种是变量赋值。
- 变量赋值时一般用WRITE TO语句,将数据对象<f1>的值转换成类型C后赋值给<f2>。前提条件是<f1>类型是可以转换成C类型的字段,否则会发生Syntax或runtime error的错误。
- 后面<option>里可以使用除了UNDER和NO-GAP以外的所有编辑格式选项。关于<option>具体参数可以在HELP中查询。
b. 利用Offset进行赋值
利用Offsets and Lengths 可以给部分字段赋值
从f1字段的p1+1位开始截取长度位11的字符串赋值给f2字段的从p2+1位开始截取长度位12的字符串的写法。
MOVE<f1>[+<p1>][(<11>)]TO<f2>[+<p2>][(<12>)].
c. 结构体之间的计算操作
结构体之间赋值用MOVE-CORRESPONDING语句,利用下面语句可以进行结构体之间的计算操作。
ADD-CORRESPONDING
SUBTRACT-CORRESPONDING
MULTIPLY-CORRESPONDING
DIVIDE-CORRESPONDING
CLEAR语句根据类型清除数据对象,恢复成默认值。
7. 运算符及函数
a. 算术符号
ABAP程序中,数学表达式可以进行任意多层嵌套
(20 + 10) * 10 + 10 / 2.
- 二元操作符包括:
- +:加法
- -:减法
- *:乘法
- /:除法
- **:乘幂
- DIV:整除忽略余数
- MOD:取模 (求余函数)
- 圆括号和操作符都是关键字,需要跟操作数之间至少一个空格分开
b. 数值函数
- ABS(N):传回数值N的绝对值
- SIGN(N):1 (N > 0 时);0(N = 0 时);-1(N < 0 时)
- CEIL(N):传回大于数值N的最小整数
例:WRITE CEIL(-5.65) =》-5.00
WRITE CEIL(4.54) =》 5.00
- FLOOR(N):传回小于数值N的最大整数
例:WRITE CEIL(-5.65) =》-6.00
WRITE CEIL(4.54) =》 4.00
-
TRUNC(N):传回数值N的整数部分
WRITE TRUNC(5.65) =》 5.00
-
FRAC(N):传回数值N的小数部分
WRITE FRAC(5.65) =》 0.65
-
FRAC(N):取得小数部分
WRITE FRAC(‘2.9’)=》0.9
- COS(A),SIN(A),TAN(A):三角函数cosA,sinA,tanA的值,A为弧度值。
c. Floating-Point 函数:
Floating Point函数8. 其他变量的定义
https://www.jianshu.com/p/191030c21ffc
- 固定数据对象有一个固定值,在运行时不能改变。文字和常数都属于固定数据对象。
- 文字是在程序里面写的固定值,可以分为数值文字(不使用单引号)和字符文字(用单引号括起来)。
数值文字:123、-123、……
字符文字:‘Hello’、‘123.234’、‘123.13E02’
- 可以使用constants语句来定义常数,TYPE的指定方法跟基本数据对象一致,而VALUE则是必须的,用来赋值。
CONSTANTS myvar1 TYPE tname VALUE{文字 | IS INITIAL}
- 如果可能的话,尽量减少使用文字,而多用常数,这样可以给程序维护带来很大的便利。
附:
1. 命名程序规则
- 使用至少 1 个但不超过 8 个字符。
- SAP规定创建ABAP数据字典的程序及数据对象后命名时,要以Z或Y开头且不能使用关键字。ABAP程序中允许定义的变量名最大长度为30位,其中包含”_“符号。
2. 数据类型和对象
数据类型和对象主要特征的概述:
- 数据类型(基本的或结构化的)
- 数据类型是纯粹的说明。
- 没有与数据类型相关联的内存。
- 数据类型描述数据对象的技术属性。
- 数据类型是数据对象的属性并与数据对象联系紧密。
- 数据对象(文字、变量、常量等):
- 数据对象是程序在运行时使用的物理单元。
- 每个数据对象都有分配给它的特定数据类型。
- 每个数据对象占据一些内存空间。
- ABAP/4 根据数据对象的数据类型处理数据对象。
3. 单引号 ' 和 grave ` 的去别
- grave `:能够识别字符串中包含的所有空格。