IF Bedingung nicht erfüllt, dennoch ausgeführt


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

IF Bedingung nicht erfüllt, dennoch ausgeführt

Beitragvon mydigitalme » 17.07.2017, 10:31

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ß
mydigitalme
ForumUser
 
Beiträge: 3
Registriert: 07.06.2017, 16:28
Dank erhalten: 0 mal
Ich bin: Berater/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

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

Beitragvon DeathAndPain » 17.07.2017, 10:41

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, 10:45, insgesamt 1-mal geändert.
DeathAndPain
Specialist
 
Beiträge: 309
Registriert: 05.05.2006, 10:14
Dank erhalten: 80 mal
Ich bin: Entwickler/in

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

Beitragvon black_adept » 17.07.2017, 10:45

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
black_adept
Top Expert
 
Beiträge: 2727
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 398 mal
Ich bin: Freiberufler/in

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

Beitragvon DeathAndPain » 17.07.2017, 10:47

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.
DeathAndPain
Specialist
 
Beiträge: 309
Registriert: 05.05.2006, 10:14
Dank erhalten: 80 mal
Ich bin: Entwickler/in

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

Beitragvon mydigitalme » 17.07.2017, 13:27

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 :?
mydigitalme
ForumUser
 
Beiträge: 3
Registriert: 07.06.2017, 16:28
Dank erhalten: 0 mal
Ich bin: Berater/in

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

Beitragvon a-dead-trousers » 17.07.2017, 14:04

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.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 2721
Registriert: 07.02.2011, 13:40
Dank erhalten: 635 mal
Ich bin: Entwickler/in

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

Beitragvon DeathAndPain » 18.07.2017, 11:05

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.

Für diese Nachricht hat DeathAndPain einen Dank bekommen :
wreichelt
DeathAndPain
Specialist
 
Beiträge: 309
Registriert: 05.05.2006, 10:14
Dank erhalten: 80 mal
Ich bin: Entwickler/in

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

Beitragvon black_adept » 18.07.2017, 12:41

Ü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.  
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Für diese Nachricht hat black_adept einen Dank bekommen :
wreichelt
black_adept
Top Expert
 
Beiträge: 2727
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 398 mal
Ich bin: Freiberufler/in

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

Beitragvon DeathAndPain » 18.07.2017, 14:05

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.
DeathAndPain
Specialist
 
Beiträge: 309
Registriert: 05.05.2006, 10:14
Dank erhalten: 80 mal
Ich bin: Entwickler/in

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

Beitragvon sapyard » 10.08.2017, 20:18

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
----------------------
sapyard
ForumUser
 
Beiträge: 30
Registriert: 02.07.2017, 02:05
Wohnort: Texas, USA
Dank erhalten: 2 mal
Ich bin: Berater/in

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

Beitragvon Lukcresder » 11.08.2017, 07:09

ah sehr interessant!
Lukcresder
ForumUser
 
Beiträge: 7
Registriert: 10.08.2017, 15:19
Dank erhalten: 0 mal
Ich bin: Entwickler/in

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

Beitragvon DeathAndPain » 11.08.2017, 09:59

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.
DeathAndPain
Specialist
 
Beiträge: 309
Registriert: 05.05.2006, 10:14
Dank erhalten: 80 mal
Ich bin: Entwickler/in

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

Beitragvon Romaniac » 11.08.2017, 10:15

.
Zuletzt geändert von Romaniac am 11.08.2017, 11:42, insgesamt 1-mal geändert.
Geht nicht gibts nicht
Romaniac
ForumUser
 
Beiträge: 57
Registriert: 20.03.2017, 10:31
Wohnort: Augsburg
Dank erhalten: 7 mal
Ich bin: Freiberufler/in

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

Beitragvon DeathAndPain » 11.08.2017, 10:57

Your response does not give me the impression that you have actually read and understood the whole discussion, Wolfgang...
DeathAndPain
Specialist
 
Beiträge: 309
Registriert: 05.05.2006, 10:14
Dank erhalten: 80 mal
Ich bin: Entwickler/in

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

Beitragvon Romaniac » 11.08.2017, 11:44

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
Romaniac
ForumUser
 
Beiträge: 57
Registriert: 20.03.2017, 10:31
Wohnort: Augsburg
Dank erhalten: 7 mal
Ich bin: Freiberufler/in

Nächste

Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
DSGVO in SAP umsetzen
Gestern von ralf.wenzel 0 Antw.
Berechtigungsprüfung Dialog- vs. RFC-User im Single Sign On
vor 3 Stunden von Tron 1 Antw.
Reporttransaktion für andere Mitarbeiter zugänglich machen
vor 2 Tagen von Tron 1 Antw.
Materialkalkulation
vor 2 Tagen von erp-bt 1 Antw.
gelöst Barcodes in Warenbewegungen & Belegen
vor 2 Tagen von marc.braun 1 Antw.

  Ähnliche Beiträge beta
Where Bedingung bei Select nicht Case sensitiv
18.01.2008, 07:06 von TWP 5 Antw.
Where-Bedingung
08.06.2005, 10:07 von Gast 7 Antw.
Date in WHERE-Bedingung
10.12.2012, 10:21 von jensschladitz 4 Antw.
Join Bedingung
29.12.2014, 08:17 von JHM 6 Antw.
Select where Bedingung mit @
11.12.2015, 14:15 von black_adept 2 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

Feedback ...?

Was können wir verbessern? Hinterlasse deine Kontaktdaten, wenn du eine direkte Antwort möchtest.

... Absenden!