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.
Danke, ich glaube ich habe es jetzt bekommen! –