2017-01-11 27 views
8

Chcę napisać metodę, która eksportuje tabelę odniesień. Jest to wymagane, ponieważ każda linia może mieć własną strukturę. Więc jestem deklarując typ tak:Dziwne zachowanie podczas modyfikowania wiersza tabeli przez odwołanie

... TYPE STANDARD TABLE OF REF TO data. 

Myślałem, że będzie to miłe pomysł, czy mogę od razu modyfikowania map ostatni wiersz zamiast oddzielnego workarea tylko do dopisywania.


Dlaczego ta praca ...

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

... ale to nie robi?

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

Z „pracy” To znaczy, że wartość załączonym wierszu naprawdę zmienia. Jeśli przypiszę coś do <lfs_target>, tak jak robię to w drugim przykładzie, zmieni się ona w samej strukturze - ale nie wewnątrz stołu.

Wygląda na to, że zmieniam odniesienie z ostatnim przykładem. Ale dlaczego działa z Symbolami pola?

Odpowiedz

5

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.

+1

Dziękuję, myślę, że mam to teraz! –