ABAP中除了简单类型之外,用户还可以在程序中定义结构体类型,将相同性质的字段进行归类,便于整理及操作。结构体不属于数据字典对象,在程序运行时会被作为临时对象创建。
语法:
TYPES|DATA:BEGIN OF STRUCTURE,
k1[TYPE type]|[LIKE obj]...,
k2[TYPE type]|[LIKE obj]...,
......
kn[TYPE type]|[LIKE obj]...,
END OF STRUCTURE.
或: TYPES|DATA STRUCTURE TYPE str_type|LIKE str_dob.
例如一个职员的信息如下:
DATA:BEGIN OF USERINFO
SID TYPE STRING,
NAME TYPE STRING,
TEL(20) TYPE C,
END OF USERINFO.
这样就定义好一个职员结构,ABAP中可以使用语句<Structure>-<fieldname>进行操作指字的字段(在.ENT或是JAVA中都是用操作符".",而ABAP却是用"-",开始用时真有点习惯,呵)。
USERINFO-SID = 'A20013'.
USERINFO-NAME = 'KEN'.
USERINFO-TEL = 'XXX'.
用语句链输出:
WRITE:USERINFO-SID,USERINFO-NAME,USERINFO-TEL.
*输出结果:A20013 KEN XXX
结构体语法操作灵活,能够直接参考其它类型结构体来新建:
DATA:EMPLOYEE LIKE USERINFO.
EMPLOYEE-SID = 'FLY647';
EMPLOYEE-NAME = 'SUPER'.
EMPLOYEE-TEL = 'SXXX'.
用语句链输出:
WRITE:EMPLOYEE-SID,EMOLOYEE-NAME,EMPLOYEE-TEL.
*输出结果:FLY647 SUPER SXXX
当然还有另外一种定义结构用TYPES关键字,笔者觉得用TYPES定义的更为灵活,就像是定义一个类一样。
TYPES:BEGIN OF PERSON,
nameTYPE STRING,
sex(1) TYPE C,
age TYPE I,
END OF PERSON.
实例化对象:
DATA p1 TYPE PERSON.
p1-name = 'Obama'.
p1-sex = 'Male'.
p1-age = '50'.
用语句链输出:
WRITE:p1-name,p1-sex,p1-age.
*输出结果:Obama Male 50
这样你可以多定义几个对象,而用DATA定义的结构在内存中只能存在一次,没有TYPES定义的灵活(本人经验有限,如果有不正确的地方欢迎指出)。
接下来是介绍ABAP中结构的继承功能,通过参照某个已存在的结构体来创建一个属性相同的新结构体,并且可以在新建的结构体中按实际需求增加字段。定义结构体继承的具体语句为:INCLUDE STRUCTURE。参照上文中的UISERINFO结构来新建继承新的结构。
DATA:BEGIN OF STAFFINFO. <此处是.操作符>
INCLUDE STRUCTURE USERINFO.
DATA:BIRTHDAY TYPE D,
ADDRESS(50) TYPE C,
END OF STAFFINFO.
这样就完成了继承关系。
STAFFINFO-SID = 'SKY001'.
STAFFINFO-NAME = 'SKY'.
STAFFINFO-TEL = '010XXX'.
STAFFINFO-BIRTHDAY = '2012-03-11'.
STAFFINFO-ADDRESS = 'BEIJING'.
WRITE:STAFFINFO-SID,STAFFINFO-NAME,STAFFINFO-TEL,STAFFINFO-BIRTHDAY,STAFFINFO-ADDRESS.
*输出结果:SKY001 SKY 010XXX 2012-03-11 BEIJING.
与变量的定义类似,结构体的初始化通过语句CLEAR来实现.
总结:
用DATA关键字定义的结构可以实现继承关系,而TYPES关键字定义的结构则不可以实现,在实际的编码过程中还是按具体要求做取舍。
(由于本人经验有限,可能有很多遗漏或者错误的地方,也欢迎高手们提出,这也的我成长的来源,THANKS)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端