EXPORTING = IMPORTING?

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
27 Beiträge • Seite 1 von 2 (current) Nächste
27 Beiträge Seite 1 von 2 (current) Nächste

EXPORTING = IMPORTING?

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Hallo zusammen,
bin gerade über folgendes gestolpert:

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.
Meiner Meinung nach müsste - da es sich bei Text um einen EXPORTING-Parameter handelt - die Ausgabe so aussehen:

Code: Alles auswählen.

03 New text
Tatsächlich sieht die Ausgabe aber so aus:

Code: Alles auswählen.

01 New text
02 New text
03 New text
Das heißt, dass die komplette Tabelle an die Methode übergeben wird, obwohl das laut Deklaration eigentlich nicht sein sollte.
Umtypisiert man den Parameter in RETURNING, dann funktioniert es wie von mir erwartet.

Also Augen auf bei der Wahl der Parameterart! ;)

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: EXPORTING = IMPORTING?

Beitrag von ralf.wenzel (Top Expert / 3927 / 200 / 280 ) »
Wow, dass ich mal was weiß, was Enno nicht weiß - den Tag streiche ich mir im Kalender an ;)

IMPORTING übergibt eine Referenz, das bedeutet, dass der Wert in der Methode (auch nach Verlassen) nicht verändert wird. Die Tabelle text bleibt also erhalten und wenn du da noch eine Zeile anhängst, sind es eben zwei. Das ist der wesentliche Unterschied zur Wertübergabe, bei der genau der Effekt eintritt, den du erwartest: Die Tabelle wird jedesmal neu aufgebaut.

Edit: Das ist in etwa das, was die SAP meint, wenn sie sagt: EXPORTING-Parameter (aus der Sicht der Methode, also dein IMPORTING) sollten ge-clear-t werden, damit sie einen definierten Anfangszustand haben, tut man das nicht, sind die Inhalte eben undefiniert. Eigentlich meint sie damit die ungefüllten Parameter, aber in diesem Falle baust du ja nur auf dem undefinierten Zustand auf. Das deckt sich auch mit deinem RETURNING - diese Parameterart muss nicht ge-clear-t werden, um einen definierten Anfangszustand zu erhalten.

Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
ewx

Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: EXPORTING = IMPORTING?

Beitrag von larsi (ForumUser / 47 / 2 / 11 ) »
Hallo Enno,

wenn Du folgende Zeile von

Code: Alles auswählen.

CLASS-METHODS get_text EXPORTING text TYPE tline_t.
in

Code: Alles auswählen.

CLASS-METHODS get_text EXPORTING value(text) TYPE tline_t.
abänderst, würde das Programm genau das tun, was Du erwartest hast :-) 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. Ich habe mir in meinen Programmen zumindest folgende Logik angewöhnt:

IMPORTING: verändere ich nie, auch wenn ich Übergabe "by value" mache. Notfalls kopiere ich in lokale Variablen, und ändere dann diese
EXPORTING: initialisiere ich immer mit einem expliziten CLEAR, verändern nach Belieben möglich
CHANGING: initialisiere ich nicht, verändern nach Belieben möglich
RETURNING: analog zu EXPORTING

Viele Grüße,
Lars

Re: EXPORTING = IMPORTING?

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
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.
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Re: EXPORTING = IMPORTING?

Beitrag von ralf.wenzel (Top Expert / 3927 / 200 / 280 ) »
larsi hat geschrieben:wenn Du folgende Zeile von

Code: Alles auswählen.

CLASS-METHODS get_text EXPORTING text TYPE tline_t.
in

Code: Alles auswählen.

CLASS-METHODS get_text EXPORTING value(text) TYPE tline_t.
abänderst, würde das Programm genau das tun, was Du erwartest hast :-)
Das hatte ich so geschrieben.
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.
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.
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.
Richtig. Darum steht das auch so in der Hilfe und ist der Rat der Syntaxprüfung.
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: EXPORTING = IMPORTING?

Beitrag von a-dead-trousers (Top Expert / 4397 / 223 / 1182 ) »
ralf.wenzel hat geschrieben:
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.
Richtig. Darum steht das auch so in der Hilfe und ist der Rat der Syntaxprüfung.
Da muss ich auch noch was dazu sagen:
https://help.sap.com/saphelp_nw70ehp2/h ... ontent.htm --> siehe "Lazy Copy"
Die tatsächliche "Kopie" im Speicher passiert erst dann wenn eine (nur einseitige) Änderung der Daten passiert.
d.h. für Returning-Parameter kann man diese Warnung getrost ignorieren weil ja mit Rückkehr in den Aufrufer, die aufgerufene Methode keinen Einfluss auf die Daten mehr hat und der Kernel somit die kritisierte "teure" Kopie für per-Value Parameter nicht mehr durchführen muss (nur mehr ein Datenzeiger auf die Daten im Speicher).
Da das aber erst mit einem bestimmten Kernel eingeführt worden ist, ist diese CI-Warnung vorallem für ältere Systeme bzw. wenn man als AddOn-Entwickler für solche entwickelt durchaus korrekt.
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.18
Basis: 7.50

Re: EXPORTING = IMPORTING?

Beitrag von black_adept (Top Expert / 4093 / 128 / 940 ) »
Das doofe ist, dass sich ein Exporting-Parameter wie ein Changing-Parameter verhält, aber die Namensgebung eher ein Verhalten eines Returningparameters erwarten lässt. Und da ABAP Variablen nicht in einem undefinierten Zusatend daher kommen erwartet man (leider) eher eine initialsierte Variable statt eines gefüllten Parameters.
Ist ein wenig wie "USING"-Parameter, die trotz Namensgebung veränderte werden dürfen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: EXPORTING = IMPORTING?

Beitrag von ralf.wenzel (Top Expert / 3927 / 200 / 280 ) »
black_adept hat geschrieben:Das doofe ist, dass sich ein Exporting-Parameter wie ein Changing-Parameter verhält
Nö.
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: EXPORTING = IMPORTING?

Beitrag von larsi (ForumUser / 47 / 2 / 11 ) »
ralf.wenzel hat geschrieben:Nö.
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.

Viele Grüße,
Lars

Re: EXPORTING = IMPORTING?

Beitrag von a-dead-trousers (Top Expert / 4397 / 223 / 1182 ) »
larsi hat geschrieben:
ralf.wenzel hat geschrieben:Nö.
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 ist ein Mann der wenigen Worte, vorallem wenn er es schon mal erwähnt hat:
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.
Der große Unterrschied zwischen CHANGING und EXPORTING/IMPORTING liegt im Verhalten bei der "per-Value" Übergabe.
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.18
Basis: 7.50

Re: EXPORTING = IMPORTING?

Beitrag von ralf.wenzel (Top Expert / 3927 / 200 / 280 ) »
larsi hat geschrieben:
ralf.wenzel hat geschrieben:Nö.
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.
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.

Oder anders (frei nach meinem Motto "Ich mag keine Metaphern, ich spreche lieber in Bildern):

Als ich zum Auto gehen wollte, fiel mir ein, dass der Schirm noch dort lag. Darum lag ein Schirm im Auto.

Als ich zum Auto gehen wollte, nahm ich meinen Schirm mit und legte ihn beim Einsteigen hinein. Darum lag ein Schirm im Auto.

You got it?
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: EXPORTING = IMPORTING?

Beitrag von black_adept (Top Expert / 4093 / 128 / 940 ) »
@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.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: EXPORTING = IMPORTING?

Beitrag von ralf.wenzel (Top Expert / 3927 / 200 / 280 ) »
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.
1. "ungehörig" finde ich witzig. Normalerweise höre ich "Eh, Alter, du bist so ein Arschloch" ;)

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

3. Was mehr als eine Handvoll Leute denken, ist irrelevant, wenn es explizit in der SAP-Hilfe und der Syntaxprüfung gemeldet wird. "Abseits ist, wenn der Schiedsrichter pfeift" - EXPORTING macht das, was die SAP wohldokumentiert da reinprogrammiert hat. Das können wir * finden soviel wie wir wollen (ich hab nie behauptet, dass ich das Verhalten gut finde - ich hab das schlichtweg überhaupt nicht bewertet).

Wenn man mich nach meiner Meinung fragt (was keiner tut, was wiederum interessant ist), antworte ich: Die Aussage "EXPORTING" sagt "transportiere nach draußen". Das ist in meinen Augen eine deklarative Anweisung, weshalb die Variable implizit / automatisch gecleart gehört. Es gibt also nichtmal eine Meinungsverschiedenheit zwischen uns. Ich sage halt: Ja, es wäre toll, wenn die Erde eine Scheibe wäre, da bin ich genau deiner Meinung, aber die Macht des Faktischen zeigt uns: SIE IST ES NICHT!

Ich verschwende meine Zeit normalerweise nicht damit, mich über Dinge zu ärgern, die ich nicht ändern kann. Auch wenn mir oft die Gelassenheit fehlt, sie einfach so hinzunehmen.
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: EXPORTING = IMPORTING?

Beitrag von larsi (ForumUser / 47 / 2 / 11 ) »
Hallo zusammen,

ich habe jetzt selbst noch einmal ein paar Tests gemacht und folgende Erkenntnisse gewonnen. Folgende Aussagen, kann man so, ohne etwas genauer darauf einzugehen, m.E. jedenfalls nicht stehen lassen:
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.
ralf.wenzel hat geschrieben:Versuch mal bitte, einem EXPORTING-Parameter einen Wert mitzugeben, der dann in der Methode verarbeitet wird. Das geht schlicht nicht.
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.

Da möge man sich jetzt noch Fragen, welchen Sinn es macht, einen CHANGING-Parameter "by value" zu übergeben. Die Änderungen an so einem Parameter werden nur dann beim Aufrufer wirksam, wenn der Baustein/die Methode fehlerfrei verlassen wurde (das Kopieren der Werte findet erst ganz am Ende statt).

Folgende Links aus der Doku dazu: http://help.sap.com/abapdocu_740/de/abe ... _oview.htm und http://help.sap.com/abapdocu_740/de/abe ... _guidl.htm

Viele Grüße,
Lars

Re: EXPORTING = IMPORTING?

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Mönsch Jungs, nu macht mal wieder halblang!


Exporting verhält sich wie Changing. Der Meinung bin ich auch, denn ich kann den per "Exporting" angegebenen Parameter ändern:

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



Es ging mir auch gar nicht darum, eine Grundsatzdiskussion loszutreten, sondern darum, dass man eben die Augen offen halten muss.

Grade in dem Fall ist es halt ein nicht zu unterschätzender Stolperstein. Denn wenn ich eine Methode von RETURNING auf EXPORTING ändere, weil z. B. ein zweiter EXPORTING-Parameter dazu kommen muss, dann kann sich das rufende Programm deutlich anders verhalten als vorher.

Vergleichbare Themen

2
Antw.
508
Views
IMPORTING und EXPORTING bei Schnittstellen-Methoden
von mrsecret2307 » 26.04.2023 21:56 • Verfasst in ABAP® für Anfänger
11
Antw.
3591
Views
...using/importing value(xxx) type c[(n)]???
von Gast » 09.06.2005 18:47 • Verfasst in ABAP® für Anfänger
5
Antw.
3080
Views
I_TAB als IMPORTING Parameter
von abap-strizi » 19.12.2005 11:18 • Verfasst in ABAP Objects®
3
Antw.
1997
Views
Methodenparameter Importing TYPE Textelement
von snooze2 » 19.01.2006 14:22 • Verfasst in ABAP Objects®
1
Antw.
2020
Views
Field-Symbol als Importing Parameter
von tekko » 12.06.2021 18:23 • Verfasst in ABAP Objects®

Aktuelle Forenbeiträge

Trennen Strasse und Hausnummer
vor 10 Stunden von msfox 18 / 10979
Dialog-Container mit Toolbar/Status
vor 13 Stunden von black_adept gelöst 27 / 4097
IT0024 Qualifikationen CP-ID
vor 14 Stunden von ArjenR 1 / 104

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Trennen Strasse und Hausnummer
vor 10 Stunden von msfox 18 / 10979
Dialog-Container mit Toolbar/Status
vor 13 Stunden von black_adept gelöst 27 / 4097
IT0024 Qualifikationen CP-ID
vor 14 Stunden von ArjenR 1 / 104

Unbeantwortete Forenbeiträge

IT0024 Qualifikationen CP-ID
vor 14 Stunden von ArjenR 1 / 104
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 3037
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9630