IF-Abfrage / mehrteilige Bedingung

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

IF-Abfrage / mehrteilige Bedingung

Beitrag von anfaenger (ForumUser / 2 / 1 / 0 ) »
Hallo,

bin eigentlich kein Entwickler, mache aber gelegentlich Anpassungen. Ich habe eine Frage zu einer IF-Abfrage, die nicht so funzt wie ich möchte. Worauf muss ich achten, wenn ich mehrere Felder abfrage. Ich dachte, es würde reichen, wenn man das in Klammern packt, sodass die abgefragten Elemente nur für die Elemente innerhalb der Klammern gelten. In einem Test musste ich nun das Gegenteil erfahren.

Hier der Ausschnitt

if komkbv3-vkorg ne '10' and
( komkbv3-vkorg eq '20' and komkbv3-vtweg ne '02' ) --> hier möchte ich, dass der VTW 02 nur in Verbindung mit VKO 20 abgefragt wird. Auswirken tut sich das aber auch auf andere VKOs.
and komkbv3-vkorg ne '30'.
CHECK NOT komkbv3-netwr IS INITIAL.
ENDIF.
sy-subrc = 0.

Gruss

Anfaenger

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


Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Das mit den logischen Verknüpfungen AND und OR und den Klammern kannst Du Dir vorstellen wie Punkt- und Strichrechnung in der Mathematik, wobei AND die Punktrechnung und OR die Strichrechnung repräsentiert.

Wenn Du also

Code: Alles auswählen.

komkbv3-vkorg ne '10' and
( komkbv3-vkorg eq '20' and komkbv3-vtweg ne '02' )
and komkbv3-vkorg ne '30'
schreibst, dann haben die Klammern so viel Wirkung wie die in dem Ausdruck

3 * ( 4 * 5 ) * 6

Nämlich gar keine, da bei Multiplikation (und bei AND) das Assoziativgesetz gilt. Du könntest die Klammern also in Deinem Code beliebig anders setzen; das Ergebnis wäre immer dasselbe, da nur ANDs dabei sind. Eine Bedeutung erlangen Klammern nur, wenn Du z.B. AND und OR mischst und dabei nicht willst, dass das AND stärker binden soll als das OR (was es von Hause aus macht gemäß dem Grundsatz Punkt- vor Strichrechnung).

komkbv3-vkorg ne '10' and komkbv3-vkorg eq '20' ist natürlich witzlos, denn wenn komkbv3-vkorg = '20' ist, dann ist es offensichtlich auch ungleich '10'.

Aus Deinem Text geht nicht zweifelsfrei hervor, was genau Du machen willst, aber ich ahne, dass Du tatsächlich OR und wahrscheinlich ergänzend auch noch ELSEIF brauchst, wo Du AND geschrieben hast. Vielleicht meinst Du ja etwas in dieser Richtung:

Code: Alles auswählen.

if komkbv3-vkorg eq '20' and komkbv3-vtweg ne '02'.
...
elseif komkbv3-vkorg ne '10' and komkbv3-vkorg ne '30'.
...
endif.
Der CHECK-Befehl in Deinem Code macht auch nicht wirklich Sinn, denn der prüft ja auch nur eine (boolesche) Bedingung. Wenn der Folgeteil des IF tatsächlich nur den CHECK enthalten soll, dann kannste den IF auch komplett weglassen und die gesamte Bedingung in den CHECK reinbauen.

Aber wie gesagt, um Dir genauer sagen zu können, wie Dein Konstrukt aussehen muss, damit es das macht, was Du Dir wünschst, müsstest Du ganz detailliert in Worten beschreiben, was unter welchen Umständen passieren soll. Bislang ist mir das nicht klar.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
anfaenger


Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von anfaenger (ForumUser / 2 / 1 / 0 ) »
Vielen Dank für die ausführliche Beschreibung, schaue ich mir mal an.

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
Wobei man Klammern auch dann einsetzen kann, wenn sie keinen Effekt haben: Als Lesehilfe. Wenn n Fälle mit m Teilbedingungen da stehen, klammere ich die m's ein.


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

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Das ist Geschmacksache, aber mir sind als Lesehilfe Klammern in booleschen Ausdrücken unsympathisch. Da nehme ich lieber Absätze für und schreibe:

Code: Alles auswählen.

IF a AND b
OR c AND ( d OR e ).
   ...
ENDIF.
Da das "a AND b" auch nochmal einzuklammern bringt in meinen Augen keine Punkte, auch nicht hinsichtlich der Lesbarkeit. Man muss nur darauf achten, seine Absätze so zu setzen, dass sie mit der Bindungsstärke der verwendeten Schlüsselwörter übereinstimmen, damit die durch die Absätze erzeugten optischen Assoziationen richtig sind.

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Im übrigen habe ich nochmal drüber nachgedacht und glaube jetzt zu wissen, was er will. Nämlich:

Code: Alles auswählen.

if komkbv3-vkorg eq '20' and komkbv3-vtweg ne '02'
or komkbv3-vkorg ne '10' and komkbv3-vkorg ne '30'.
...
endif.
Mit anderen Worten: Der Code in der IF-Bedingung soll ausgeführt werden, wenn die VKORG weder 10 noch 30 ist und bei der 20 auch nur dann, wenn der VTWEG ungleich 02 ist.

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
DeathAndPain hat geschrieben:Da das "a AND b" auch nochmal einzuklammern bringt in meinen Augen keine Punkte, auch nicht hinsichtlich der Lesbarkeit. Man muss nur darauf achten, seine Absätze so zu setzen, dass sie mit der Bindungsstärke der verwendeten Schlüsselwörter übereinstimmen, damit die durch die Absätze erzeugten optischen Assoziationen richtig sind.
Hier möchte ich -ausnahmsweise- mal Ralf unterstützen. Der Ansatz mit dem absatzbasierten Gruppieren funktioniert leider nur bei hinreichend trivialen booleschen Ausdrücken und kurzen Variablennamen. Wenn das aber ein wenig komplexer wird, so dass die diversen AND-Teile nicht mehr auf eine Zeile passen ist eine saubere Klammerung nicht zu verachten, auch wenn sie überflüssig ist. Und wehe wenn SAP mal irgendwann eine neue Pretty-Printer-Einstellung in der GUI oder Eclipse erfindet, die diese Ausdrücke anders als geplant umbricht.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Wenn das aber ein wenig komplexer wird, so dass die diversen AND-Teile nicht mehr auf eine Zeile passen ist eine saubere Klammerung nicht zu verachten
Kannst Du dafür ein Beispiel nennen? In meinen Augen sollte sich alles mit Absätzen gliedern lassen. Wenn alle Stricke reißen, würde ich mehrzeilige Blöcke schaffen und dazwischen eine Leerzeile packen. Oder man entschließt sich sogar, das Logikgewirr auf mehrere IF-Statements aufzuteilen, um es zu entflechten, damit das nachvollziehbar und damit wartbar bleibt.
Und wehe wenn SAP mal irgendwann eine neue Pretty-Printer-Einstellung in der GUI oder Eclipse erfindet, die diese Ausdrücke anders als geplant umbricht.
Mein Pretty Printer ist oldschool eingestellt. Der macht nicht mehr, als alles großzuschreiben, so wie das zu 3.1-Zeiten obligatorisch war. :D An der Art und Weise, wie der "normale" Pretty Printer umbricht, habe ich sowieso etwas auszusetzen. Bei Befehlen wie CALL FUNCTION verteilt er mir den Befehl auf zu viele Zeilen, was in meinen Augen keinen Lesbarkeitsgewinn darstellt. So bin ich der Meinung, dass der erste Parameter auf dieselbe Zeile gehört wie das Schlüsselwort EXPORTING (und alle weiteren dann in Folgezeilen, aber vertikal an dem ersten ausgerichtet). Das ist wunderbar lesbar, ohne dass der Befehl bildschirmfüllend wird. Auch bei CASE-Blöcken mit nur kurzen, übersichtlichen Befehlen hinter jedem Fall packe ich WHEN und den Befehl auf dieselbe Zeile und halte damit den ganzen CASE-Block kurz und übersichtlich.

Der Pretty Printer würde mir das alles zerschlagen, deshalb habe ich ihn auf die Großschreibung reduziert. Zum Glück geht das identisch auch noch in Eclipse. :wink: Der Preis, den ich bewusst dafür zahle, ist, dass ich gelegentlich mal die Einrückung von 20 Zeilen manuell anpassen muss, wenn ich einen Programmblock umstrukturiert habe. Das dabei auftretende leichte Quietschen der Leertaste meiner klassischen Cherry G81-3000 habe ich mit Silikonspray aus der Welt geschafft, um die Kollegen nicht zu stören. Die müssen schon genug von dem regulären Tastengeklapper ertragen. :-D

Aber was den Pretty Printer angeht: ja, das ist ein Aspekt, den ich bei meinem eingangs Gesagten nicht im Auge gehabt habe. Wenn Du ein Programmierer bist, der regelmäßig die komplette Autoformatierung des Pretty Printers nutzt, dann wird letzterer Dir womöglich die händische, sorgsam gegliederte Einrückung Deines umfangreichen booleschen Ausdrucks über den Haufen schmeißen. In diesem Fall sind Klammern vielleicht wirklich besser.

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von Romaniac (Specialist / 221 / 65 / 27 ) »
Das schmieren der Leertaste kannst Dir aber doch sparen wenn die STRG Taste gedrückt haltest und mit der Maus dann vor Deinem z.b. 30 Zeilen Code nach unten markierst und dann mit der Tab Taste alle 30 Zeilen auf einmal einrückst? :D
Geht nicht gibts nicht

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
Das schmieren der Leertaste kannst Dir aber doch sparen wenn die STRG Taste gedrückt haltest und mit der Maus dann vor Deinem z.b. 30 Zeilen Code nach unten markierst und dann mit der Tab Taste alle 30 Zeilen auf einmal einrückst?
Oder was viele Leute nicht kennen, aber fast in allen Editoren funktioniert (sogar in Word) ist das blockweise (bzw. spaltentreue) Ausschneiden bzw. kopieren mit der ALT-Taste. Also ALT-Taste drücken, dann mit der Maustaste den gewünschten Bereich markieren und kopieren oder Ausschneiden und dann an gewünschter Stelle einfügen. Beim Einfügen muss man dann aber darauf achten, dass genügend Platz da ist, sonst wird überschrieben. Kann man auch zum Vertauschen von Spalten verwenden und vieles mehr.

Beispiel:
gegeben sei der folgende Zeilenblock
"...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
"...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
"...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
"...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
"...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
"...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
"...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
"...+....1....+....2....+....3....+....4....+....5....+....6....+....7..

und die Aufgabe ist folgendes Resultat zu erzielen:
"...+....1....+....2....+....4....+....3....+....5....+....6....+....7..
"...+....1....+....2....+....4....+....3....+....5....+....6....+....7..
"...+....1....+....2....+....4....+....3....+....5....+....6....+....7..
"...+....1....+....2....+....4....+....3....+....5....+....6....+....7..
"...+....1....+....2....+....4....+....3....+....5....+....6....+....7..
"...+....1....+....2....+....4....+....3....+....5....+....6....+....7..
"...+....1....+....2....+....4....+....3....+....5....+....6....+....7..
"...+....1....+....2....+....4....+....3....+....5....+....6....+....7..

Dann einfach die ALT-Taste drücken und mit der Maus ab der Spalte 3 bis vor 4 über alle Zeilen markieren und ausschneiden.
Sicherstellen, dass der Einfügemodus aktiv ist und dann den Cursor in der ersten Zeile vor der 5 positionieren und einfügen.

Wenn man daran mal gewöhnt ist, dann kann man sich viele manuelle Arbeiten ersparen.

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von Romaniac (Specialist / 221 / 65 / 27 ) »
Genau das meine ich, ist ein sehr cooles Feature im Editor! Und es ist natürlich die ALT Taste :up:
Geht nicht gibts nicht

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Romaniac hat geschrieben:Das schmieren der Leertaste kannst Dir aber doch sparen wenn die STRG Taste gedrückt haltest und mit der Maus dann vor Deinem z.b. 30 Zeilen Code nach unten markierst und dann mit der Tab Taste alle 30 Zeilen auf einmal einrückst? :D
Wo geht das? In der SE38? In Eclipse? Normal müsste der Tab doch die Markierung ersetzen?!? Und wieviel rückt der TAB dann ein? Üblich sind ja 2 Spaces (so mache ich es auch immer). Stattdessen um ein Tabzeichen einrücken fände ich unsauber. Oder macht die SE38 oder Eclipse das so, dass er den Tab dann zeilenweise durch zwei Spaces ersetzt? Wäre natürlich ein nettes Feature, kann ich aber grad nicht ausprobieren, da ich im Moment nicht auf Arbeit bin.

Und wie würde man das in der Gegenrichtung machen (alles zwei Spaces weniger einrücken)?

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von Romaniac (Specialist / 221 / 65 / 27 ) »
Hallo DeathAndPain,

Ich wollte jetzt mal so ein Video aufzeichnen mit einem Windows Tool das ich gefunden habe (PSR.EXE) aber mit der CITRIX Anwendung hat das Tool wohl ein Problem. Also versuche ich es mal zu beschreiben, funktioniert in der SE38:

- Einrücken:
+ Du kannst an jeder beliebigen Stelle im Code den Cursor setzen,
+ die Taste ALT gedrückt halten
+ und dann mit dem Cursor nach unten ziehen (man sieht die Markierung nicht!)
+ Wenn Du jetzt Tab drückst rückt der gesamte Block und Deine eingestellte TAB Weite (2) nach rechts
+ Mit UMSCHALT+TAB geht das ganze dann um 2 Stellen nach links

- Block ersetzen:
Nehmen wir an Du fügst in eine bestehende Struktur am Ende 20 neue Felder ein und bist so faul wie ich:
+ Ich drücke 20 mal STRG+D (=aktuelle Zeile an der der Cursor steht darunter einfügen, verdoppeln praktisch)
+ dann SE11, 20 Feldnamen aus Strukur markieren (STRG+Y) und kopieren (STRG+C)
+ Der aus der SE11 mit STRG+Y markierte Block kann leider nicht direkt verwendet werden, ich kopiere den meistens unter die Struktur ganz links, drücke dann wieder ALT, markiere und kopiere den Block mit STRG+C (Block wird dann schwarz)
+ jetzt im SE38 Editor den Cursor vor den Namen des ersten kopierten Feldes setzen, ALT gedrückt halten und alle 20 doppelten Feldnamen markieren (Block wird dann schwarz)
+ jetzt STRG+V -> alle Feldnamen aus der SE11 Struktur überschreiben die markierten Felder in meiner Struktur
+ Das Ganze für die Datenelemente wiederholen
-> Ist nur ein Beispiel, das kann man natürlich auch mit Muster einfügen -> Felder aus Struktur machen. Aber wenn mit bei Typdefinitionen mit Like oder bei Zuweisungen Strukturen gearbeitet wird erleichtert es das ersetzen von mehreren Feldern hinter dem Bindestrich.

->Zusammengefasst kann man sagen: Mit ALT markierte und kopierte Blöcke kann man beliebig in mit ALT markierten Blöcken einsetzen, man muss halt auf die gleiche Zeilen und Spaltenanzahl achten beim einsetzen.

Und noch was habe ich entdeckt:
+ wenn man z.B. in einer Struktur vor dem ersten Feldnamen mit ALT eine Spalte mit 10 Zeilen markiert(sieht man nicht) und dann ein Zeichen z.B. "2" drückt wird vor jedem Feldnamen eine "2" eingefügt
+ oder man markiert das erste zeichen aller 10 Zeilen und drück dann 2, dann wird von jedem Feldnamen das erste Zeichen mit 2 überschrieben.
-> Sprich in jedem mit ALT markierten Block kann ich beliebige Zeichenfolgen schreiben, diese werden in alle markierten Zeilen kopiert.

Mit STRG+U kann ich einen markierten text in Großbuchstaben setzen(bei Textliteralen sinnvoll), mit STRG-L in Kleinbuchstaben

Am besten alles mal ausprobieren

Das Ganze habe ich übrigens aus dem Buch "ABAP für faule Säcke" ;-) Nein, aus ABAP Workbench 100 Tipps & Tricks S.33, von SAP PRESS.

Und jetzt viel Spaß beim coden,

Gruß Wolfgang
Geht nicht gibts nicht

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Danke, das ist sehr interessant. Im allgemeinen code ich allerdings nicht mehr in der SE38, sondern in Eclipse, da ich die Art und Weise, wie die SE38 mir den Cursor positioniert, überhaupt nicht mag. Ich war ein großer Fan des Backend-Editors, den die SAP aber leider mit Release 7.50 final abgekniffen hat. Da ich also eh umlernen musste, bin ich gleich auf den ganz neuen Kram umgestiegen.

Re: IF-Abfrage / mehrteilige Bedingung

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
Als jemand, der den Backend-Editor kaum kennt: Was sind (stichpunktartig) die Vor- und Nachteile?


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

Vergleichbare Themen

38
Antw.
5550
Views
Zeitliche Abfrage mit Bedingung
von Abaphalbsocke » 22.05.2018 12:00 • Verfasst in ABAP® für Anfänger
6
Antw.
2295
Views
WHERE Bedingung
von cali » 04.04.2006 12:39 • Verfasst in ABAP® Core
7
Antw.
3594
Views
Where-Bedingung
von Fools » 07.06.2005 16:52 • Verfasst in ABAP® für Anfänger
4
Antw.
3711
Views
Date in WHERE-Bedingung
von reichi » 04.12.2012 19:29 • Verfasst in ABAP® für Anfänger
2
Antw.
10629
Views
Select where Bedingung mit @
von Niels » 11.12.2015 10:11 • Verfasst in ABAP® für Anfänger

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 4 Stunden von DeathAndPain gelöst 22 / 2796
Daten an Tabelle binden
vor 9 Stunden von Lukas Sanders 2 / 874
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 430

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

Dialog-Container mit Toolbar/Status
vor 4 Stunden von DeathAndPain gelöst 22 / 2796
Daten an Tabelle binden
vor 9 Stunden von Lukas Sanders 2 / 874
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 430

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2466
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9050