Powód, dla którego twój kod działa z symbolem pola, ale nie obiektem danych, wynika z tego, jak te dwa traktują dane w pamięci w inny sposób. Istnieją podobne koncepcje w języku C++, choć nazwanie w ABAP jest nieco mylące, gdy są używane do C++:
W ABAP symbolem pole jest trochę jak odniesienie w C++ (lub jak dereferencjonowane C++ wskaźnik, jak to nazywa SAP). Nie przydziela pamięci dla własnych danych, ale odnosi się do jakiegoś istniejącego obiektu pola/danych. Po przypisaniu obiektu danych do symbolu pola, jeśli uzyskujesz dostęp do tego obiektu danych za pomocą symbolu pola, to nigdy nie rozmawia się z samym symbolem pola, ale zawsze bezpośrednio z obiektem danych! (Jest to kluczowy element w Twoim przypadku, jak widzimy w trochę.)
Teraz w pierwszym przykładzie utworzeniu symbolu pola, który jeszcze nic nie robi:
FIELD-SYMBOLS: <lfs_struct> TYPE REF TO DATA.
Tylko po utworzeniu nowego wiersza dla wewnętrznej tabeli i przypisaniu nowo przydzielonej pamięci do twojego symbolu pola <lfs_struct>
, symbol pola wskazuje na niektóre dane (wiersz tabeli). Następnie należy przeznaczyć trochę więcej pamięci dynamicznie:
CREATE DATA <lfs_struct> TYPE (<lfs_field>-segnam).
teraz Twoje tabeli wewnętrznej ei_lines
punktów do nowo dodanym wierszu tabeli (adres pamięci), jak robi swój symbol pola. Ten adres pamięci z kolei wskazuje na nowo utworzone dane z CREATE DATA
. Ważne jest, aby pamiętać, że, jak powiedział, nie masz dostępu do samego symbolu pola, ale do pamięci, do której się odnosi!
W drugim przykładzie jednak najpierw przydzielić pamięci dla nowego obiektu danych :
DATA: lo_struct TYPE REF TO data.
Następnie ponownie przydzielić nową pamięć dla nowego wiersza tabeli (APPEND
) i umieścić odniesienie do tego adresu pamięci do obiektu danych lo_struct
.Teraz interesująca część: Dynamicznie tworzysz kolejne dane (obiekt) i zapisujesz wskaźnik do tych nowych danych w lo_struct
. Tak więc teraz lo_struct
nie odnosi się już do nowej linii tabeli, ale do nowo utworzonych danych z CREATE DATA
.
TL; DR W pierwszym przykładzie ty CREATE DATA
i zapisać odniesienie do tych danych do obiektu, gdzie symbol odnosi się do pola <lfs_struct>
, który jest nowy wiersz tabeli w ei_lines
. W drugim przykładzie tworzysz także nową linię tabeli i odsyłasz ją poprzez lo_struct
, ale później, po CREATE DATA
, ponownie przechowujesz odniesienie do nowych danych w lo_struct
, zastępując oryginalne odniesienie do nowej linii tabeli.
Dziękuję, myślę, że mam to teraz! –