Tôi đã chuẩn bị một đoạn mã riêng mà tôi muốn chia sẻ. Nó không hoàn hảo, nó sẽ không hoạt động với cấu trúc phức tạp. Tuy nhiên tôi không cần bất cứ điều gì nhiều hơn bây giờ hơn để làm việc trên các cấu trúc phẳng.
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.
... và một macro nhỏ để sử dụng ít hơn như ngôn ngữ xây dựng.
DEFINE move_corresponding_ignore_init.
lcl_utilities=>move_corresponding_ignore_init(
exporting
i_str_source = &1
changing
c_str_dest = &2
).
END-OF-DEFINITION.
Nếu bạn định truyền mà không kiểm tra, bạn có thể bỏ qua l_rcl_abap_typedescr hoàn toàn. – vwegert
@vwegert: Bạn nói đúng. Tôi đã cải thiện mã hóa. – Jagger