ABAP 数据类型

数据类型在 ABAP 程序中用于定义具体的变量类型。

基本数据类型

ABAP 基本数据类型是系统内部定义的数据类型。

Type Description Length Type Description Length
C 文本字段(字母数字字符) 定义时指定字符个数 I 整数(非整数会四舍五入) 4字节
N 数字文本字段(数字字符) 定义时指定字符个数 F 浮点类型 8字节
D 日期(YYYYMMDD) 8字符 P 组合数值类型(1-16) 定义时指定长度,小数位
T 时间(HHMMSS) 6字符 string 变长字符串 长度不固定
X 十六进制 定义时指定字节数 xstring 变长字节序列类型 长度不固定

本地数据类型

在 ABAP 程序中,使用 TYPES 定义本地数据类型。定义局部数据类型时可以使用基本数据类型、局部数据类型、全局数据类型。

TYPES: BEGIN OF str_demo,
    index TYPE i,
    matnr TYPE matnr,
    werks TYPE werks_d,
    message TYPE string,
  END OF str_demo.
DATA: demo TYPE str_dmeo.

全局数据类型

ABAP 数据字典数据类型和系统变量,无需声明可在系统中直接使用。

ABAP 变量

常用系统变量

系统变量表 SYST (ABAP System Fields)。ABAP 系统变量可供所有程序访问,字段值由运行时环境填充。

变量 描述 变量 描述
SY-UNAME 用户登录名 SY-TCODE 当前执行的事物码
SY-SUBRC 表示系统执行成功与否 SY-TMAXL 内表总行数
SY-REPID 当前程序名 SY-BATCH 程序是否后台 JOB 执行
SY-DATUM 当前系统日期 SY-HOST 服务器名称
SY-UZEIT 当前系统时间 SY-DYNNR 屏幕的编号
SY-INDEX DO-ENDDO 中是有效的 SY-DBCNT DB 操作处理过的表行号
SY-TABIX LOOP索引,Read内表索引 SY-LANGU 当前登陆的语言
SY-MSGID Message Class SY-MSGV1/2/3/4 Message Variable
SY-MSGTY Message Type SY-MSGNO Message Number
SPACE 空白字符串 SY-ZONLO 当前时区

自定义变量类型

可以使用 DATA 语句定义数据变量,变量名最长可定义 30 位,变量的类型可以是基本类型,局部类型,全局类型。

DATA var_name(len) TYPE var_type [VALUE value] [DECIMALS n].

参考字段定义变量:DATA <var1> like <var2>. & DATA <var1> TYPE <var2>.

  • 透明表、结构、数据字典:既是类型又是对象,可用 TYPE 和 LIKE
  • 只能使用 LIKE 引用另一自定义变量的类型,不可以使用 TYPE

DATA <var> LIKE LINE OF xxx.

  • 后面参照内表,表示该变量具有和参照内表一样的结构,可当做工作区使用

DATA <var> LIKE TABLE OF xxx.

  • 后面参照结构,表示该变量是一个和参照结构一样的内表,这个内表和后面参照的结构一样

使用 Type 和 Like 的区别

  • TYPE:在声明时直接将数据类型分配给数据对象。

  • LIKE:将另一个对象的数据类型分配给声明的数据对象。

  • Type 指的是现有数据类型,而 Like 指的是现有数据对象。

参考变量

声明引用变量的语法是:

DATA <ref> TYPE REF TO <type> VALUE IS INITIAL.

  • REF TO 附加声明一个引用变量
  • REF TO 之后的规范指定了引用变量的静态类型
  • 静态类型限制引用变量的对象集合
  • 引用变量的动态类型是它当前引用的数据类型或类
  • 静态类型总是更加通用或与动态类型相同
  • TYPE 添加用于创建绑定引用类型和起始值,并且只能在 VALUE 添加后指定 IS INITIAL

变量赋值

定义时赋值

定义变量时可以通过 VALUE 语句赋初始值。

  • 单引号 '’ 和 Grave `` 的区别:grave 能够识别字符串中包含的所有空格

程序中赋值

MOVE var1 TO var2. & WRITE var1 TO var2.

  • 变量 2 只能是字符串类型:C、N、D、T

MOVE-CORRESPONDING语句经常用于不同结构体之间赋值,其特点是找到名字相同的字段进行赋值。

定义常量、宏

常量定义

CONSTANTS var_name(len) TYPE <var_type> VALUE <value>.

CONSTANTS var_name(len) LIKE <var> VALUE <value>.

宏定义

如果需要在程序中多次重复使用同一组语句,可以将它们包含在宏中。最常使用的场景是 ALV 的字段目录构造。

  • 宏定义应在程序中使用宏之前发生
  • 宏是基于占位符设计的,宏定义中占位符的最大数量为 9
DEFINE <macro_name>. 
  <statements> 
END-OF-DEFINITION. 
<macro_name> [<param1> <param2>....].

ABAP 运算符&函数

二元运算符

ABAP 的操作符需要跟操作数之间至少一个空格分开。

运算符 描述 运算符 描述 运算符 描述 运算符 描述
+ 加法 * 乘法 ** 乘幂 MOD 取模,求余数
- 减法 / 除法 DIV 整除,忽略余数

逻辑运算符

运算符 描述 运算符 描述 运算符 描述
GE | >= 大于等于 LE | <= 小于等于 EQ | = 等于
GT | > 大于 LT | < 小于 NE | <> 不等于

函数使用

函数 描述 函数 描述
CEIL(N) 返回大于数值N的最小整数 TRUNC(N) 返回数值N的整数部分
FLOOR(N) 返回小于数值N的最大整数 FRAC(N) 返回数值N的小数部分
ABS(N) 求绝对值 SIGN(N) N>0 = 1;N<0 = -1;N=0=0

DESCRIBE 使用

DESCRIBE FIELD

对一个 Elementary data 的属性进行描述,可以通过这条语句知道某一个 data 的类型、长度、小数点、输出长度等信息。

DESCRIBE FIELD dobj 
  [TYPE typ [COMPONENTS com]] 
  [LENGTH ilen IN {BYTE|CHARACTER} MODE] 
  [DECIMALS dec] 
  [OUTPUT-LENGTH olen] 
  [HELP-ID hlp] 
  [EDIT MASK mask].

DESCRIBE TABLE

DESCRIBE TABLE itab [KIND knd] [LINES lin] [OCCURS n].

不同的选项返回表类型、行数、初始化大小。另外,系统字段 sy-tfillsy-tleng 保存着内表行数量和以字节计的表行长度。

KIND:T 标准表;S 排序表;H 哈希表

LINES:内表行数,返回值为 i 类型。可以使用函数 LINES(itab) 计算内表行数

OCCURS:内表所需要的初始化内存大小

DESCRIBE DISTANCE

DESCRIBE DISTANCE BETWEEN dobj1 AND dobj2 INTO dst IN {BYTE|CHARACTER} MODE.

  • dobj1 和 dobj2 两个变量地址起始位置的距离

SAP 编码

Character Encoding 是一个名称(“utf-8”、“iso-8859-1”等)和一个等价表,其中包含一组字符和每个字符的八位字节值。

Code Page 是 SAP 使用的名称,而不是 Character Encoding。 Code Page 有一个 4 位数字而不是字符名称。

两种类型数据的对应关系

  • 使用 FM:SCP_CODEPAGE_BY_EXTERNAL_NAME 获取国际字符编码对应的 SAP Code Page
  • 在表 TCP00A 中查找对应关系
SAP code page Character encoding international name
124 IBM EBCDIC 00697/00297
1100 ISO-8859-1
1105 US-ASCII (7 bits)
1160 windows-1252
4102 UTF-16BE
4103 UTF-16LE
4110 UTF-8
8000 Shift-JIS
8300 BIG5

编码转换

SAP 提供 CCC 转换器程序将字符从一种编码转换为另一种编码。

FM SCP_TRANSLATE_CHARS ,适用于所有版本。

CL_ABAP_CODEPAGE 类,从 7.02 开始可用。 代码页不能是 SAP 编号,它必须是“字符编码国际名称”或 java 语言中使用的名称。

CL_ABAP_CONV_* 类,从 6.10 开始,其中 CL_ABAP_CONV_OBJ 是主类,可以完全访问 CCC 转换器。

  • CL_ABAP_CONV_IN_CE:将表示给定代码页中字符的字节转换为字符或字符串变量
  • CL_ABAP_CONV_OUT_CE:将字符或字符串变量转换为表示给定代码页中字符的字节