ABAP 结构体

 此概念与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.

可以看到仍然会根据字段名称进行赋值,效果与类型一一匹配时相同。 

 6、总结

a、当字段名称以及类型按顺序都匹配的时候,用“=”、“MOVE-TO”和“MOVE-CORRESPONDING-TO”的效果都相同。
b、当字段名称不同,但类型按顺序匹配的时候,使用“=”和“MOVE-TO”可以全字段进行赋值,但是“MOVE-CORRESPONDING-TO”只会对字段名称相同的字段进行赋值。
c、当字段名称不同且类型按顺序并不完全匹配的时候,“=”和“MOVE-TO”无法进行赋值,会直接报错。但是“MOVE-CORRESPONDING-TO”会根据字段名称进行对应赋值。
d、直接赋值:适用于结构相同的结构体。MOVE-CORRESPONDING-TO:适用于结构不完全相同,但需要赋值同名字段的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值