2017-01-11 2 views
8

Ich möchte eine Methode schreiben, die eine Referenztabelle exportiert. Dies ist erforderlich, da jede Zeile eine eigene Struktur haben kann. So erklärte ich den Typ wie folgt aus:Seltsames Verhalten beim Ändern der Tabellenzeile über Referenz

... TYPE STANDARD TABLE OF REF TO data. 

Ich dachte, es wäre eine nette Idee, wenn ich sofort den Tabellen letzten Zeile ändern könnte stattdessen einen separaten Arbeitsbereich des Habens nur zum Anhängen.


Warum diese Arbeit ...

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

... aber dies nicht tut?

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

Mit ‚Arbeit‘ meine ich, dass der Wert der anliegenden Reihe wirklich ändert. Wenn ich etwas zu <lfs_target> wie ich im zweiten Beispiel zuweisen, ändert es sich in der Struktur selbst - aber nicht in der Tabelle.

Offenbar ändere ich die Referenz mit dem letzten Beispiel. Aber warum funktioniert es dann mit Field-Symbolen?

Antwort

5

Der Grund, warum Ihr Code mit einem Feldsymbol, aber nicht mit einem Datenobjekt arbeitet, liegt daran, dass diese beiden Daten anders im Speicher verarbeitet werden. Es gibt ähnliche Konzepte in C++, obwohl in ABAP Namensgebung ist ein wenig verwirrend, wenn Sie in C++:

In ABAP ein Feldsymbol ein bisschen wie eine Referenz in C++ (oder wie ein dereferenzierte C++ Zeiger, wie SAP es nennt). Es reserviert keinen Speicher für seine eigenen Daten, sondern verweist auf ein existierendes Feld/Datenobjekt. Wenn Sie nach dem Zuordnen eines Datenobjekts zum Feldsymbol über das Feldsymbol auf dieses Datenobjekt zugreifen, sprechen Sie nie mit dem Feldsymbol selbst, sondern immer direkt mit dem Datenobjekt! (Dies ist der entscheidende Teil in Ihrem Fall, wie wir in einem etwas sehen.)

Jetzt in Ihrem ersten Beispiel Sie das Feld Symbol erstellen, die noch nichts tut:

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

Nur Nach dem Erstellen der neuen Zeile für Ihre interne Tabelle und dem Zuordnen des neu zugewiesenen Speichers zu Ihrem Feldsymbol <lfs_struct> zeigt das Feldsymbol auf einige Daten (die Tabellenzeile). Dann ordnen Sie etwas mehr Speicher dynamisch:

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

Jetzt ist Ihre interne Tabelle ei_lines Punkte auf die neu angefügten Tabellenzeile (Speicheradresse), wie auch Ihr Feldsymbol. Diese Speicheradresse verweist wiederum auf die neu erzeugten Daten von CREATE DATA. Wichtig zu beachten ist, dass Sie, wie gesagt, nicht auf das Feldsymbol selbst zugreifen, sondern auf den Speicher, auf den es sich bezieht!

Im zweiten Beispiel jedoch Sie ersten Speicher für ein neues Datenobjekt zuzuordnen:

DATA: lo_struct TYPE REF TO data. 

Dann wieder zuzuteilen Sie neue Speicher für eine neue Tabellenzeile (APPEND) und eine Referenz auf diese Speicheradresse gesetzt in Ihr Datenobjekt lo_struct.Jetzt der interessante Teil: Sie erstellen dynamisch eine andere Daten (Objekt) und speichern den Zeiger auf diese neuen Daten in lo_struct. Damit bezieht sich nun lo_struct nicht mehr auf die neue Tabellenzeile, sondern auf die neu erzeugten Daten aus CREATE DATA.


TL; DR Im ersten Beispiel Sie CREATE DATA und den Verweis auf diese Daten in das Objekt sichern, in denen Feldsymbol <lfs_struct> bezieht, welche die neue Tabellenzeile in ei_lines ist. Im zweiten Beispiel erstellen Sie jedoch auch eine neue Tabellenzeile und verweisen darauf über lo_struct, aber wenn Sie danach CREATE DATA, speichern Sie den Verweis auf diese neuen Daten erneut in lo_struct und überschreiben damit die ursprüngliche Referenz auf die neue Tabellenzeile.

+1

Danke, ich glaube ich habe es jetzt bekommen! –