Code: Alles auswählen.
DATA gt_text TYPE tline_t.
data gs_text type tline.
*----------------------------------------------------------------------*
* CLASS lcl_test DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_test DEFINITION.
PUBLIC SECTION.
CLASS-DATA count TYPE n LENGTH 2.
CLASS-METHODS get_text EXPORTING text TYPE tline_t.
ENDCLASS. "lcl_test DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_test IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_test IMPLEMENTATION.
METHOD get_text.
DATA textline TYPE tline.
ADD 1 TO count.
textline-tdformat = count.
textline-tdline = 'New text'.
APPEND textline TO text.
ENDMETHOD. "get_text
ENDCLASS. "lcl_test IMPLEMENTATION
START-OF-SELECTION.
lcl_test=>get_text( IMPORTING text = gt_text ).
lcl_test=>get_text( IMPORTING text = gt_text ).
lcl_test=>get_text( IMPORTING text = gt_text ).
LOOP AT gt_text INTO gs_text.
WRITE: / gs_text-tdformat, gs_text-tdline.
ENDLOOP.
Code: Alles auswählen.
03 New text
Code: Alles auswählen.
01 New text
02 New text
03 New text
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
ewx
Code: Alles auswählen.
CLASS-METHODS get_text EXPORTING text TYPE tline_t.
Code: Alles auswählen.
CLASS-METHODS get_text EXPORTING value(text) TYPE tline_t.
Das hatte ich so geschrieben.larsi hat geschrieben:wenn Du folgende Zeile voninCode: Alles auswählen.
CLASS-METHODS get_text EXPORTING text TYPE tline_t.
abänderst, würde das Programm genau das tun, was Du erwartest hastCode: Alles auswählen.
CLASS-METHODS get_text EXPORTING value(text) TYPE tline_t.
Das steht bei der Erläuterung der Anweisung nicht - im Gegenteil: Dort steht explizit, dass man das muss und die Syntaxprüfung sagt einem das auch nochmal bei jedem Syntaxcheck. Ich finde das Verhalten absolut logisch, warum sollte eine Variable einfach so überschrieben werden, ohne dass man das explizit anweist? Das wird auch bei allen anderen Variablentypen so gemacht. Gerade Ennos Beispiel macht das deutlich: Die Variable bekommt einen Wert und behält ihn, bis er explizit geändert wird. Bei RETURNING tritt nur deshalb der von Enno gewollte Effekt ein, weil RETURNING immer mit Wertübergabe gemacht wird.larsi hat geschrieben:Wobei ich allerdings auch zugeben muss, dass mich dieses Verhalten insbesondere bei EXPORTING-Parametern immer wieder nervt. Aus meiner Sicht bedeutet das Wort "EXPORTING", dass der Wert/die Variable implizit initialisiert werden sollte.
Richtig. Darum steht das auch so in der Hilfe und ist der Rat der Syntaxprüfung.Haubi hat geschrieben:Das Problem ist, dass die "by value"-Übergabe von tabellenartigen Parametern standardmäßig vom Code Inspector angemeckert wird (potentielles Performance-Problem).
Daher ist die von Ralf vorgeschlagene Variante (Exportparameter vor der ersten Benutzung löschen) häufig die einzig gangbare.
Da muss ich auch noch was dazu sagen:ralf.wenzel hat geschrieben:Richtig. Darum steht das auch so in der Hilfe und ist der Rat der Syntaxprüfung.Haubi hat geschrieben:Das Problem ist, dass die "by value"-Übergabe von tabellenartigen Parametern standardmäßig vom Code Inspector angemeckert wird (potentielles Performance-Problem).
Daher ist die von Ralf vorgeschlagene Variante (Exportparameter vor der ersten Benutzung löschen) häufig die einzig gangbare.
Nö.black_adept hat geschrieben:Das doofe ist, dass sich ein Exporting-Parameter wie ein Changing-Parameter verhält
Kannst Du das knappe "Nö" noch mit ein paar weiteren Sätzen unterlegen, um zu beschreiben, wo sich EXPORTING und CHANGING doch unterschiedlich verhalten? Aus der bisherigen Diskussion und meinen bisherigen Erfahrungen ist mir das nämlich bislang nicht klar geworden.ralf.wenzel hat geschrieben:Nö.
Ralf ist ein Mann der wenigen Worte, vorallem wenn er es schon mal erwähnt hat:larsi hat geschrieben:Kannst Du das knappe "Nö" noch mit ein paar weiteren Sätzen unterlegen, um zu beschreiben, wo sich EXPORTING und CHANGING doch unterschiedlich verhalten? Aus der bisherigen Diskussion und meinen bisherigen Erfahrungen ist mir das nämlich bislang nicht klar geworden.ralf.wenzel hat geschrieben:Nö.
Der große Unterrschied zwischen CHANGING und EXPORTING/IMPORTING liegt im Verhalten bei der "per-Value" Übergabe.ralf.wenzel hat geschrieben:Das ist der wesentliche Unterschied zur Wertübergabe, bei der genau der Effekt eintritt, den du erwartest: Die Tabelle wird jedesmal neu aufgebaut.
Versuch mal bitte, einem EXPORTING-Parameter einen Wert mitzugeben, der dann in der Methode verarbeitet wird. Das geht schlicht nicht. Der Wert bei Durchlauf 2 und 3 ist ja nicht da, weil er an die Methode übergeben wurde, sondern weil er noch vorhanden war.larsi hat geschrieben:Kannst Du das knappe "Nö" noch mit ein paar weiteren Sätzen unterlegen, um zu beschreiben, wo sich EXPORTING und CHANGING doch unterschiedlich verhalten? Aus der bisherigen Diskussion und meinen bisherigen Erfahrungen ist mir das nämlich bislang nicht klar geworden.ralf.wenzel hat geschrieben:Nö.
1. "ungehörig" finde ich witzig. Normalerweise höre ich "Eh, Alter, du bist so ein Arschloch"black_adept hat geschrieben:@a-d-t und Ralf:
Ein nicht weiter erläutertes "Nö" ist einfach eine ungehörige Antwort.
Die von mir damit negierte Aussage "Das doofe ist, dass sich ein Exporting-Parameter wie ein Changing-Parameter verhält" ist auch schön ohne umgebenden Kontext zitiert, dass die Namesgebung etwas anderes erwarten lässt.
Ok - ich gebe zu, dass ich statt "man" "viele Leute" hätte schreiben sollen - denn wie ich an Ennos Originalposting, larsis Nachfragen und meiner eigenen Erfahrung erkenne, denken scheinbar mehr als nur eine Handvoll Leute bei Exporting an ein automatisches Clearing beim Einstieg in die Methode.
Und ich bin immer noch der Meinung, dass diese Aussage so stehen bleiben sollte. Denn für den von Enno im 1. Posting angegebenen Fall ( Ohne Value-Übergabe) verhält sich der Exporting-Parameter nämlich wie ein Changing Parameter.
ralf.wenzel hat geschrieben:EXPORTING verhält sich nicht wie CHANGING, ich bleibe dabei - einem CHANGING-Parameter gebe ich einen Wert mit, der in der Methode verarbeitet wird. Das ist bei EXPORTING definitiv nicht so. Auch nicht im Enno-Beispiel.
Man muss bei EXPORTING-Parametern schon sehr deutlich zwischen Übergabe "by value" und "by reference" unterscheiden. Das ist auch so in der Hilfe dokumentiert. Bei Übergabe eines EXPORTING-Parameters "by value", wird der Wert automatisch von der ABAP-Laufzeitumgebung initialisiert. Hier ist also ein CLEAR eigentlich überflüssig. Wird ein EXPORTING-Parameter jedoch "by reference" übergeben, erhält er die Werte des Aufrufers (er wird nicht initialisiert) und damit können die Werte innerhalb des Funktionsbausteins/der Methode eben doch geändert werden und auch an den Aufrufer zurückgegeben werden. Damit verhält sich so ein EXPORTING-Parameter dann eben doch wie ein CHANGING-Parameter. Noch mein persönlicher Senf: wenn ich als Entwickler aber weiß, dass ich einen EXPORTING-Parameter, der "by reference" übergeben wird, nicht CLEARe, bin ich einfach schlampig. Dann sollte ich aus dem Ding lieber einen CHANGING machen, um zu verdeutlichen, dass ich diesen lediglich ändere, aber nicht initialisiere.ralf.wenzel hat geschrieben:Versuch mal bitte, einem EXPORTING-Parameter einen Wert mitzugeben, der dann in der Methode verarbeitet wird. Das geht schlicht nicht.
Code: Alles auswählen.
METHOD get_text.
DATA textline TYPE tline.
FIELD-SYMBOLS <tline> TYPE tline.
LOOP AT text ASSIGNING <tline>.
<tline>-tdline = 'Old Text'.
ENDLOOP.
ADD 1 TO count.
textline-tdformat = count.
textline-tdline = 'New text'.
APPEND textline TO text.
ENDMETHOD. "get_text