数据类型和数据对象
在ABAP语句中,使用变量之前,必须针对变量进行声明。声明过程中
及到以下两个概念:
数据类型
- 数据类型描述了数据对象的技术属性(类型和长度),用于定义数据,对象本身不能被直接引用或赋值
- 数据元素(DataElement):用于定义一个的字段类型的变量
- 结构体(Structure):用于定义一个内存中的结构体变量
- 内表类型(TableType):用于定义一个内存中的内表
- 数据类型的使用场合
数据对象
- 数据对象(如文本、变量、常量)
- DATA 关键字用来声明的变量或者实体结构具有实际的内存空间
变量
参照数据类型
DATA GV_DATA TYPE DATATYPE
GV_DATA是变量名,DATATYPE是数据类型
- 数据类型的分类
1.全局类型(SE11)
数据元素的声明
DATA GV_SEX TYPE ZSEX_JSM.
DATA GV_WEIGH TYPE ZSTUDENT_JSM_01-WEIGH.
GV_SEX = 'F'.
结构体的声明
结构类型属于一种复杂类型,由多个数据元素组成,参照结构类生成的数据对象称为结构体。
使用TYPES和DATA语句构造内部的结构体的语法格式如下:
TYPES/DATA: BEGIN OF structure,
field1 [TYPE type/LlKE dobj],
field2 [TYPE type/LIKE dobj],
...
fieldn [TYPE type|LlKE dobj],
END OF structure.
Structure:结构名称
Field:字段名称
Type:数据类型
Dobj:数据对象
- 可以使用符号-访问结构体对象的组件:structure-field
- TABLES语句,声明一个和数据库表名称完相同的结构
*结构体类型的声明
DATA GS_SCHOOL TYPE ZSCHOOL_JSM_STR_01.
DATA GS_SCHOOL2 TYPE ZSCHOOL_JSM_STR_01.
GS_SCHOOL-ZSCHOOL = '101'.
GS_SCHOOL-ZSNAME = '清华'.
GS_SCHOOL-ZADD = '北京'.
*如果A和B的结构完全相同,可以使用MOVE-CORRESPONDING A TO B 将A的值赋给B
MOVE-CORRESPONDING GS_SCHOOL TO GS_SCHOOL2.
在局部类型/对象的声明中,所有类型都可以进行参照,因此ABAP中存在结构的嵌套。
*定义嵌套的结构
TYPES: BEGIN OF GTY_SCHOOL1,
SID TYPE ZSCHOOL_JSM_STR_01,"ZSCHOOL_JSM_STR_01是结构体
ZSCHOOL TYPE ZSCHOOL_JSM_01-ZSCHOOL,
ZSNAME TYPE ZSCHOOL_JSM_01-ZSNAME,
ZADD TYPE ZSCHOOL_JSM_01-ZADD,
END OF GTY_SCHOOL1.
DATA GS_SCHOOL3 TYPE GTY_SCHOOL1.
MOVE GS_SCHOOL TO GS_SCHOOL3.
*结构复用
TYPES BEGIN OF GTY_SCHOOL2.
INCLUDE STRUCTURE ZSCHOOL_JSM_01."包含结构INCLUDE和TYPE一个层级,所有前面不能使用TYPE关键字
TYPES: FLAG TYPE C LENGTH 1,
END OF GTY_SCHOOL2.
DATA GS_SCHOOL4 TYPE GTY_SCHOOL2.
表类型的声明
表类型是ABAP中的另外一种复杂类型,该类型的数据对象称为内表。表类型跟结构化类型相似。内表所占的内存不能在定义时确定,它会随着数据的增加不断的扩充它所需要的内存。
在程序中,内表可以通过TYPE/DATA语句中的Table of附加项进行构造:
TYPES |DATA: itab TYPE|LIKE tabkind OF linetype [WITH KEY] [INITIAL SIZE n].
Itab:内表名称
Tabkind:表类型(标准
表,排序表,哈希表)
Linetype:行类型
Initial size n:如果n为0或者不指定的话,程序会为内表分配初始化为8K大小的内存。当内表在使用过程中超过了这个内存的时候会自动增加内存.
* 内表 INTERNAL TABLE
TYPES GTY_SCHOOL_T TYPE TABLE OF ZSCHOOL_JSM_STR_01."参照结构体类型
DATA GT_SCHOOL TYPE GTY_SCHOOL_T.
TYPES GTY_SCHOOL_T2 TYPE ZSCHOOL_JSM_TTY_01."参照表结构类型
DATA GT_SCHOOL_2 TYPE TABLE OF ZSCHOOL_JSM_STR_01 INITIAL SIZE 0.
DATA: BEGIN OF GT_SCHOOL_D OCCURS 0,
SID TYPE ZSCHOOL_JSM_STR_01,
ZSCHOOL TYPE ZSCHOOL_JSM_01-ZSCHOOL,
ZSNAME TYPE ZSCHOOL_JSM_01-ZSNAME,
ZADD TYPE ZSCHOOL_JSM_01-ZADD,
END OF GT_SCHOOL_D.
GS_SCHOOL-ZSCHOOL = '101'.
GS_SCHOOL-ZSNAME = '清华'.
GS_SCHOOL-ZADD = '北京'.
APPEND GS_SCHOOL TO GT_SCHOOL_D.
GS_SCHOOL-ZSCHOOL = '101'.
GS_SCHOOL-ZSNAME = '清华'.
GS_SCHOOL-ZADD = '北京'.
APPEND GS_SCHOOL TO GT_SCHOOL_D.
READ TABLE GT_SCHOOL INTO GS_SCHOOL INDEX 1.
DATA: BEGIN OF GS_SCHOOL_ABC,
SID TYPE GTY_SCHOOL_T,"内表类型的字段
ZSCHOOL TYPE ZSCHOOL_JSM_01-ZSCHOOL,
ZSNAME TYPE ZSCHOOL_JSM_01-ZSNAME,
ZADD TYPE ZSCHOOL_JSM_01-ZADD,
END OF GS_SCHOOL_ABC.
GS_SCHOOL_ABC-ZSCHOOL = '100'.
CLEAR GS_SCHOOL.
GS_SCHOOL-ZSCHOOL = '101'.
GS_SCHOOL-ZSNAME = '清华'.
GS_SCHOOL-ZADD = '北京'.
APPEND GS_SCHOOL TO GS_SCHOOL_ABC-SID."从结构赋给内表
GS_SCHOOL_ABC-SID[] = GT_SCHOOL[]."和内表相对应的结构体,又叫做工作区
*参照结构体类型声明的带有表头行的内表
DATA GT_SCHOOL_H TYPE TABLE OF ZSCHOOL_JSM_STR_01 WITH HEADER LINE.
CLEAR: GT_SCHOOL_H,GT_SCHOOL_H[]."清空表头行和表体
GT_SCHOOL_H-ZSCHOOL = '101'.
GT_SCHOOL_H-ZSNAME = 'ABC'.
APPEND GT_SCHOOL_H."将表头行的数据插入表体
CONSTANTS C_CHAR TYPE C LENGTH 10 VALUE 'ABC'."声明一个常量
CLEAR: GT_SCHOOL_H."清空表头行
GT_SCHOOL_H-ZSCHOOL = '101'.
GT_SCHOOL_H-ZSNAME = C_CHAR.
APPEND GT_SCHOOL_H.
*此时内表中有两条数据
2.标准类型
- 标准数据类型
注意:LENGTH在声明变量时只可用于C,N,X,P类型
* 创建变量
DATA GV_CHAR TYPE C LENGTH 10 VALUE 'CHAR123'.
DATA GV_NUMC TYPE N LENGTH 10 VALUE '123'.
DATA GV_DEC TYPE P LENGTH 10 VALUE '3.14'.
DATA GV_DATE1 TYPE D VALUE '20241106'.
DATA GV_DATE2 TYPE D VALUE '20241105'.
DATA GV_INT TYPE I .
DATA GV_TIME TYPE T VALUE '120834'.
3.本地类型(在程序中使用TYPES关键字自定义的数据类型)
TYPES GTY_CHAR01 TYPE C LENGTH 3."声明数据类型
DATA GV_CHAR01 TYPE GTY_CHAR01."声明对象
参照数据对象
DATA GV_DATA2 LIKE GV_DATA1.
*创建和GS_SCHOOL5结构相同的变量
DATA: BEGIN OF GS_SCHOOL5,
SID TYPE ZSCHOOL_JSM_STR_01,
ZSCHOOL TYPE ZSCHOOL_JSM_01-ZSCHOOL,
ZSNAME TYPE ZSCHOOL_JSM_01-ZSNAME,
ZADD TYPE ZSCHOOL_JSM_01-ZADD,
END OF GS_SCHOOL5.
DATA GS_SCHOOL6 LIKE GS_SCHOOL5.