2017-01-11 11 views
8

Tôi muốn viết một phương thức xuất một bảng tham chiếu. Điều này là bắt buộc vì mỗi dòng của nó có thể có cấu trúc riêng của nó. Vì vậy, tôi tuyên bố kiểu như thế này:Hành vi lạ khi sửa đổi hàng của bảng thông qua tham chiếu

... TYPE STANDARD TABLE OF REF TO data. 

Tôi nghĩ rằng nó sẽ là một ý tưởng gọn gàng nếu tôi ngay lập tức có thể sửa đổi các bảng hàng cuối cùng thay vì có một workarea riêng biệt chỉ dành riêng cho phụ.


Tại sao công việc này ...

FIELD-SYMBOLS: <lfs_struct> TYPE REF TO DATA. 
" ...  
APPEND INITIAL LINE TO ei_lines ASSIGNING <lfs_struct>. 
CREATE DATA <lfs_struct> TYPE (<lfs_field>-segnam). 
ASSIGN <lfs_struct>->* TO <lfs_target>. 

... nhưng điều này không?

DATA: lo_struct TYPE REF TO data. 
" ...  
APPEND INITIAL LINE TO ei_lines REFERENCE INTO lo_struct. 
CREATE DATA lo_struct TYPE (<lfs_field>-segnam). 
ASSIGN lo_struct->* TO <lfs_target>. 

Với 'làm việc' Tôi có nghĩa là giá trị của hàng nối thực sự thay đổi. Nếu tôi gán một cái gì đó cho <lfs_target> như tôi làm trong ví dụ thứ hai, nó thay đổi trong cấu trúc - nhưng không phải là bên trong bảng.

Dường như tôi đang thay đổi tham chiếu bằng ví dụ cuối cùng. Nhưng tại sao nó lại hoạt động với Field-Symbols?

Trả lời

5

Lý do mã của bạn hoạt động với biểu tượng trường nhưng không phải là đối tượng dữ liệu là do cách hai đối tượng đó xử lý dữ liệu trong bộ nhớ theo cách khác. Có khái niệm tương tự như trong C++, mặc dù đặt tên trong ABAP là một chút bối rối khi bạn đang sử dụng để C++:

Trong ABAP một biểu tượng lĩnh vực là một chút giống như một tài liệu tham khảo trong C++ (hoặc giống như một C dereferenced ++ con trỏ, như SAP gọi nó). Nó không cấp phát bộ nhớ cho dữ liệu riêng của nó, mà là dùng để chỉ một số đối tượng trường/dữ liệu hiện có. Sau khi gán một đối tượng dữ liệu cho biểu tượng trường, nếu bạn truy cập đối tượng dữ liệu đó thông qua biểu tượng trường, thì bạn không bao giờ nói chuyện với biểu tượng trường, nhưng luôn trực tiếp đến đối tượng dữ liệu! (Đây là phần rất quan trọng trong trường hợp của bạn, như chúng ta thấy trong một chút.)

Bây giờ trong của bạn ví dụ đầu tiên bạn tạo biểu tượng lĩnh vực, mà không làm gì được nêu ra:

FIELD-SYMBOLS: <lfs_struct> TYPE REF TO DATA. 

Chỉ sau khi tạo dòng mới cho bảng nội bộ của bạn và gán bộ nhớ mới được phân bổ cho ký hiệu trường <lfs_struct>, biểu tượng trường trỏ đến một số dữ liệu (dòng bảng). Sau đó, bạn phân bổ một số bộ nhớ hơn động:

CREATE DATA <lfs_struct> TYPE (<lfs_field>-segnam). 

Bây giờ bạn bảng nội ei_lines điểm vào dòng bảng mới nối (địa chỉ bộ nhớ), cũng như biểu tượng lĩnh vực của bạn. Địa chỉ bộ nhớ đó lần lượt trỏ đến dữ liệu mới được tạo từ CREATE DATA. Điều quan trọng cần lưu ý là, như đã nói, bạn không truy cập vào biểu tượng trường, mà là bộ nhớ mà nó đề cập đến!

Trong ví dụ thứ hai tuy nhiên bạn đầu tiên phân bổ bộ nhớ cho một đối tượng dữ liệu mới:

DATA: lo_struct TYPE REF TO data. 

Sau đó, một lần nữa bạn cấp phát bộ nhớ mới cho một dòng bảng mới (APPEND) và đặt một tham chiếu đến địa chỉ bộ nhớ vào đối tượng dữ liệu của bạn lo_struct.Bây giờ phần thú vị: Bạn tự động tạo một dữ liệu khác (đối tượng) và lưu con trỏ vào dữ liệu mới đó vào lo_struct. Do đó, hiện tại lo_struct không đề cập đến dòng bảng mới nữa, nhưng đối với dữ liệu mới được tạo từ CREATE DATA.


TL; DR Trong ví dụ đầu tiên bạn CREATE DATA và lưu các tài liệu tham khảo để dữ liệu đó vào đối tượng mà biểu tượng lĩnh vực của bạn <lfs_struct> đề cập đến, đó là dòng bảng mới trong ei_lines. Tuy nhiên, trong ví dụ thứ hai, bạn cũng tạo một dòng bảng mới và tham chiếu nó qua lo_struct, nhưng khi bạn CREATE DATA sau đó, bạn lưu lại tham chiếu đến dữ liệu mới đó vào lo_struct, do đó ghi đè tham chiếu ban đầu vào dòng bảng mới.

+1

Cảm ơn bạn, tôi nghĩ rằng tôi đã nhận nó ngay bây giờ! –

Các vấn đề liên quan