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.