[Rant] Unzulänglichkeit des LINE_EXISTS()

Getting started ... Alles für einen gelungenen Start.
22 Beiträge • Seite 1 von 2 (current) Nächste
22 Beiträge Seite 1 von 2 (current) Nächste

[Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Hallo zusammen,

Eigentlich ist LINE_EXISTS() ja eine sehr schöne eingebaute 7.40-Funktion, mit der man unter Nutzung von 7.40-Syntax auf die Existenz von Tabellenzeilen prüfen kann, ohne im Falle des Nichtvorhandenseins der Tabellenzeile in einen CX_SY_ITAB_LINE_NOT_FOUND zu laufen und dafür einen sperrigen TRY...CATCH...ENDTRY-Block zu benötigen.

Aber jetzt habe ich das mal für eine geschachtelte Prüfung gemacht, und da versagt der LINE_EXISTS(). Ich codete:

CHECK LINE_EXISTS( BUFFER_DLL_ROLE_ASSIGNMENTS[ TABLE_LINE = BUFFER_UNAME[ PERNR = PERNR ]-USRID ] ).

Als es eine bestimmte Personalnummer in BUFFER_UNAME nicht gab, bekam ich dennoch den CX_SY_ITAB_LINE_NOT_FOUND. Das ist doch Mist! Kann die SAP nicht auch mal was ordentlich machen? Ich weiß, man kann das sprachenlogisch begründen, aber ich hätte mir gewünscht, dass sie den LINE_EXISTS() so pfiffig implementieren, dass er auch weiter innen geschachtelte Nichtfunde abfängt. Schließlich ist klar, dass es eine Tabellenzeile nicht geben kann, wenn eine Spalte daraus gleich einer Spalte einer nichtexistenten Zeile einer anderen Tabelle sein muss.

Klar lässt sich das umgehen mit:

ASSIGN BUFFER_UNAME[ PERNR = PERNR ]-USRID TO FIELD-SYMBOL(<USRID>).
CHECK SY-SUBRC = 0.
CHECK LINE_EXISTS( BUFFER_DLL_ROLE_ASSIGNMENTS[ TABLE_LINE = <USRID> ] ).


Alternativ mit dem bereits erwähnten TRY...CATCH...ENDTRY. Aber das ist nicht annähernd so schlank und elegant wie der erste Code! [/rant]

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


Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von lausek (ForumUser / 64 / 2 / 20 ) »
Also ich kann diesen Rant ganz ehrlich nicht nachvollziehen. Wie oft hast du denn den Fall, dass du verschachtelt auf eine Zeile prüfen willst? Das sieht für mich stark nach einem Edgecase aus, der sich aus SAP-Sicht einfach nicht umzusetzen lohnt.

Außerdem wäre es ja ein eher fataler Fehler, wenn einfach übersprungen wird, sollte ein geschachtelter Ausdruck nicht existieren. Wenn schon das befüllen des Puffers aus irgendeinem Grund nicht geklappt hat, ist die Wahrscheinlichkeit höher, dass das später nichtmal auffällt. Ne ne, dann soll er mir lieber gleich die Exception ins Gesicht drücken. Dann weiß ich wenigstens, dass ich ein Problem habe.

Über elegant lässt sich auch streiten. Ich hab zum Beispiel lieber drei kurze Zeilen, als eine ewig lange.

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Schlag mich tot, aber für mich wäre das ein erwartetes Verhalten. Warum soll die Ausnahme denn nicht geworfen werden?


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

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von tm987456 (ForumUser / 72 / 42 / 14 ) »
CHECK LINE_EXISTS( BUFFER_DLL_ROLE_ASSIGNMENTS[ TABLE_LINE = VALUE #( BUFFER_UNAME[ PERNR = PERNR ]-USRID OPTIONAL ) ] ).

Funktioniert VALUE mit OPTIONAL an der Stelle nicht?

Gruss
tm

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
lausek hat geschrieben:Also ich kann diesen Rant ganz ehrlich nicht nachvollziehen. Wie oft hast du denn den Fall, dass du verschachtelt auf eine Zeile prüfen willst? Das sieht für mich stark nach einem Edgecase aus, der sich aus SAP-Sicht einfach nicht umzusetzen lohnt.
Da hat die SAP schon ganz andere Edge Cases umgesetzt. Der ganze FOR-Befehl gehört meines Erachtens dazu, aber auch viele Spezialfälle anderer Befehle. LINE_EXISTS ist hingegen ein sehr nützlicher Ausdruck, den ein 7.40-Programmierer viel verwendet.

Davon abgesehen halte ich die Umsetzung für nicht schwer: Der LINE_EXISTS muss einfach nur immer dann false werfen, wenn es in seinem Inneren zu einer Ausnahme des Typs CX_SY_ITAB_LINE_NOT_FOUND kommt, andernfalls false. Das wäre möglicherweise sogar leichter zu implementieren gewesen als das, was die SAP da gemacht hat.
Ralf hat geschrieben:Schlag mich tot
Das hast Du gesagt! :-D
Ralf hat geschrieben:aber für mich wäre das ein erwartetes Verhalten. Warum soll die Ausnahme denn nicht geworfen werden?
Weil LINE_EXISTS die herkömmlichen Regeln ja genau an dieser Stelle zu durchbrechen pflegt. Normalerweise werden logische Ausdrücke ja von innen nach außen, also beginnend mit der innersten Klammer, ausgewertet. Damit müsste ein

CHECK LINE_EXISTS( BUFFER_UNAME[ PERNR = PERNR ] ).

schon auf einen CX_SY_ITAB_LINE_NOT_FOUND laufen, wenn der BUFFER_UNAME-Ausdruck ausgewertet wird, so dass es zur Anwendung des umschließenden LINE_EXISTS gar nicht mehr kommt. Aber LINE_EXISTS ist eben ein Sonderfall, der gerade dafür gemacht ist, solche Nichtfunde exceptionfrei zu behandeln und der vom Interpreter daher anders behandelt wird. Das Konzept finde ich gut, nur hätten sie es bis zum Ende umsetzen und auch auf weiter innen geschachtelte Tabellenausdrücke anwenden sollen, denn wenn es die nicht gibt, dann gibt es die vom LINE_EXISTS zu prüfende Tabellenzeile ja auch nicht.
tm987456 hat geschrieben:CHECK LINE_EXISTS( BUFFER_DLL_ROLE_ASSIGNMENTS[ TABLE_LINE = VALUE #( BUFFER_UNAME[ PERNR = PERNR ]-USRID OPTIONAL ) ] ).

Funktioniert VALUE mit OPTIONAL an der Stelle nicht?
Erstmal danke; den OPTIONAL kannte ich noch nicht. Deine Syntax funktioniert. Hab mir die Doku dazu durchgelesen; der kann sicherlich nochmal nützlich sein.

In diesem Falle wäre es freilich nur ein weiterer Workaround, bei dem man sich darüber streiten kann, ob er angesichts des zusätzlichen VALUE-Operators besser oder schlechter ist als TRY...CATCH...ENDTRY (und ob die Raute an dieser Stelle funktioniert; die meckert er ja ggf. erst zur Laufzeit an, auch wenn es durchaus möglich wäre, den Typ statisch abzuleiten, wie jeder weiß, der mal versucht hat, einen APPEND VALUE #( ... ) zu nutzen). Trotzdem gut, diese Option zu kennen!

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Also, LINE_EXISTS hat sicher nicht den Grund, exceptionfrei zu arbeiten. Der Sinn der Anweisung ist der Einsatz an Operandenpositionen. Wenn *in* dem IF etwas steht, was eine exc auslöst, muss die auch ausgelöst werden, egal was außen rum steht, denn sonst kann ich diesen spezifischen Fehler ja gar nicht behandeln. Das magst DU jetzt nicht wollen, aber abwegig ist das nicht. Deine innere Anweisung ist vom Prinzip her ein READ TABLE, insofern erwarte ich genau das von dir beschriebene Verhalten.


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

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Du hast das, was ich Dir geantwortet habe, ignoriert. Wenn Deine Argumentationskette zutreffend wäre, dann müsste jeder LINE_EXISTS eine Exception werfen, sobald es die Tabellenzeile nicht gibt. Damit wäre er freilich nicht mehr zu gebrauchen.

Du hast kein Argument genannt, weshalb das bei der äußersten Tabellenabfrage innerhalb des LINE_EXISTS anders sein soll als bei den inneren. Wenn man Dir folgt und starr sagt, Exceptions sind Exceptions, an denen darf nicht gerüttelt werden, dann muss man auch dort im LINE_EXISTS eine werfen (und den Befehl anschließend wegen nutzlos außer Dienst stellen).

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Du hast mein Posting nicht verstanden. Nicht der LINE_EXISTS wirft die Ausnahme, sondern der Tabellenausdruck BUFFER_UNAME[PERNR = PERNR]. Und das ist absolut korrekt.

Das ist so, als würdest du dich beschweren, dass der Ausdruck

IF 5 < ( 3/ 0 )

ein Division durch Null wirft.


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

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Ich fürchte eher, dass Du mein Posting nicht verstanden hast. Nach Deiner Logik müsste nämlich bei

IF LINE_EXISTS( meinetabelle[ spalte1 = 'X' ] )

eine Ausnahme geworfen werden, wenn meinetabelle solch Zeile nicht enthält. Der umschließende LINE_EXISTS käme dann gar nicht mehr zum Zuge, da ja wie immer von innen nach außen ausgewertet wird und das meinetabelle[ spalte1 = 'X' ] die Ausnahme erzeugt. Der LINE_EXISTS wäre folglich nutzlos.

Da dies jedoch nicht der Fall ist, ist die von Dir postulierte Logik bei LINE_EXISTS() ohnehin schon durchbrochen. Und da verstehe ich nicht, weshalb man das nicht richtig gemacht und dies auf alle Tabellenzeilenabfragen innerhalb des LINE_EXISTS ausgeweitet hat gemäß der Devise, dass es die von LINE_EXISTS zu prüfende Tabellenzeile nicht geben kann, wenn es schon eine Tabellenzeile nicht gibt, aus der sie sich aufbaut.

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Wie erkläre ich dir bloß, dass

CHECK LINE_EXISTS( BUFFER_DLL_ROLE_ASSIGNMENTS[ TABLE_LINE = BUFFER_UNAME[ PERNR = PERNR ]-USRID ] ).

ein LINE_EXISTS mit einem zusätzlichen (rot markierten) Tabellenausdruck ist,

IF LINE_EXISTS( meinetabelle[ spalte1 = 'X' ] )

aber nicht?


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

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Genau davon rede ich doch. Tabellenausdrücke sind beides, nur dass es in meinem Fall noch einen inneren gibt. Beim äußeren fängt LINE_EXISTS den Dump ab, beim inneren nicht. Das finde ich nicht sinnvoll.

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
DeathAndPain hat geschrieben:Genau davon rede ich doch. Tabellenausdrücke sind beides, nur dass es in meinem Fall noch einen inneren gibt. Beim äußeren fängt LINE_EXISTS den Dump ab, beim inneren nicht. Das finde ich nicht sinnvoll.
Ich schon, weil der eine Teil des LINE_EXISTS ist und der andere nicht. Das finde ich sowas von transparent, dass ich dafür kaum Worte finde.


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

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
weil der eine Teil des LINE_EXISTS ist und der andere nicht
Genau das ist der Punkt, an dem wir deutlich unterschiedlicher Meinung sind. Für mich ist entweder keiner von beiden Teil des LINE_EXISTS (reguläre Ausdrucksauswertung von innen nach außen), oder sie sind es beide (LINE_EXISTS übersteuert innerhalb seiner Klammern die reguläre Ausdrucksauswertung). Was die SAP hier gemacht hat, ist nicht Fisch und nicht Fleisch. Fisch höchstens insofern: https://gifrific.com/wp-content/uploads ... n-Head.gif

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Du siehst keinen Unterschied zwischen den beiden Ausdrücken?

Sehr komisch. Aber daran sieht man, dass die es eh keinem recht machen können. Sonst hätte ich irgendwann geschrieben, dass mir die Ausnahme fehlt ;)


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

Re: [Rant] Unzulänglichkeit des LINE_EXISTS()

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
ralf.wenzel hat geschrieben:Du siehst keinen Unterschied zwischen den beiden Ausdrücken?

Sehr komisch. Aber daran sieht man, dass die es eh keinem recht machen können. Sonst hätte ich irgendwann geschrieben, dass mir die Ausnahme fehlt ;)
Ich geb DeathAndPain insofern recht, dass man den Ausdruck innerhalb des LINE_EXISTS auch als ganzes werten könnte, ähnlich einem EVAL in JavaScript.

Wie du schon angedeutet hast, hat der "getrennte" Ansatz den SAP hier verfolgt, auch sein Gutes: So weiß man dank der Exception wenigstens welcher der beiden Ausdrücke fehlgeschlagen ist. Ich denke hier vor allem an Edge-Cases die im Entwicklungssystem vielleicht nicht auftreten, aber dann auf Produktiv passieren können. Wenn man das dann debuggen will, steht man sonst vor dem Rätsel welcher Ausdruck in einer längeren []-Kette eigentlich der Übeltäter ist.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ralf.wenzel

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

Vergleichbare Themen

3
Antw.
2662
Views
exists Befehl
von bohne » 11.12.2006 09:55 • Verfasst in ABAP® für Anfänger
4
Antw.
6766
Views
Select .. where exists
von Bzzt » 04.12.2006 11:17 • Verfasst in ABAP® für Anfänger
2
Antw.
14805
Views
WRITE und NEW-LINE
von dyv » 08.09.2014 14:34 • Verfasst in ABAP® für Anfänger
1
Antw.
1535
Views
modify line mit icon
von manuk » 09.11.2005 08:35 • Verfasst in Dialogprogrammierung
3
Antw.
3747
Views
Hide und At Line Selection
von le_fuka » 10.08.2012 09:10 • Verfasst in ABAP® für Anfänger

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.

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Tagen von Lucyalison 1 / 72
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141