2012-02-02 65 views

回答

3

我編寫了自己想分享的一段代碼。它不完美,它不適用於複雜的結構。然而,我現在不需要更多的東西,而不是在平面結構上工作。

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. 
+1

如果您不經過檢查即可投射,您可以完全省略l_rcl_abap_typedescr。 – vwegert 2012-02-05 12:19:56

+0

@vwegert:你說得對。我已經改進了編碼。 – Jagger 2012-02-05 16:02:27

1

對於任意結構沒有語言結構。對於字符字段,您可以使用OVERLAY ... WITH,但是如果您嘗試使用結構來完成此操作,則會導致代碼非常雜亂,並且會導致很多未預見的可變長度內容問題。最好的辦法是使用RTTI(Runtime Type Identification)來做到這一點,但在檢查初始值時要小心。

+0

感謝提示,但它不是我正在尋找。我相信,我準備了我自己的一段不太複雜的代碼。 – Jagger 2012-02-03 13:05:49

+0

@Jagger:使用RTTI正是你在你提供的代碼中所做的,那麼爲什麼這不是你想要的? – vwegert 2012-02-05 12:20:44

+0

對不起,也許我的回答有點誤會。我正在考慮「重疊」。你的答案的第二部分確實是我在代碼中使用的。 – Jagger 2012-02-05 16:00:17