IF mit AND und OR

Getting started ... Alles für einen gelungenen Start.
4 Beiträge • Seite 1 von 1
4 Beiträge Seite 1 von 1

IF mit AND und OR

Beitrag von Manfred K. (ForumUser / 49 / 0 / 0 ) »
Hallo zusammen,

ich habe Schwierigkeiten mit der if-Bedingung:

wie realisiere ich das?

Wenn eine Kostenstelle + Sachkonto oder eine Anlagenummer eingegeben werden

if ( kostl is initial and sachk is initial ) or anlnr is initial.
lv_fehler = 'x'.
endif.

Das Problem ist wenn Kostenstelle + Sachkonto gefüllt ist und Anlagennummer nicht gefüllt ist, springt er mir trotzdem in die Anweisung. -> lv_fehler = 'x'.

Danke schonmal.

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


Re: IF mit AND und OR

Beitrag von wreichelt (Top Expert / 1069 / 31 / 193 ) »
Hallo,

ich bin kein Spezialist für OR AND und das mit Klammern. Aber probiere mal

IF ( kostl IS INITIAL AND sachk IS INITIAL ) OR ( anlnr IS INITIAL ).
lv_fehler = 'X'.
ENDIF.


Gruß Wolfgang

Re: IF mit AND und OR

Beitrag von PeterPaletti (Specialist / 367 / 33 / 102 ) »
Ich würde

Code: Alles auswählen.

IF ( kostl IS INITIAL OR sachk IS INITIAL ) AND ANLNR IS INITIAL. 
 lv_fehler = 'X'. 
ENDIF.
versuchen.

Wenn Kostenstelle + Sachkonto gefüllt sind, ist die 1. Teilbedingung unwahr und also die komplette Bedingung unwahr. -> lv_fehler <> 'X'

Wenn die Anlagennummer gefüllt ist, ist die 2. Teilbedingung unwahr, und also die komplette Bedingung unwahr. -> lv_fehler <> 'X'

Re: IF mit AND und OR

Beitrag von LeMinion (ForumUser / 22 / 1 / 7 ) »
Ist nicht mein Fachgebiet, wenn ich so Dinge wie "Sachkonto" und "Kostenstelle" lese, also könnte ich rein fachlich ev. nicht mitreden, und mir kommt Dein Satz "Wenn eine Kostenstelle + Sachkonto oder eine Anlagenummer eingegeben werden" unvollständig vor – weswegen ich nicht sicher bin, was die Bedingungen sind, von denen Du hier sprichst.
Daher erst mal meine Vermutung, daß alles in Ordnung ist, wenn entweder Sachkonto und Kostenstelle angegeben sind oder die Anlagennummer. Unter dieser Voraussetzung also das Folgende, wenn die also schon falsch ist, ist das sachlicher dahinter genauso falsch. 😉

Positiv formuliert würde die Bedingung also so aussehen, wenn man herausfinden möchte, ob alles in Ordnung ist, also kein Fehler vorliegt:

Code: Alles auswählen.

IF sachk IS NOT INITIAL AND kostl IS NOT INITIAL OR anlnr IS NOT INITIAL.
  error = abap_false.
ELSE.
  error = abap_true.
ENDIF.
Jetzt könntest Du eigentlich einfach sagen, wenn diese positive Bedingung nicht erfüllt ist, dann handelt es sich um einen Fehler, warum also nicht einfach:

Code: Alles auswählen.

IF NOT ( sachk IS NOT INITIAL AND kostl IS NOT INITIAL OR anlnr IS NOT INITIAL ).
  error = abap_true.
ENDIF.
Diese positive Formulierung läßt sich nicht so einfach umkehren ohne das NOT zu verwenden, denn für mich ist zum Beispiel nicht klar, ob es sich auch um einen Fehler handelt, wenn Du eine Anlagennummer und eins oder beide der anderen beiden Felder angegeben hast. Wenn es wirklich ein klassisches entweder-oder ist, dann hieße die positive Formulierung nämlich auch anders:

Code: Alles auswählen.

IF NOT ( 
  sachk IS NOT INITIAL AND kostl IS NOT INITIAL AND anlnr IS INITIAL 
  OR 
  sachk IS INITIAL AND kostl IS INITIAL AND anlnr IS NOT INITIAL 
).
  error = abap_true.
ENDIF.
Hier kommt es zum Fehler, wenn ein Mischfall vorliegt, also z.B. alle drei Felder ausgefüllt sind.

Generell emfpehle ich bei solchen Hirnzwiebeln aber, daß man die Bedingungen einzeln angibt, um auch später den Durchblick zu haben. Kommentare können das nicht immer so gut rüberbringen, vor allem, wenn sie vor einem Coding stehen, daß trotz Kommentar verworren wirkt. 😉

Code: Alles auswählen.

DATA(isAccountValid) = xsdbool( sachk IS NOT INITIAL AND kostl IS NOT INITIAL ).
DATA(isAssetNumberValid) = xsdbool( anlnr IS NOT INITIAL ).
Dann formuliert bzw. liest sich das ev. etwas besser, denn Du solltest nie vergessen, daß (Dein) Coding sehr viel häufiger gelesen als geschrieben wird, also lohnt es sich, sich eingehende Gedanken zur Lesbarkeit und Verständlichkeit des Codings zu machen, das ist, solange Du es nicht übertreibst, niemals Zeitverschwendung.

Code: Alles auswählen.

IF isAccountValid = abap_false AND isAssetNumberValid = abap_false.
  error = abap_true.
ENDIF.

Seite 1 von 1

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.