一、定义
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_id
、airport_to_id
和carrier_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 ).
总结
打完收工。