我正在尋找一個語言構造或功能模塊,這將是MOVE-CORRESPONDING IGNORING INITIALS
一樣。簡單地說,我想要的東西與MOVE-CORRESPONDING source TO dest
完全一樣,但忽略了source
中最初的所有字段。在ABAP中是否有像MOVE-CORRESPONDING IGNORING INITIALS?
有沒有這樣的東西?
我正在尋找一個語言構造或功能模塊,這將是MOVE-CORRESPONDING IGNORING INITIALS
一樣。簡單地說,我想要的東西與MOVE-CORRESPONDING source TO dest
完全一樣,但忽略了source
中最初的所有字段。在ABAP中是否有像MOVE-CORRESPONDING IGNORING INITIALS?
有沒有這樣的東西?
我編寫了自己想分享的一段代碼。它不完美,它不適用於複雜的結構。然而,我現在不需要更多的東西,而不是在平面結構上工作。
CLASS lcl_utilities DEFINITION FINAL CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS:
move_corresponding_ignore_init
IMPORTING
i_str_source TYPE any
CHANGING
c_str_dest TYPE any.
ENDCLASS.
CLASS lcl_utilities IMPLEMENTATION.
METHOD move_corresponding_ignore_init.
DATA:
l_rcl_abap_structdescr TYPE REF TO cl_abap_structdescr.
l_rcl_abap_structdescr ?= cl_abap_typedescr=>describe_by_data(i_str_source).
LOOP AT l_rcl_abap_structdescr->components ASSIGNING FIELD-SYMBOL(<fs_str_component>).
ASSIGN COMPONENT <fs_str_component>-name OF STRUCTURE c_str_dest TO FIELD-SYMBOL(<fs_dest_field>).
IF sy-subrc = 0.
ASSIGN COMPONENT <fs_str_component>-name OF STRUCTURE i_str_source TO FIELD-SYMBOL(<fs_source_field>).
ASSERT sy-subrc = 0.
IF <fs_source_field> IS NOT INITIAL.
<fs_dest_field> = <fs_source_field>.
ENDIF.
ENDIF.
ENDLOOP.
ENDMETHOD. "move_corresponding_ignore_init
ENDCLASS.
...和一個小宏,以便使用它更像一個語言結構。
DEFINE move_corresponding_ignore_init.
lcl_utilities=>move_corresponding_ignore_init(
exporting
i_str_source = &1
changing
c_str_dest = &2
).
END-OF-DEFINITION.
對於任意結構沒有語言結構。對於字符字段,您可以使用OVERLAY ... WITH,但是如果您嘗試使用結構來完成此操作,則會導致代碼非常雜亂,並且會導致很多未預見的可變長度內容問題。最好的辦法是使用RTTI(Runtime Type Identification)來做到這一點,但在檢查初始值時要小心。
如果您不經過檢查即可投射,您可以完全省略l_rcl_abap_typedescr。 – vwegert 2012-02-05 12:19:56
@vwegert:你說得對。我已經改進了編碼。 – Jagger 2012-02-05 16:02:27