BTP上的ABAP开发(5)Structure

本文详细介绍了ABAP编程中的Structure(工作区)概念,包括types声明、嵌套结构(如st_nested和symsg)以及赋值方法,如自动匹配、手动赋值和结构间赋值。重点讲解了如何通过CDS声明变量和处理不同结构间的赋值操作。
摘要由CSDN通过智能技术生成

一、定义

Structure(有些伙伴习惯叫工作区workarea)是包含多个字段(Component)的一种复杂类型,包含的字段可以是基础类型,也可以是结构,structure支持嵌套。

二、声明

1.types声明

TYPES: BEGIN OF st_connection,
         airport_from_id TYPE /dmo/airport_from_id,
         airport_to_id   TYPE /dmo/airport_to_id,
         carrier_name    TYPE /dmo/carrier_name,
       END OF st_connection.

这是经典的声明方式,BEGIN OF关键字后接结构名称,以END OF加结构名称结束。BEGIN和END之间是所包含的字段,这里基于dmo声明了airport_from_idairport_to_idcarrier_name三个字段。
结构的使用和其他类型相似,也是使用data关键字来声明变量。

DATA connection TYPE st_connection.

如此,基于st_connection声明了一个connection变量。

2.嵌套结构

TYPES: BEGIN OF st_nested,
         airport_from_id TYPE /dmo/airport_from_id,
         airport_to_id   TYPE /dmo/airport_to_id,
         message         TYPE symsg,
         carrier_name    TYPE /dmo/carrier_name,
       END OF  st_nested.

DATA connection_nested TYPE st_nested.
out->write( connection_nested-message ).

symsg本身是一个结构类型,这里作为一个类型放在了st_nested结构中。当调用connection_nested的message字段时,将会得到message的结构。
在这里插入图片描述
对于嵌套类型的结构,如果想继续获得message结构下的数据,只需要再次用横线选中字段即可。

out->write( connection_nested-message-MSGNO ).

3.基于cds声明

CDS View可以直接作为结构类型来声明变量,变量的结构和CDS的结构一致。如下,connection_full就是拥有和i_connection相同结构的变量。

DATA connection_full TYPE /dmo/i_connection.

三、赋值

1.自动赋值

当字段能明确与结构字段相匹配的情况,可以直接进行赋值。

TYPES: BEGIN OF st_connection,
         airport_from_id TYPE /dmo/airport_from_id,
         airport_to_id   TYPE /dmo/airport_to_id,
         carrier_name    TYPE /dmo/carrier_name,
       END OF st_connection.

DATA connection TYPE st_connection.

SELECT SINGLE
FROM /dmo/i_connection
FIELDS departureairport, destinationairport, \_airline-name
WHERE airlineid = 'LH' AND connectionid = '0400'
INTO @connection.

out->write( connection ).

在ABAP SQL中使用结构时,要注意字段顺序的对应,系统只关注结构的字段和FIELDS后的字段类型和数量,而字段名是否一致则不会检查。如果不确定字段是否一致,则需要使用 INTO CORRESPONDING FIELDS OF关键字。

TYPES: BEGIN OF st_connection,
         airport_from_id TYPE /dmo/airport_from_id,
         airport_to_id   TYPE /dmo/airport_to_id,
         carrier_name    TYPE /dmo/carrier_name,
       END OF st_connection.

SELECT SINGLE
FROM /dmo/i_connection
FIELDS departureairport as airport_from_id, destinationairport as airport_to_id, \_airline-name as carrier_name
WHERE airlineid = 'LH' AND connectionid = '0400'
INTO CORRESPONDING FIELDS OF @connection.

虽然这种方式保证了字段匹配,但是可能造成数据丢失,而且结构的字段名和FIELDS查询的字段需要保持一致。
当是用@data(inline declaration)关键字声明变量时,如果查询的字段包含association,则该字段必须要进行重命名,如\_airline-name

SELECT SINGLE
FROM /dmo/i_connection
FIELDS departureairport, destinationairport, \_airline-name as carrier_name
WHERE airlineid = 'LH' AND connectionid = '0400'
INTO @data(connection_any).

2.手动赋值

使用VALUE #()可以对结构进行赋值,需要指定字段值的匹配。

TYPES: BEGIN OF st_connection,
         airport_from_id TYPE /dmo/airport_from_id,
         airport_to_id   TYPE /dmo/airport_to_id,
         carrier_name    TYPE /dmo/carrier_name,
       END OF st_connection.

DATA connection TYPE st_connection.
connection = value #( airport_from_id = 'XX' airport_to_id = 'YY' carrier_name = 'Test' ).

也可以直接用字段调用方式给结构赋值,简单粗暴。

connection-airport_from_id = 'XX'.
connection-airport_to_id = 'YY'.
connection-carrier_name = 'ZZ'.

3.结构赋值

如果保证两个结构相同,两个结构可以相互赋值。

TYPES: BEGIN OF st_connection,
         airport_from_id TYPE /dmo/airport_from_id,
         airport_to_id   TYPE /dmo/airport_to_id,
         carrier_name    TYPE /dmo/carrier_name,
       END OF st_connection.

DATA connection TYPE st_connection.
DATA connection2 TYPE st_connection.
connection = value #( airport_from_id = 'XX' airport_to_id = 'YY' carrier_name = 'Test' ).
connection2 = connection.

结构不同,不可以直接用等号赋值,需使用corresponding #()关键字完成赋值。

TYPES: BEGIN OF st_connection,
         airport_from_id TYPE /dmo/airport_from_id,
         airport_to_id   TYPE /dmo/airport_to_id,
         carrier_name    TYPE /dmo/carrier_name,
       END OF st_connection.
       
TYPES: BEGIN OF st_nested,
         airport_from_id TYPE /dmo/airport_from_id,
         airport_to_id   TYPE /dmo/airport_to_id,
         message         TYPE symsg,
         carrier_name    TYPE /dmo/carrier_name,
       END OF  st_nested.

DATA connection TYPE st_connection.
DATA connection_nested TYPE st_nested.
connection_nested = CORRESPONDING #( connection ).

总结

打完收工。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值