结构体访问
- 结构体可以作为一个整体进行访问,也可以通过指定操作数位置来访问结构体的单个组件。
- 为了访问结构体的组件,可以使用结构体组件选择器
-。 - 对于引用结构化数据对象的变量,可以使用对象组件选择器
->:... dref->comp ....也可以使用以下语法,但不太方便:... dref->*-comp .... - ADT 和 ABAP 编辑器在组件选择器后提供代码完成功能,以方便访问结构体的组件。
SELECT carrid, carrname
FROM scarr
INTO @DATA(wa).
cl_demo_output=>write( |{ wa-carrid WIDTH = 5
}{ wa-carrname }| ).
ENDSELECT.
cl_demo_output=>display( ).
" 通过结构组件选择器寻址组件
... structure-comp1 ...
... structure-comp2 ...
... structure-comp3 ...
" 访问整个结构体和示例
IF structure IS INITIAL.
...
ENDIF.
IF structure-comp1 = 1.
...
ENDIF.
DATA(complete_struc) = structure.
DATA(comp_value) = structure-comp2.
"Type and data declarations
TYPES: type_1 TYPE structured_type-comp1,
type_2 LIKE structure-comp1.
DATA: var_1 TYPE structured_type-comp1,
var_2 LIKE structure-comp1.
"Variables with reference to a structured data object
DATA ref_struc_1 TYPE REF TO structured_type.
ref_struc_1 = NEW #( ).
"Excursion: Creating a reference variable using inline declaration
DATA(ref_struc_2) = NEW structured_type( ).
... ref_struc_1->comp1 ...
... ref_struc_1->*comp1 ... "Using the dereferencing operator
... ref_struc_2->-comp2 ...
... ref_struc_2->*-comp2 ... "Using the dereferencing operator
结果体嵌套可以使用链结构 - :
... structure-substructure-comp1 ...
... address_n-name-title ...
ASSIGN 语句具有用于动态访问结构组件的特殊变体。
结构体赋值
您可以使用赋值运算符 = 将结构的内容复制到另一个结构。在以下示例中,假定目标和源结构是兼容类型。通常,请注意特殊的转换和比较规则适用于涉及结构的赋值。
some_struc = another_struc.
"通过内联声明创建新结构时,类型“派生了右侧结构并分配了内容。
DATA(struc_inl) = some_struc.
要为单个结构组件分配值,请使用组件选择器。
TYPES: BEGIN OF addr_struc,
name TYPE string,
street TYPE string,
city TYPE string,
END OF addr_struc.
DATA address TYPE addr_struc.
address-name = `Mr. Duncan Pea`.
address-street = `Vegetable Lane 11`.
address-city = `349875 Botanica`.
使用 VALUE 操作符
当初始值 VALUE #( ) 传递给泛型形式参数时,该类型派生自泛型。VALUE 运算符可用于构造复杂数据对象的内容,例如结构或内部表。
"# 用法:可以隐式导出操作数的类型
address = VALUE #( name = `Mr. Duncan Pea`
street = `Vegetable Lane 11`.
city = `349875 Botanica` ).
或者直接通过声明结构内联:
" 显式使用的类型:无法隐式导出操作数的类型
DATA(addr) = VALUE addr_struc( name = `Mr. Duncan Pea`
street = `Vegetable Lane 11`.
city = `349875 Botanica` ).
嵌套结构的操作:
TYPES: BEGIN OF struc_nested,
a TYPE i,
BEGIN OF nested_1,
b TYPE i,
c TYPE i,
END OF nested_1,
BEGIN OF nested_2,
d TYPE i,
e TYPE i,
END OF nested_2,
END OF struc_nested.
DATA str_1 TYPE struc_nested.
str_1 = VALUE #( a = 1
nested_1 = VALUE #( b = 2 c = 3 )
nested_2 = VALUE #( d = 4 e = 5 ) ).
三种不同的方法来填充一个嵌套结构体的值。每次给定相同的值来填充结构体。
TYPES: BEGIN OF t_col2,
col1 TYPE i,
col2 TYPE i,
END OF t_col2.
TYPES: BEGIN OF t_struct,
col1 TYPE i,
col2 TYPE t_col2,
END OF t_struct.
DATA: struct TYPE t_struct,
col2 TYPE t_col2.
struct = VALUE t_struct( col1 = 1
col2-col1 = 1
col2-col2 = 2 ).
col2 = VALUE t_col2( col1 = 1
col2 = 2 ).
struct = VALUE t_struct( col1 = 1
col2 = col2 ).
struct = VALUE t_struct( col1 = 1
col2 = VALUE #( col1 = 1
col2 = 2 ) ).
VALUE特别有用,因为通过单独寻址结构组件来赋值可能非常麻烦,尤其是在为操作数位置的结构组件赋值时。- 如果可以隐式推断操作数的类型,则可以在括号前使用
#字符。否则,必须明确指定类型。 VALUE运算符和内联声明可用于一次性创建和填充结构。- 请注意,结构有特殊的转换和比较规则。有关详细信息,请参阅 ABAP 关键字文档。
"Inline declaration
" 组件 a 未在此处指定,即其值保持初始值。
DATA(str_2) = VALUE struc_nested( nested_1 = VALUE #( b = 2 c = 3 )
nested_2 = VALUE #( d = 4 e = 5 ) ).
" 除了 VALUE 运算符,NEW 运算符可用于创建
" 数据引用变量(并填充结构)
DATA(str_ref) = NEW struc_nested( a = 1
nested_1 = VALUE #( b = 2 c = 3 )
nested_2 = VALUE #( d = 4 e = 5 ) ).
使用 Field Symbols
Field-symbols: <f_fs> type any,
<f_f1> type any,
<f_f2> type any,
<f_f3> tye any.
Loop at lt_struc assigning <f_fs>.
ASSIGN COMPONENT 1 OF STRUCTURE <f_fs> TO <f_f1>.
ASSIGN lv_field TO <f_fs2>.
<f_fs1> = <f_fs2>.
ENDLOOP.
参考链接: