2012-02-02 24 views

Trả lời

3

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

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

+0

@vwegert: Bạn nói đúng. Tôi đã cải thiện mã hóa. – Jagger

1

Không có cấu trúc ngôn ngữ cho cấu trúc tùy ý. Đối với các trường ký tự, bạn có thể sử dụng OVERLAY ... WITH, nhưng nếu bạn cố gắng làm điều này với các cấu trúc, nó dẫn đến mã thực sự lộn xộn và rất nhiều rắc rối không ổn định với nội dung có độ dài thay đổi. Đặt cược tốt nhất là sử dụng RTTI (Runtime Type Identification) để thực hiện việc này, nhưng hãy cẩn thận khi kiểm tra các giá trị ban đầu.

+0

Cảm ơn gợi ý nhưng đó không phải là những gì tôi đang tìm kiếm. Tôi đã chuẩn bị một đoạn mã riêng của mình mà không quá phức tạp, tôi tin. – Jagger

+0

@Jagger: Sử dụng RTTI chính xác là những gì bạn đã làm trong mã bạn đã cung cấp, vậy tại sao đây không phải là thứ bạn đang tìm kiếm? – vwegert

+0

Xin lỗi, có lẽ câu trả lời của tôi là một chút hiểu lầm. Tôi đã lấy về 'OVERLAY WITH'. Phần thứ hai của câu trả lời của bạn thực sự là những gì tôi đã sử dụng trong mã của tôi. – Jagger