Exporting-Parameter wird nicht initialisiert?!?

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
20 Beiträge • Vorherige Seite 2 von 2 (current)
20 Beiträge Vorherige Seite 2 von 2 (current)

Re: Exporting-Parameter wird nicht initialisiert?!?

Beitrag von DeathAndPain (Top Expert / 1806 / 214 / 396 ) »
gtoXX hat geschrieben:
08.05.2023 22:45
Nur weil deine Erwartung eine andere ist, ist sie deswegen nicht richtig. Zumal dein Performance-Argument absolut falsch ist. OO ist in keinem Stück Laufzeit intensiver.
Ist das so? Dann lies doch mal mit 7.40er-Syntax die Zeile einer internen Tabelle und reagiere darauf, wenn die entsprechende Zeile nicht gefunden wird. Einmal mit

Code: Alles auswählen.

zielfeld = VALUE #( internetabelle[ key = wert ] OPTIONAL ).
und einmal mit

Code: Alles auswählen.

TRY.
  zielfeld = internetabelle[ key = wert ].
  CATCH CX_SY_ITAB_LINE_NOT_FOUND.
  CLEAR zielfeld.
ENDTRY.
Und dann miss mal die Laufzeit beider Versionen für den Fall, dass es die Zeile nicht gibt. Dass ABAP in letzterem Falle ein EXCEPTION-Objekt erzeugt, kostet so dermaßen viel Zeit, dass es kaum zu glauben ist. Da wäre auch ein einfacher oldschool READ TABLE mit nachfolgender Prüfung des SY-SUBRC um Größenordnungen schneller.

Klar wird man das bei einer einzelnen Feldzuweisung nicht wirklich wahrnehmen. Aber solche Zuweisungen stehen ja gerne mal in LOOPs und werden dadurch ggf. tausende Male durchgeführt. Und dann ist das durchaus wahrnehmbar, wenn der Anteil der Fälle, bei denen es die Zeile nicht gibt, nicht nur geringfügig ist.
OO hat nur da nicht zu strukturierterem Code geführt weil die meisten die ABAP programmieren überhaupt keine Ahnung von Programmierung haben. Ich hab genug Leute mit >25 Jahren erfahrung gesehen die nur eines können : User-exits bedienen. Von Software-Architektur 0 Ahnung. Von OO , egal welchem 0 Ahnung. SAP größter Fehler war es überhaupt den alten Schrott lauffähig zu halten. Denn diese Leute können nicht mal saubere prozedurale Programmierung.
In Teilen gebe ich Dir da durchaus recht. Aber bei herkömmlicher Programmierung hat man eine recht gute Chance, sich durch Debugging die Funktionsweise des Codes zu erschließen. Bei OO kannste das in vielen Fällen vergessen. Wenn es keine sehr gute Dokumentation jedes einzelnen Objektes und seiner Attribute gibt, die genau das Sollverhalten des Objektes und Bedeutung der Attribute erläutert, dann versteht man nicht, was da passiert. Und dass in der Praxis niemand diese (erforderliche) Doku schreibt, das wissen wir alle.

Und auch wenn viele Leute strukturierte Programmierung nicht wirklich drauf haben, ist doch irgendwo das Prinzip in die Köpfe gehämmert worden, dass globale Variablen böse sind und nach Möglichkeit nicht verwendet werden sollten. Bei OO hingegen hat man sie - umbenannt in "Attribute" - für offiziell salonfähig erklärt, so dass sie seit OO wieder in Massen angewandt werden und man häufig sogar völlig parameterfreie Methodenaufrufe sieht.
EXPORTING ist vor allem einer Sache geschuldet : Ich muss es nicht abfragen, wenn ich es nicht will. CHANGING aber ist Pflicht, wenn es nicht optional deklariert wurde. Ergo hast Du die Logik noch nicht ganz verstanden ^^
Wenn Du glaubst, dass das der (gewollte) wesentliche Unterschied zwischen EXPORTING und CHANGING sein soll, dann bist Du derjenige, der hier ganz gewaltig etwas nicht verstanden hat.
Nun aus deiner Sicht gibt es keinen Sinn. Weil Du bei Exceptions die Resumable Option vergisst, auch wenn diese seltener genutzt wird. Es macht absolut Sinn das der alte Wert exakt so bleibt. Ich führe eine Option mit Fehler aus, catche den Fehler und setze die Ausführung fort. Das würde keinen Sinn machen, wenn mein Wert auf einmal weg wäre.
Bei einem CHANGING-Parameter würde ich Dir recht geben. Bei einem (aus Aufrufersicht) IMPORTING-Parameter hingegen macht der Aufrufer durch das IMPORTING (anstelle von CHANGING) deutlich, dass das Feld keinen alten Wert besitzt, der nach dem Aufruf noch irgendeine Relevanz besitzt. Wenn das im Einzelfall mal anders sein sollte, solltest Du die Methode mit einem temporären Feld für den Rückgabewert aufrufen.
Und man kann sich das auch sehr gut zu Nutze machen. Z.b. wenn man mehrere Zeilen einer Tabelle validiert. Ich schreibe einen Service der Inhalte validiert. z.b. bei einer Schnittstelle. Mein Service löst immer einen Fehler aus, wenn eines der Felder nicht passt. So kann ich ganz leicht ermitteln welche validen Werte übrig bleiben.

Ich schreibe mir vor dem Catch die fehlerfreien Werten per INSERT in eine Tabelle TAB_FEHLERFREI oder lösche einfach die Zeile aus meiner internen Tabelle im Catch. Trotz EXCEPTION bleibt mir der Inhalt erhalten, weil die Exception resumable ist. Danach verarbeite ich die Fehlerfreien Sätze, informiere den Anwender über die Fehlerhaften. Mit minimalem Coding-Aufwand.

Wo ist das Unsinn ?
Wenn ich Dich richtig verstehe, redest Du davon, dass Dein Service (a.k.a. Methode) die TAB_FEHLERFREI kumuliert und als EXPORTING-Parameter zurückliefert und Du, wenn es nach 20 fehlerfreien Werten zu einem fehlerhaften kommt, nicht die ganze Tabelle verlieren möchtest. Dagegen ist nichts einzuwenden, denn Du schaust hier ja aus Sicht des Unterprogramms, das die TAB_FEHLERFREI aufbaut.

Wenn allerdings der Aufrufer, der am Ende die Tabelle fehlerfreier Werte importieren möchte, Interesse daran hat, was vorher in der internen Tabelle dringestanden hat, die er Deinem Service zum Füllen übergeben hat, dann macht dieser Aufrufer in der Tat einen Fehler.

Es sei denn, Du meinst das so, dass der Aufrufer Deinen Service Wert für Wert aufruft und Dein Service bei jedem fehlerfreien Wert immer eine Zeile in der Tabelle ergänzt. Das wäre für mich aber ein klassischer Anwendungsfall eines CHANGING-Parameters.

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


Re: Exporting-Parameter wird nicht initialisiert?!?

Beitrag von black_adept (Top Expert / 3950 / 105 / 886 ) »
@D&P: Verwendest du eigentlich keine SLIN oder SCI? Da gibt es doch eine Prüfung irgendwo, die dich mittels Warnung auf fehlende Initialisierungen von EXPORTING-Parametern hinweist.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Exporting-Parameter wird nicht initialisiert?!?

Beitrag von DeathAndPain (Top Expert / 1806 / 214 / 396 ) »
Normalerweise nicht, nein. Manchmal mache ich eine "Erweiterte Programmprüfung", um meinen Code nochmal aufzuräumen (nicht verwendete Felder usw.).

Re: Exporting-Parameter wird nicht initialisiert?!?

Beitrag von black_adept (Top Expert / 3950 / 105 / 886 ) »
DeathAndPain hat geschrieben:
15.05.2023 03:59
Normalerweise nicht, nein. Manchmal mache ich eine "Erweiterte Programmprüfung", um meinen Code nochmal aufzuräumen (nicht verwendete Felder usw.).
😇 Wenn ich fortgeschrittene Noobs unter meine Fittiche bekomme ist das so ziemlich das Erste, was ich ihnen beibringe: SLIN mit allen aktivierten Prüfungen darf keine Meldungen mehr hervorgeben, bevor man ein Programm abgibt. Und man lernt schon beim Abarbeiten der Meldungen eine Menge, wenn man sich die Mühe macht nachzulesen warum die Meldung überhaupt kommt und man nicht ohne Nachzudenken direkt den Pseudokommentar oder das Pragma einsetzt.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Exporting-Parameter wird nicht initialisiert?!?

Beitrag von DeathAndPain (Top Expert / 1806 / 214 / 396 ) »
Die Sache ist die, dass ich in manchen Punkten so meine eigene Meinung habe, was programmtechnisch sinnvoll bzw. vertretbar ist und was nicht und SLIN insofern nicht als das Maß aller Dinge ansehe.

Vergleichbare Themen

3
Antw.
4379
Views
Funktionsbaustein interne Tabelle als Exporting Parameter
von sgoedde » 27.10.2008 12:53 • Verfasst in ABAP® für Anfänger
2
Antw.
683
Views
3
Antw.
2215
Views
Wie wird ein Frame initialisiert?
von ABAP_User » 05.12.2011 23:46 • Verfasst in ABAP Objects®
0
Antw.
1163
Views
Typkonflikt bei Exporting
von SwordMaster » 19.12.2007 06:48 • Verfasst in ABAP Objects®
26
Antw.
13246
Views
EXPORTING = IMPORTING?
von ewx » 14.12.2015 11:06 • Verfasst in ABAP Objects®

Aktuelle Forenbeiträge

CDS VIEWS aufsummieren von Werte
vor 10 Stunden von ZF_SAPler 3 / 40
Artikel automatisch in va01
vor 3 Tagen von wreichelt 2 / 55
langtexte beim Fertigungsauftrag
vor 3 Tagen von ByteMeBaby 7 / 6428
Updates der Daten, Fehlermeldung
vor 4 Tagen von Egzon gelöst 1 / 76

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

CDS VIEWS aufsummieren von Werte
vor 10 Stunden von ZF_SAPler 3 / 40
Artikel automatisch in va01
vor 3 Tagen von wreichelt 2 / 55
langtexte beim Fertigungsauftrag
vor 3 Tagen von ByteMeBaby 7 / 6428
Updates der Daten, Fehlermeldung
vor 4 Tagen von Egzon gelöst 1 / 76

Unbeantwortete Forenbeiträge

Updates der Daten, Fehlermeldung
vor 4 Tagen von Egzon 1 / 76
Zwischensumme Adobe Forms
letzen Monat von Lucyalison 1 / 316