LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING


Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV

Moderatoren: Jan, Steff

LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon nickname8 » 26.10.2018, 12:01

Hallo Kollegen,

ich wollte mal fragen, was ihr in welchen Fällen nutzt, um eine Zeile einer Tabelle zu betrachten und warum?
Bei neuen Programm/Reports nutze ich so gut wie immer REFERENCE INTO, einfach weil das meiner Meinung nach am Nächsten an OOP dran ist.

Ich sehe aber auch oft, dass innerhalb von Klassen Field-Symbols dafür verwendet werden. Ist ja natürlich generell nicht schlimm, aber ich würde gerne mal von eurem Erfahrungsschatz profitieren.

Grüße
nickname8
ForumUser
 
Beiträge: 75
Registriert: 18.07.2015, 08:22
Dank erhalten: 9 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon a-dead-trousers » 26.10.2018, 16:21

Von der Funktionsweise her sollten REFERENCE INTO und ASSIGNING gleich funktionieren. Nur dass REFERENCE INTO auch im Kontext einer ganzen Klasse und darüber hinaus und nicht nur einer Methode funktioniert.
Performancetechnisch ist aber ASSIGNING um einen kleinen Deut schneller. Keine Ahnung warum das so ist. Ich hab das vor einigen Jährchen in mehreren Vergleichstests auf 7.01 ausprobiert. Sogar ASSIGNING mit anschließendem GET REFERENCE war um einen geringen Prozentsatz schneller als das REFERENCE INTO :twisted:
Ob das in den neueren Kernels ein anderes Ergebnis liefert, hab ich seither nicht mehr ausprobiert.

Wenn du neu anfängst, würde ich dir gleich zu REFERENCE INTO raten, damit du dich mit den unterschiedlichen Kontexten, wann welcher Befehl verwendet werden kann, gar nicht erst herumschlagen musst. Auf alle Fälle würde ich aber von den Workareas abraten (reines INTO) die machen eine "echte" Kopie der Daten im Speicher und das kostet bei großen Datenmengen einiges an Laufzeit.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 3090
Registriert: 07.02.2011, 13:40
Dank erhalten: 762 mal
Ich bin: Entwickler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon ralf.wenzel » 26.10.2018, 18:49

a-dead-trousers hat geschrieben:Nur dass REFERENCE INTO auch im Kontext einer ganzen Klasse und darüber hinaus und nicht nur einer Methode funktioniert


Den Satz verstehe ich nicht.

Ralf
ralf.wenzel
Top Expert
 
Beiträge: 3242
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 190 mal
Ich bin: Freiberufler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon black_adept » 26.10.2018, 19:00

ralf.wenzel hat geschrieben:
a-dead-trousers hat geschrieben:Nur dass REFERENCE INTO auch im Kontext einer ganzen Klasse und darüber hinaus und nicht nur einer Methode funktioniert


Den Satz verstehe ich nicht.

Ralf
Ich auch nicht.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 3101
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 526 mal
Ich bin: Freiberufler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon deejey » 26.10.2018, 19:06

Ich fürchte ohne den Expertenrat von gottfriedstroh kommen wir hier nicht weiter
deejey
Specialist
 
Beiträge: 135
Registriert: 31.07.2016, 11:20
Dank erhalten: 9 mal
Ich bin: Entwickler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon a-dead-trousers » 27.10.2018, 07:33

ralf.wenzel hat geschrieben:
a-dead-trousers hat geschrieben:Nur dass REFERENCE INTO auch im Kontext einer ganzen Klasse und darüber hinaus und nicht nur einer Methode funktioniert

Den Satz verstehe ich nicht.

Ich meinte damit, dass man z.B. ein Attribut oder einen Parameter mit REF TO definieren kann und von einem REFERENCE INTO befüllen lassen kann. Somit ist der Inhalt auch in anderen Methoden einer Klasse verwendbar und auch sogar darüber hinaus. Mit Feld-Symbolen (ASSIGNING) geht das ja bekanntlich nicht. Die einzige "globale" Verwendung gibt es hier nur in Programmen bzw. Reports und wenn man so will über "dirty-assigns".
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 3090
Registriert: 07.02.2011, 13:40
Dank erhalten: 762 mal
Ich bin: Entwickler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon black_adept » 27.10.2018, 15:23

Aber wo ist denn jetzt der Vorteil? Bleiben wir mal beim Beispiel eines Parameters.
Du definierst einen Exportparameter vom Typ REF TO MATNR. Ok - das musst du nachher auch mit READ TABLE INTO REFERENCE füllen. Und bei Verwendung des Exportparameters im Aufrufer musst du dann dereferenzieren.
Die Alternative wäre ein Exportparameter vom Typ MATNR. Da müsste dann READ TABLE ASSIGNING und danach eine Zuweisung an den Parameter erfolgen. Dafür kann man sich nachher die Dereferenzierung sparen.

Die Anzahl der Stellen, wo der Exportparameter gefüllt wird ist klar definiert und (bei mir üblicherweise) sehr beschränkt. Die Anzahl der Aufrufer der Methode/Form hingegen ist meist nicht so klar definiert. Daher wäre mein Gedanke das Coding so zu gestalten dass der Aufrufer möglichst einfach an die Sache rangehen kann - und dazu gehört bei mir halt dass ich gerne direkt mit den Rückgabewerten arbeite anstatt sie noch dereferenzieren zu müssen.
( Und ich habe immer das Problem, dass ich an diversen Stellen prüfen muss, ob die Referenz überhaupt gebunden ist, wohingegen ich bei einem "echten" Rückgabeparameter immer von einer existierenden Variablen ausgehen kann )
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 3101
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 526 mal
Ich bin: Freiberufler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon ralf.wenzel » 27.10.2018, 15:53

Alles richtig, volle Zustimmung.

Wobei Referenzen aber deutlich flexibler sind, was man gelegentlich braucht. In unserer generischen Persistenzschicht wird immer ein REF TO DATA zurückgegeben. Weil die Klasse halt gar nicht weiß, was sie zurückgibt.


Ralf
ralf.wenzel
Top Expert
 
Beiträge: 3242
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 190 mal
Ich bin: Freiberufler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon black_adept » 27.10.2018, 17:00

ralf.wenzel hat geschrieben:Alles richtig, volle Zustimmung.

Wobei Referenzen aber deutlich flexibler sind, was man gelegentlich braucht. In unserer generischen Persistenzschicht wird immer ein REF TO DATA zurückgegeben. Weil die Klasse halt gar nicht weiß, was sie zurückgibt.
Genau in so einem Fall verwende ich auch gerne Referenzen. Aber in der Mehrzahl der Fälle ist ein READ TABLE oder LOOP AT ... bei mir eben hinreichend typisiert um darauf verzichten zu können. Und damit komme ich dann auch auf die Originalfrage dieses Threads zurück und kann nur sagen: Ich verwende LOOP ... INTO REFERENCE nur in Ausnahmefällen und nicht wie der OP im Regelfall.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 3101
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 526 mal
Ich bin: Freiberufler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon nickname8 » 27.10.2018, 19:39

black_adept hat geschrieben:Ich verwende LOOP ... INTO REFERENCE nur in Ausnahmefällen und nicht wie der OP im Regelfall.

Sondern? Field-Symbols?

ralf.wenzel hat geschrieben:In unserer generischen Persistenzschicht wird immer ein REF TO DATA zurückgegeben. Weil die Klasse halt gar nicht weiß, was sie zurückgibt.

Davon würde ich mega-gerne mal ein Datenmodell/Klassendiagram (grob, ohne Betriebsgeheimnisse ;-) ) sehen.
nickname8
ForumUser
 
Beiträge: 75
Registriert: 18.07.2015, 08:22
Dank erhalten: 9 mal
Ich bin: Entwickler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon black_adept » 27.10.2018, 20:41

nickname8 hat geschrieben:
black_adept hat geschrieben:Ich verwende LOOP ... INTO REFERENCE nur in Ausnahmefällen und nicht wie der OP im Regelfall.

Sondern? Field-Symbols?
Im allgemeinen Feldsymbole, es sei denn die Syntax zwingt mich Workareas zu verwenden. Und ich kann mich nicht entsinnen jemals ein loop into reference gemacht zu haben.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 3101
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 526 mal
Ich bin: Freiberufler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon ralf.wenzel » 27.10.2018, 21:06

Mir geht es so wie Stefan. Die Notwendigkeit habe ich bisher nicht gesehen...

Ralf
ralf.wenzel
Top Expert
 
Beiträge: 3242
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 190 mal
Ich bin: Freiberufler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon a-dead-trousers » 28.10.2018, 08:48

Ein kleines Anwendungsbeispiel für Datenreferenzen:
In OO sollte ja möglichst viel als "Objekt" abgebildet werden. Daher hab ich schon mehrere Frameworks gebastelt, wo es eine zentrale Datenklasse für einen effizienten (mehrfach)Datenzugriff und darum herum Funktionsklassen für die einzelenen Datensätze gibt. Dieses Funktionsklassen werden z.B. über den Primarykey eines Datensatzes identifiziert und bieten lediglich SET und GET Methoden für die einzelnen Datenfelder. Die eigentliche Datenhaltung bleibt aber in der zentralen Datenklasse und die Funktionsklassen arbeiten nur mit Referenzen auf die Tabellenzeilen in der Datenklasse. Nach außen sind dabei nur die GET und SET Methoden in den Funktionsklassen bzw. READ, SAVE, HAS_CHANGES, GET_DATASET usw. in der Datenklasse sichtbar. Die Datenhaltung ist somit "nahe" an der Datenbank und die Daten müssen so auch nicht "teuer" in die Funktionsklassen kopiert bzw. daraus gelesen werden.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 3090
Registriert: 07.02.2011, 13:40
Dank erhalten: 762 mal
Ich bin: Entwickler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon ralf.wenzel » 28.10.2018, 11:54

Kannst du das konkreter beschreiben? Klingt danach, als würde ein SET Daten in einer anderen Klasse setzen....


Ralf
ralf.wenzel
Top Expert
 
Beiträge: 3242
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 190 mal
Ich bin: Freiberufler/in

Re: LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING

Beitragvon black_adept » 28.10.2018, 11:59

@adt: Ich glaube! verstanden zu haben was du machst. Aber könntest du jetzt mal ein simples Beispiel zu diesem Anwendungsfall beschreiben, wo du auf eine interne Tabelle mit LOOP at ... INTO REFERENCE arbeitest und wie du das dann nach oben oder unten durch die Methodeninterfaces durchreichst?
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 3101
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 526 mal
Ich bin: Freiberufler/in

Nächste

Zurück zu ABAP® Core

  Aktuelle Beiträge   
s4hana-cloud
vor 8 Stunden von sap_inchen 1 Antw.
500 Internal Server Error
vor 16 Stunden von zzcpak 1 Antw.
Dokumentinformationen lesen vom DVS
vor 18 Stunden von Tron 4 Antw.
Tabs innerhalb von Tabs
vor 19 Stunden von ewx 4 Antw.
Fakturierungsplan in Kontrakten ändern
vor 15 Stunden von DeathAndPain 1 Antw.

  Ähnliche Beiträge beta
READ TABLE dynamisch aufrufen
27.12.2004, 12:54 von RiffRaff 2 Antw.
gelöst Tabelle ohne Kopfzeile ersetzen - Read table
19.04.2016, 08:56 von joester 3 Antw.
REFERENCE vs. ASSIGNING
16.02.2007, 11:45 von ereglam 8 Antw.
gelöst DBTab Update from Table oder in Loop mit "Update Set" Oder ?
13.03.2018, 14:37 von Daniel 9 Antw.
sorted table, hashed table: Übergabe Workarea -> Performa
31.01.2006, 11:24 von Frank Münker 1 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]