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 ).
Code: Alles auswählen.
TRY.
zielfeld = internetabelle[ key = wert ].
CATCH CX_SY_ITAB_LINE_NOT_FOUND.
CLEAR zielfeld.
ENDTRY.
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.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.
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.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 ^^
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.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.
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.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 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.DeathAndPain hat geschrieben: ↑15.05.2023 03:59Normalerweise nicht, nein. Manchmal mache ich eine "Erweiterte Programmprüfung", um meinen Code nochmal aufzuräumen (nicht verwendete Felder usw.).