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.
Cảm ơn bạn, tôi nghĩ rằng tôi đã nhận nó ngay bây giờ! –