ABAP 结构体的数据访问

310 阅读3分钟

结构体访问

abdoc_deep_structure.png

  • 结构体可以作为一个整体进行访问,也可以通过指定操作数位置来访问结构体的单个组件。
  • 为了访问结构体的组件,可以使用结构体组件选择器 -
  • 对于引用结构化数据对象的变量,可以使用对象组件选择器 ->... 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.

参考链接: