此概念与C/C++中的结构体相似,它们都用于定义包含多个不同数据类型字段的复合数据类型。
但是在取结构体中的某一个值的时候不是用“.”,而是用“-”。
一、结构体的定义
1、常量的结构体:
结构体中的每一个常量都需要赋一个默认值。
CONSTANTS : BEGIN OF cs_info,
name TYPE C LENGTH 3 VALUE 'VIA',
age TYPE I VALUE 5,
bir TYPE D VALUE '20241105',
msg TYPE String VALUE '当用常量结构体时,每个值都需要赋一个默认值',
END OF cs_info.
ULINE.
WRITE : / '姓名',cs_info-name,/
'年龄',cs_info-age,/
'生日',cs_info-bir,/
'信息',cs_info-msg.
此段代码运行结果显示:
2、变量的结构体:
a、先定义一个结构体类型,再定义一个结构体,它的类型是先前所定义的结构体类型,注意这里使用的关键字是TYPE不是LIKE,因为之前定义的是类型!!!本段代码只产生了一个结构体。
*定义,这里定义的是一个结构体类型,而不是一个结构体,所以不能对其中变量赋值*
TYPES : BEGIN OF ty_info,
name TYPE C LENGTH 8,
age TYPE I,
bir TYPE D,
msg TYPE String,
END OF ty_info.
*使用,区别为是用 - 来表示结构体中的变量而不是.*
*使用的是TYPE+定义的结构体类型*
DATA ls_info TYPE ty_info.
ls_info-name = 'VIA'.
ls_info-age = 23.
ls_info-bir = '22221122'.
ls_info-msg = '这是对VIA的描述'.
WRITE : '姓名',ls_info-name,/
'年龄',ls_info-age,/
'生日',ls_info-bir,/
'信息',ls_info-msg.
此段代码运行结果显示:
b、定义一个结构体,之后若其他的结构体需要和该结构体结构相同,使用关键字LIKE。本段代码产生了两个结构体。
*定义,类似于C的结构体*
DATA : BEGIN OF lv_info,
name TYPE C LENGTH 8,
age TYPE I,
bir TYPE D,
msg TYPE String,
END OF lv_info.
*因为本身定义的就是一个结构体,所以可以直接对其中变量赋值*
lv_info-name = 'Soobin'.
lv_info-age = 24.
lv_info-bir = '20001205'.
lv_info-msg = '这是对Soobin的描述'.
WRITE : '姓名',lv_info-name,/
'年龄',lv_info-age,/
'生日',lv_info-bir,/
'信息',lv_info-msg.
*因为之前定义的是一个结构体不是类型,所以这里需要用关键字LIKE,而不是TYPE*
DATA lv_info2 LIKE lv_info.
lv_info2-name = 'Libra'.
lv_info2-age = 23.
lv_info2-bir = '20010426'.
lv_info2-msg = '这是对Libra的描述'.
ULINE.
WRITE : '姓名',lv_info2-name,/
'年龄',lv_info2-age,/
'生日',lv_info2-bir,/
'信息',lv_info2-msg.
此段代码运行结果显示:
二、结构体的赋值
1、结构体按照字段逐个来赋值。
通过 结构体-字段名 = 值,来进行赋值操作。代码演示:
DATA : BEGIN OF lv_info,
name TYPE C LENGTH 8,
age TYPE I,
bir TYPE D,
msg TYPE String,
END OF lv_info.
*通过=对于结构体中的每个字段进行赋值*
lv_info-name = 'Soobin'.
lv_info-age = 24.
lv_info-bir = '20001205'.
lv_info-msg = '这是对Soobin的描述'.
WRITE : '姓名',lv_info-name,/
'年龄',lv_info-age,/
'生日',lv_info-bir,/
'信息',lv_info-msg.
此段代码运行结果显示:
2、可以通过“=”另一个结构体来进行赋值。
首先定义一个结构体类型ty_info。包含姓名、年龄、生日、描述信息。后续的代码中的结构体类型均为此类型定义。
TYPES : BEGIN OF ty_info,
name TYPE c LENGTH 8,
age TYPE i,
bir TYPE d,
msg TYPE String,
END OF ty_info.
先定义person1、person2、person3、person4四个人,且对第一个人Via的各字段进行等号赋值。 代码如下。
DATA: person1 TYPE ty_info,
person2 TYPE ty_info,
person3 TYPE ty_info,
person4 TYPE ty_info.
person1-name = 'VIA'.
person1-age = 23.
person1-bir = '22221122'.
person1-msg = '这是对VIA的描述'.
下面这段代码直接用person2 = person1,查看结果。
ULINE.
person2 = person1."使用 = 进行赋值
WRITE : '用等号给第二个人赋值第一个人的信息。第二个人:',/
'姓名',person2-name,/
'年龄',person2-age,/
'生日',person2-bir,/
'信息',person2-msg.
代码执行结果如下,发现也会按照字段顺序进行赋值。
3、可以MOVE A结构体 TO B结构体来对B结构体赋值。
下面这段代码使用 MOVE person1 TO person3,对person3进行赋值。
ULINE.
MOVE person1 TO person3."使用move-to进行赋值
WRITE : '用MOVE TO给第三个人赋值第一个人的信息。第三个人:',/
'姓名',person3-name,/
'年龄',person3-age,/
'生日',person3-bir,/
'信息',person3-msg.
代码执行结果如下,也会按照字段顺序进行赋值。
4、可以用MOVE-CORRESPONDING A结构体 TO B结构体来对B结构体赋值。
下面这段代码使用 MOVE-CORRESPONDING person1 TO person4,对person4进行赋值。
ULINE.
MOVE-CORRESPONDING person1 TO person4.
WRITE : '用MOVE-CORRESPONDING TO给第四个人赋值第一个人的信息。第四个人:',/
'姓名',person4-name,/
'年龄',person4-age,/
'生日',person4-bir,/
'信息',person4-msg.
代码执行结果如下,也会按照字段顺序进行赋值。
5、区别
因为1、2、3、4四个人类型都是相同的,他们的字段名称、字段类型完全一致,以上三种结构体赋值方法都可以达到目的,但是如果结构体并不完全相同的时候呢?这里定义第五个人person5,并对前两个字段名称进行了更改。还对他赋初值。
DATA : BEGIN OF person5,
personname TYPE c LENGTH 8,
personage TYPE i,
bir TYPE d,
msg TYPE String,
END OF person5.
person5-personname = 'Libra'.
person5-personage = 24.
person5-bir = '20010426'.
person5-msg = '这是对Libra的描述'.
a、当我们用MOVE-TO或者“=”的时候来看看效果。
ULINE.
MOVE person1 TO person5.
WRITE : '用MOVE TO给第五个人赋值第一个人的信息,其中name、age变量名称不相同。第五个人:',/
'姓名',person5-personname,/
'年龄',person5-personage,/
'生日',person5-bir,/
'信息',person5-msg.
根据下图结果可以看到,虽然字段名称进行了更改(类型不变),仍然会按照顺序进行赋值。使用“=”效果一致,可以自行尝试。
b、若使用 MOVE-CORRESPONDING-TO的话。
**MOVE-CORRESPONDING TO会找到两个结构体里面名称相同的变量进行匹配相等*
ULINE.
MOVE-CORRESPONDING person1 TO person5.
WRITE : '用MOVE-CORRESPONDING TO给第五个人赋值第一个人的信息,其中name、age变量名称不相同。第五个人:',/
'姓名',person5-personname,/
'年龄',person5-personage,/
'生日',person5-bir,/
'信息',person5-msg.
结果如下,可以发现当字段名称不同的时候,不会进行更改, MOVE-CORRESPONDING-TO会找到字段名称相同的字段对其进行覆盖。
c、如果不仅仅是字段名称不同,连字段类型都不同的时候呢?
我们将person5定义时候的字段顺序打乱,和之前所定义的结构体ty_info的顺序下来的各个字段的类型都不相同。尝试运行查看结果。
DATA : BEGIN OF person5,
bir TYPE d,
personname TYPE c LENGTH 8,
personage TYPE i,
msg TYPE String,
END OF person5.
person5-personname = 'Libra'.
person5-personage = 24.
person5-bir = '20010426'.
person5-msg = '这是对Libra的描述'.
1)如果用MOVE-TO或者“=”进行赋值。
ULINE.
MOVE person1 TO person5.
WRITE : '用MOVE TO给第五个人赋值第一个人的信息,其中name、age变量名称不相同,且修改了类型顺序。第五个人:',/
'姓名',person5-personname,/
'年龄',person5-personage,/
'生日',person5-bir,/
'信息',person5-msg.
执行之后会报错。 提示类型无法转换,所以当字段类型不能一一匹配的时候,MOVE-TO和“=”无法进行赋值操作。
2)如果用 MOVE-CORRESPONDING-TO进行赋值。
MOVE-CORRESPONDING person1 TO person5.
WRITE : '用MOVE-CORRESPONDING TO给第五个人赋值第一个人的信息,其中name、age变量名称不相同,且修改了类型顺序。第五个人:',/
'姓名',person5-personname,/
'年龄',person5-personage,/
'生日',person5-bir,/
'信息',person5-msg.
可以看到仍然会根据字段名称进行赋值,效果与类型一一匹配时相同。