gelöst substring direkt in IF


Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV

Moderatoren: Jan, Steff

gelöst substring direkt in IF

Beitragvon pherweg » 09.02.2018, 17:08

Hallo,

ich möchte in einem String prüfen, ob an bestimmer Stelle ein Leerzeichen steht.
(Kann man natürlich mit Offset-Operator machen. Z. B. lf_part+9(1). In meinem eigentlichen Fall ist der Offset aber dynamisch und muss erst berechnet werden. Deshalb möchte ich die Funktion substring verwenden, da ich bei off einen Ausdruck angeben kann.)

Nun verwende ich folgende Coding.
In den ersten IF läuft das Programm wie erwartet rein.

Um mir die Deklaration der Variable zu sparen, wollte ich die substring-Funktion gleich in den IF einbauen - so wie beim zweiten IF.
Aber warum läuft das Programm da nicht rein? Ist doch im Prinzip die gleiche Bedingung.

Hat jemand eine Idee?

DATA lf_part TYPE string.
lf_part = '123456789 x'.

DATA sub TYPE string.
sub = substring(
val = lf_part
off = 9
len = 1 ).

IF sub CA ' '.
WRITE 'Enthält an 10. Stelle ein space'.
ENDIF.

IF substring(
val = lf_part
off = 9
len = 1 ) CA ' '.
WRITE 'Warum läuft ABAP hier nicht rein?'.
ENDIF.

Viele Grüße
Peter
pherweg
ForumUser
 
Beiträge: 4
Registriert: 03.02.2018, 17:00
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Sponsor

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

Re: substring direkt in IF

Beitragvon wreichelt » 09.02.2018, 17:49

Hallo,

kannst Du die Felder nicht mittels
SPLIT aufteilen?

https://help.sap.com/doc/abapdocu_750_i ... psplit.htm

Gruß Wolfgang
wreichelt
Expert
 
Beiträge: 542
Registriert: 17.07.2005, 09:46
Wohnort: Hessen
Dank erhalten: 89 mal
Ich bin: sonstiges

Re: substring direkt in IF

Beitragvon ralf.wenzel » 09.02.2018, 17:50

Ich hab mir jetzt nen Wolf probiert - mit subsctring, mit contains, mit matches, sogar unter Verwendung Regulärer Ausdrücke - ich bin hochgradig erstaunt, dass das nicht geht.


Ralf
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2792
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 138 mal
Ich bin: Freiberufler/in

Re: substring direkt in IF

Beitragvon edwin » 09.02.2018, 18:52

Hi,
das muss wohl am SPACE liegen, habe es gerade mit dem 'x' versucht und da geht es - das ist je echt übel
Code: Alles auswählen
DATA lf_part TYPE string.
lf_part = '123456789 xB'.

DATA sub TYPE string.
sub = substring( val = lf_part off = 10 len = 1 ).

IF sub CA 'x'.
WRITE ' Enthält an 11. Stelle ein "x"'.
ENDIF.

IF substring( val = lf_part off = 10 len = 1 ) CA 'x'.
 WRITE ' hier läuft er rein '.
ENDIF.

IF substring( val = lf_part off = 08 len = 3 ) CA ' '.
WRITE ' Kaum Abfrage nach Space nicht mehr '.
ENDIF.
 

/Edwin
edwin
Specialist
 
Beiträge: 195
Registriert: 27.02.2007, 17:15
Wohnort: Ludwigsburg
Dank erhalten: 12 mal
Ich bin: Freiberufler/in

Re: substring direkt in IF

Beitragvon ralf.wenzel » 09.02.2018, 18:56

contains wirft auch eine Ausnahme - substring nicht.

Ralf
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2792
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 138 mal
Ich bin: Freiberufler/in

Re: substring direkt in IF

Beitragvon a-dead-trousers » 10.02.2018, 09:16

Ich kann schon sagen wo hier der (Denk-)Fehler liegt:
' ' ist nicht gleich einem Leerzeichen sondern schlicht "leer".
Korrekt wäre ` `. (= String mit Leerzeichen)
Code: Alles auswählen
IF substring( val = lf_part off = 08 len = 3 ) CA ` `. "<-- Jetzt sollte das Leerzeichen gefunden werden
WRITE ' Kaum Abfrage nach Space nicht mehr '.
ENDIF.
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

Für diese Nachricht hat a-dead-trousers einen Dank bekommen :
pherweg
a-dead-trousers
Top Expert
 
Beiträge: 2771
Registriert: 07.02.2011, 13:40
Dank erhalten: 652 mal
Ich bin: Entwickler/in

Re: substring direkt in IF

Beitragvon pherweg » 10.02.2018, 10:42

Hallo,

herzlichen Dank an alle für die vielen Antworten!

@a-dead-trousers: Interessanter Hinweis! Mit ` ` funktioniert die Bedingung tatsächlich.

Um so erstaunlicher scheint es mir, dass die erste IF-Bedingung funktioniert.

Habe jetzt nochmal die Online-Hilfe zum CA-Operator zu Rate gezogen. Dort steht "...Bei Operanden vom Typ string werden die schließenden Leerzeichen berücksichtigt. Wenn in der folgenden Tabelle nicht anders dokumentiert, werden bei Operanden vom Typ c, d, n und t die schließenden Leerzeichen nicht berücksichtigt..."

Meine Theorie:
Erstes IF:
Wenn ich das Ergebnis von substring zuerst in eine String-Variable schreibe, erkennt ABAP beim Auswerten der Bedingung, dass es ein String ist. Da einer der CA-Operanden ein String ist, werden die schließenden Leerzeichen berücksichtigt.
Zweites IF mit ' ':
Wenn ich die substring-Funktion direkt in der Verbindung angebe, weiß ABAP nicht, dass es ein String ist (in der Online-Hilfe zu substring steht nirgends, dass ein string zurückgegeben wird). D. h. beide CA-Operanden sind keine Strings: schließende Leerzeichen werden nicht berücksichtigt.
Zweites IF mit ` `:
Der rechte CA-Operand ist ein String. Da nun wieder einer der CA-Operanden ein String ist, werden die schließenden Leerzeichen berücksichtigt.

Habe mir jetzt testweise eine conv_to_string-Funktion geschrieben, die den Importing-Parameter einfach nur wieder zurückgibt.
...
CLASS-METHODS:
conv_to_string
IMPORTING
if_string TYPE string
RETURNING VALUE(rf_result) TYPE string.
...
Wichtig: Der Rückgabewert ist als String typisiert.

IF lcl_forms=>conv_to_string( substring(
val = lf_part
off = 9
len = 1 ) ) CA ' '.
WRITE 'Hier läuft ABAP rein :)'.
ENDIF.

Dann funktioniert es.

Danke noch mal, und ein schönes Wochenende!

Gruß
Peter
pherweg
ForumUser
 
Beiträge: 4
Registriert: 03.02.2018, 17:00
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: substring direkt in IF

Beitragvon ralf.wenzel » 10.02.2018, 11:35

a-dead-trousers hat geschrieben:Ich kann schon sagen wo hier der (Denk-)Fehler liegt:
' ' ist nicht gleich einem Leerzeichen sondern schlicht "leer".
Korrekt wäre ` `. (= String mit Leerzeichen)
Code: Alles auswählen
IF substring( val = lf_part off = 08 len = 3 ) CA ` `. "<-- Jetzt sollte das Leerzeichen gefunden werden
WRITE ' Kaum Abfrage nach Space nicht mehr '.
ENDIF.


Ich habe SPACE genommen....


Ralf
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2792
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 138 mal
Ich bin: Freiberufler/in

Re: substring direkt in IF

Beitragvon edwin » 10.02.2018, 20:01

wie Ralf schon geschrieben :
Code: Alles auswählen
IF substring( val = lf_part off = 08 len = 3 ) CA SPACE.
WRITE ' das wird auch nicht gefunden '.
ENDIF.
 

/Edwin
edwin
Specialist
 
Beiträge: 195
Registriert: 27.02.2007, 17:15
Wohnort: Ludwigsburg
Dank erhalten: 12 mal
Ich bin: Freiberufler/in

Re: substring direkt in IF

Beitragvon DeathAndPain » 12.02.2018, 13:34

SPACE stammt ja noch von Adolfs Zeiten, als es noch gar keine Strings in ABAP gegeben hat. Ich benutze es sehr gerne (es ist auch minimal performanter, weil Konstanten performanter ausgewertet werden als Literale), aber man muss sich immer vergegenwärtigen, dass SPACE vom Typ (1) TYPE C ist - und damit aus ABAP-Sicht komplett leer (da beim Typ C schließende Leerzeichen in den allermeisten Fällen keine Rolle spielen).
DeathAndPain
Specialist
 
Beiträge: 398
Registriert: 05.05.2006, 10:14
Dank erhalten: 101 mal
Ich bin: Entwickler/in

Re: substring direkt in IF

Beitragvon ralf.wenzel » 12.02.2018, 14:06

Also ist SPACE kein Leerzeichen, sondern eine leere Zeichenkette - und hat demzufolge den falschen Namen.


Ralf
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2792
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 138 mal
Ich bin: Freiberufler/in

Re: substring direkt in IF

Beitragvon ewx » 12.02.2018, 15:42

ralf.wenzel hat geschrieben:Also ist SPACE kein Leerzeichen, sondern eine leere Zeichenkette - und hat demzufolge den falschen Namen.

Nein. Eine leere Zeichenkette ist das hier: ``
ewx
Top Expert
 
Beiträge: 3503
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 237 mal

Re: substring direkt in IF

Beitragvon black_adept » 12.02.2018, 18:20

ralf.wenzel hat geschrieben:Also ist SPACE kein Leerzeichen, sondern eine leere Zeichenkette - und hat demzufolge den falschen Namen.
Nein - SPACE besteht schon aus einem Leerzeichen. Aber an vielen Stellen werden eben abschließende Leerzeichen ignoriert - und an ebendiesen Stellen wird dann das eine Leerzeichen zum leeren String reduziert.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 2776
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 420 mal
Ich bin: Freiberufler/in


Zurück zu ABAP® Core

  Aktuelle Beiträge   
Anzahl Treffer select-anweisung
vor 5 Stunden von wreichelt 3 Antw.
gelöst Datenbankabfrage
vor 5 Stunden von black_adept 1 Antw.
gelöst Disponentbezeichnung
vor 8 Stunden von cuncon 2 Antw.
Customizingtabelle ->Schlüsselfeld darf nicht leer sein
vor 10 Stunden von DeathAndPain 6 Antw.
gelöst Smartforms Dynamischer Textbaustein
vor 5 Stunden von Tron 4 Antw.

  Ähnliche Beiträge beta
Substring bei SELECT
12.05.2006, 08:09 von Frank Dittrich 7 Antw.
Kommunikation aus SAP direkt mit SPS
16.10.2008, 15:27 von Steff 2 Antw.
Wie kann man OTF-Daten/Datei direkt ausdrucken?
15.08.2005, 22:54 von Michael00 2 Antw.
Report -> SUBMIT: wer ist Aufrufer? O. direkt ausgeführt?
16.04.2007, 08:09 von justMe 2 Antw.
Zebra Drucker direkt aus ABAP ansprechen
10.09.2012, 13:45 von harry1991 5 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!
cron