IF Bedingung nicht erfüllt, dennoch ausgeführt

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 Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von mydigitalme (ForumUser / 3 / 0 / 0 ) »
Hallo zusammen,

ich bin noch recht neu im Abap Umfeld und wundere mich über folgendes Problem.
Hier mein Codeschnipsel:

LOOP AT lt_status ASSIGNING FIELD-SYMBOL(<fs_status>).
IF <fs_status>-txt04 <> 'RP01'
OR <fs_status>-txt04 <> 'RP15'.
lv_rccheck = '1'.
ENDIF.

ENDLOOP.

Mein Problem ist, dass obwohl <fs_status>-txt04 ungleich RP01 und RP15 ist, die Variable lv_rccheck auf 1 gesetzt wird.
Ich habe bereits einige Testfälle angelegt und im Debugger durchlaufen, kann aber einfach nicht nachvollziehen, warum hier die if Bedingung als erfüllt angesehen wird.

Könnt ihr mir helfen?

Gruß

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


Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Mein Problem ist, dass obwohl <fs_status>-txt04 ungleich RP01 und RP15 ist, die Variable lv_rccheck auf 1 gesetzt wird.
Ja, dann ist Deine IF-Bedingung ja auch erfüllt?! OR ist kein exklusives OR. Das heißt, dass OR nicht nur dann erfüllt ist, wenn eine der Bedingungen zutrifft, sondern auch, wenn beide zutreffen (wenn also auch AND erfüllt wäre). Tatsächlich ist Dein IF sogar IMMER erfüllt, denn das Feldsymbol kann ja nicht gleichzeitig zwei verschiedene Werte einnehmen, wird also immer ungleich (mindestens) einem der beiden Werte sein.

Falls Du Dich nur verschrieben hast, könnte ich mir noch vorstellen, dass es mit den Literalen zusammenhängt. Lass Dein Feldsymbol als String typisiert sein und er interpretiert die Literale als C(4), dann wäre sowas denkbar. So einen ähnlichen Fall hatte ich vor einiger Zeit. In Deinem Fall hätte ich das allerdings nicht erwartet; da pflegt er eigentlich typgerecht zu wandeln, bevor er vergleicht.

Aber das kannst Du ja leicht nachprüfen, indem Du am Anfang

CONST RP01 type string value 'RP01'.

schreibst und dann mit der Konstanten vergleichst.

Vielleicht kannst Du es auch hinkriegen, indem Du diese neumodischen Hochkommas ` anstelle der herkömmlichen ' verwendest.
Zuletzt geändert von DeathAndPain am 17.07.2017 11:45, insgesamt 1-mal geändert.

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
Es ist völlig egal was in deiner Variablen drinsteht - lv_rccheck wird immer auf 1 gesetzt werden.
Wenn die Variable = RP01 ist, ist sie ungleich RP15 und daher wird der 2. Teil der IF-Bedingung wahr.
Wenn die Variable <> RP01 ist, wird er 1. Teil der IF-Bedingung wahr.
Da das Ganze mit OR verknüpft ist, ist die IF-Bedingung immer wahr.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Das ist mir dann auch aufgefallen. Auf die Sekunde genau als Du Deine Antwort gesendet hast, habe ich auch meinen Beitrag entsprechend geupdatet. 8) Es ist eine Tautologie.

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von mydigitalme (ForumUser / 3 / 0 / 0 ) »
Danke für eure Antworten.
Ich habe das Coding jetzt mal folgendermaßen abgeändert:

LOOP AT lt_status ASSIGNING FIELD-SYMBOL(<fs_status>).
IF <fs_status>-txt04 NE 'RP01'.
IF <fs_status>-txt04 NE 'RP15'.
lv_rccheck = '1'.
ENDIF.
ENDIF.

Und trotzdem wird die Variable nicht auf 1 gesetzt, wenn txt04 z.B. RP03 ist.
Verstehe ich nicht :?

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Also ich finde von Programmablauf her keinen Fehler an deiner Lösung:

Code: Alles auswählen.

REPORT zTest.

TYPES:
  BEGIN OF ts_status,
    txt04 TYPE text04,
    str04 TYPE string,
    txt10 TYPE text10,
    str10 TYPE string,
  END OF ts_status,
  tt_status TYPE STANDARD TABLE OF ts_status WITH DEFAULT KEY.

DATA:
  lt_status  TYPE tt_status,
  lv_rccheck TYPE char1.

APPEND VALUE #( txt04 = 'RP03' str04 = 'RP03' txt10 = 'RP03' str10 = `RP03          ` ) TO lt_status.

LOOP AT lt_status ASSIGNING FIELD-SYMBOL(<fs_status>).
"#1 Text ohne Leerzeichen
  IF <fs_status>-txt04 NE 'RP01'.
    IF <fs_status>-txt04 NE 'RP15'.
      lv_rccheck = '1'.
    ENDIF.
  ENDIF.
"#2 String ohne Leerzeichen
  IF <fs_status>-str04 NE 'RP01'.
    IF <fs_status>-str04 NE 'RP15'.
      lv_rccheck = '1'.
    ENDIF.
  ENDIF.
"#3 Text mit Leerzeichen
  IF <fs_status>-txt10 NE 'RP01'.
    IF <fs_status>-txt10 NE 'RP15'.
      lv_rccheck = '1'.
    ENDIF.
  ENDIF.
"#4 String mit Leerzeichen
  IF <fs_status>-str10 NE 'RP01'.
    IF <fs_status>-str10 NE 'RP15'.
      lv_rccheck = '1'.
    ENDIF.
  ENDIF.
ENDLOOP.
Selbst die Stringprüfungen (#2 und #4) funktionieren.

Ich würde darauf tippen, dass in der ursprünglichen Tabelle (LT_STATUS) etwas nicht passt. Wie siehts dort z.B. mit Groß-/Kleinschreibung usw. aus?
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

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Ja, es wäre sicherlich am besten, wenn Du mal den gesamten fraglichen Code posten würdest.

Im übrigen sind die geschachtelten IFs nicht gerade schöner Stil. Besser wäre:

Code: Alles auswählen.

IF <fs_status>-txt04 <> 'RP01' AND <fs_status>-txt04 <> 'RP15'.
  lv_rccheck = '1'.
ENDIF.
Und so richtig 8) wäre:

Code: Alles auswählen.

IF 'RP01;RP15' NS <fs_status>-txt04.
  lv_rccheck = '1'.
ENDIF.

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


Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
Übersichtlich / Gut lesbar finde ich bei einer Aufzählung die CASE-Anweisung. Und bei einer negativen Liste halt dann das OTHERS mit leerer WHEN-Bedingung

Code: Alles auswählen.

CASE <fs_status>-txt04.
  WHEN 'RP01'
    OR 'RP15'. " nichts tun -  die sind ok
  WHEN OTHERS.
    lv_rccheck = '1'.
ENDCASE.  

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
wreichelt

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Die CASE-Lösung habe ich auch favorisiert, bis ich auf die mit dem NS/CS gekommen bin. Die ist viel kürzer und wenn man einmal begriffen hat, wie sie funktioniert, IMHO auch besser lesbar.

Wie es mit der Performance aussieht, weiß ich nicht (und war ich bisher auch zu faul zum Testen). Diese Stringoperatoren sollen so schnell ja nicht sein. Der CASE wäre vielleicht schneller. Auf jeden Fall soll CASE schneller sein als IF (habe ich mal irgendwo in der SAP-Doku gelesen). Aber wenn man solch Abfrage nicht in eine zehntausendfach ausgeführte Schleife packt, dann dürfte ein Performanceunterschied ohnehin irrelevant sein.

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von sapyard (ForumUser / 31 / 5 / 2 ) »
mydigitalme hat geschrieben:Danke für eure Antworten.
Ich habe das Coding jetzt mal folgendermaßen abgeändert:

LOOP AT lt_status ASSIGNING FIELD-SYMBOL(<fs_status>).
IF <fs_status>-txt04 NE 'RP01'.
IF <fs_status>-txt04 NE 'RP15'.
lv_rccheck = '1'.
ENDIF.
ENDIF.

Und trotzdem wird die Variable nicht auf 1 gesetzt, wenn txt04 z.B. RP03 ist.
Verstehe ich nicht :?
Hope your data element for txt04 is 4 character long. Can you double check and confirm?
Thanking you.

With Regards,
Raju.
----------------------
Raju Shrestha
www.sapyard.com
----------------------

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von Lukcresder (ForumUser / 7 / 0 / 0 ) »
ah sehr interessant!

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Hope your data element for txt04 is 4 character long. Can you double check and confirm?
I fail to see why that would be relevant. If it is a (10) TYPE C, everything we wrote above will apply anyway (seeing that IF-comparisons with C-variables ignore trailing spaces).

If it is too short to actually hold the target text, it will most obviously not work, but that would be a trivial mistake that has little to do with what this thread is about.

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von Romaniac (Specialist / 221 / 65 / 27 ) »
.
Zuletzt geändert von Romaniac am 11.08.2017 12:42, insgesamt 1-mal geändert.
Geht nicht gibts nicht

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Your response does not give me the impression that you have actually read and understood the whole discussion, Wolfgang...

Re: IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitrag von Romaniac (Specialist / 221 / 65 / 27 ) »
DeathAndPain hat geschrieben:Your response does not give me the impression that you have actually read and understood the whole discussion, Wolfgang...
Sorry, you are right.
Geht nicht gibts nicht

Vergleichbare Themen

1
Antw.
1674
Views
ALV Zeile Färben wenn Bedingung erfüllt ist
von an4kh4 » 11.07.2007 14:19 • Verfasst in ABAP Objects®
3
Antw.
3048
Views
Prüfen, ob in SAP GUI ausgeführt
von msfox » 28.08.2019 17:03 • Verfasst in Dialogprogrammierung
5
Antw.
3822
Views
Wer welches TCode ausgeführt hat..
von anam.jabrane » 14.09.2014 13:15 • Verfasst in Sonstige Module
0
Antw.
2087
Views
Wie wird ein qRFC im JRA ausgeführt?
von hefter » 04.05.2005 08:40 • Verfasst in Java & SAP®

Aktuelle Forenbeiträge

Regex in where
vor 13 Stunden von tar 8 / 315
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1597
Programm anlegen mit Vorlage
vor 2 Tagen von DeathAndPain 2 / 244
IT0024 Qualifikationen CP-ID
vor 2 Tagen von DeathAndPain 2 / 482

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

Regex in where
vor 13 Stunden von tar 8 / 315
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1597
Programm anlegen mit Vorlage
vor 2 Tagen von DeathAndPain 2 / 244
IT0024 Qualifikationen CP-ID
vor 2 Tagen von DeathAndPain 2 / 482

Unbeantwortete Forenbeiträge

BUSOBJEKT zu CMIS PHIO ermitteln
vor 2 Tagen von snooga87 1 / 183
aRFC im OO-Kontext
letzen Monat von ralf.wenzel 1 / 3361
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9913