Wenn du von Ungarischer Notation schreibst, gehe ich davon aus, dass du Ungarische Notation meinst. Wenn du irgendwas meinst, was nirgends definiert ist außer in deinem Kopf, solltest du dein Auditorium das wissen lassen, sonst kann dir keiner folgen.
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
gtoXX
Wie kommst du eigentlich auf diese Behauptung?ralf.wenzel hat geschrieben: ↑25.10.2024 10:45Du hast die Ungarische Notation nicht verstanden. Die besagt, dass der Name den Typ des Objektes widerspiegelt. Der Zeilentyp von LT_EKKO ist EKKO, weshalb sie LT_EKKO heißen muss, wenn man der Ungarischen Notation folgt.
Code: Alles auswählen.
DATA(temp_pernrn_as_sobid) = VALUE #( FOR <zeile> IN pernrn ( <zeile> ) ). " CORRESPONDING geht nicht, da die Tabelle unstrukturiert ist
SELECT....
FREE temp_pernrn_as_sobid.
Code: Alles auswählen.
method do_something.
" ...
loop at lt_entries assigning field-symbol(<entry>).
<entry> = do_something_with_the_entry( <entry> ).
endloop.
" ...
endmethod.
method do_something_with_the_entry.
ro_result = io_entry.
data(lt_sub_entries) = ro_result->get_sub_entries( ).
loop at lt_sub_entries assigning field-symbol(<sub_entry>).
" ...
endloop.
" ...
endmethod.
Das würde ich vermuten. Auch wenn der Optimierer von ABAP zuweilen Erstaunliches tut.Jeglicher Memory (auch der Initial-Memory) zu lt_sub_entries wird nach jedem Verlassen der Methode do_something_with_the_entry() automatisch freigeräumt (entspricht FREE)
Diesen Gedanken verstehe ich nicht. Weshalb solltest Du jedesmal, wenn Du eine interne Tabelle leeren möchtest, stattdessen eine Untermethode rufen wollen?und eine separate Untermethode könnte man im Grunde für jeden Anwendungsfall erstellen, wo du momentan explizit CLEAR benutzt, nicht wahr?
Ich denke, wie genau die Stackverwaltung von ABAP programmiert ist, wissen wir alle nicht. Aber das Anfordern (Belegen) neuen Hauptspeichers sowie das Freigeben desselben erfordert einen gewissen Rechenaufwand. Bereits belegten Hauptspeicher zu nutzen, erspart dies. Daran lässt die SAP ja im oben verlinkten Hilfetext keinen Zweifel.Jetzt überlege ich ferner, wie oft und wie arg tief verschachtelt die Logik - also der Stack - im SAP-Standard ist und kann nur schlussfolgern: es ist geradewegs umgekehrt der Ausnahmefall, gezielt CLEAR benutzen zu wollen/müssen.
Ich meinte nicht, um lediglich die interne Tabelle zu leeren usw., sondern den gesamten Codeblock, in dem du eben eine interne Tabelle aufbaust, füllst, für irgendwas nutzt und leerst. Das könnte man immer in eine eigene Methode auslagern und dabei eben auf das Leeren verzichten, weil das durch das Verlassen der Methode ohnehin passiert. Je nach Komplexität/Umfang/Verständlichkeit der Methode wird man dies sowieso tun - gerade auch dann, wenn man 100%-ig sicherstellen will, dass im nächsten Durchlauf keine falsch gefüllten Variablen vorhanden sind.DeathAndPain hat geschrieben: ↑29.10.2024 12:06Diesen Gedanken verstehe ich nicht. Weshalb solltest Du jedesmal, wenn Du eine interne Tabelle leeren möchtest, stattdessen eine Untermethode rufen wollen?und eine separate Untermethode könnte man im Grunde für jeden Anwendungsfall erstellen, wo du momentan explizit CLEAR benutzt, nicht wahr?
Du hattest doch weiter oben ein Beispiel genannt, wo du ganz gezielt nutzt. Kannst du da vielleicht mal einen Benchmark mit jeweils 1000 Wiederholungen fahren mit diesen 3 Varianten?Aber das Anfordern (Belegen) neuen Hauptspeichers sowie das Freigeben desselben erfordert einen gewissen Rechenaufwand. Bereits belegten Hauptspeicher zu nutzen, erspart dies. Daran lässt die SAP ja im oben verlinkten Hilfetext keinen Zweifel.
Wichtige interne Tabellen verwalte ich über ein Iterator-ähnliches Konstrukt (also in einer eigenen lokalen Klasse). Schon deshalb, weil aus einem READ dann ein Methodenaufruf wird, der sprechend ist. hole_formularsatz( ) oder so.
Argh. Wenn ich, gerade bei dir, Ralf, "Iterator-ähnliches Konstrukt" lese, rollen sich mir die Zehnägel auf. Es ist mir unverständlich warum man sein Designpatternwissen überall unmotiviert einzusetzen auslebt. SAP bietet durch LOOP mit seinen diversen Ausprägungen bzw durch die SORTED-Tabellentypen doch implizit vorhandene Iteratoren, die wahrscheinlich >95% aller Fälle, wo man einen Iterator benötigt, abdecken. Das ist "programmieren an der Sprache ABAP vorbei".ralf.wenzel hat geschrieben: ↑30.10.2024 09:06Wichtige interne Tabellen verwalte ich über ein Iterator-ähnliches Konstrukt
Ralf
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DeathAndPain
Nun ja die Frage stellt sich eher weniger. SAP schreibt im strikten Modus INTO immer als letzten Teil der Select Anweisung vor. Hat auch eine gewisse Logik Was->Woher->mit welchen Bedingungen->mit welchen Parametern->Wohin ?ralf.wenzel hat geschrieben: ↑20.10.2024 18:09Ich stimme dir in Allem zu - bis auf eines:
Wenn ich etwas von A nach B lege, dann sage ich im normalen Sprachgebrauch IMMER erst, von wo und dann nach wo ich es lege. Sieht man ja schon am Anfang des Satzes.DeathAndPain hat geschrieben: ↑20.10.2024 18:02INTO vor FROM. Nach meinem Dafürhalten war das einst bei SQL sogar so vorgeschrieben, jedenfalls bei Informix 4GL war diese Reihenfolge Pflicht. In ABAP schreibt aber sonst jeder zuerst FROM und danach erst INTO. ABAP akzeptiert beides.
Darum finde ich FROM vor INTO deutlich einfacher zu lesen.
Ralf
Hier musst du folgendes Bedenken : Der Verwender deines Codes kann eine Exception catchen und einfach fortsetzen. Eine ASSERT Anweisung definiert einen klar inkonsistenten Programmzustand. Es ist also durchaus berechtigt, hier einen Dump zu erzeugen.
Folgende Benutzer bedankten sich beim Autor gtoXX für den Beitrag:
DeathAndPain