Fehlerhafter logischer Ausdruck

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

Fehlerhafter logischer Ausdruck

Beitrag von mineabap (ForumUser / 2 / 0 / 0 ) »
Hi,
ich habe da eine Funktion, die eine zeichenkette durchläuft,und schaut, ob diese nur aus den zeichen
meiner unob liste besteht. Falls nicht werden äüö 's zu auo's, wenn nicht die unbekannten zeichen werden mit einem leerzeichen ersetzt.

Dabei bekomme ich ganze zeit den Fehler :

* Incorrect logical expression: Comparison/SELECT-OPTION can only be
* followed by "AND","OR" or ")".

hier ist mein Programm.Es wäre toll, wenn ihr den Fehler entdecken würdet.

FUNCTION Z_NEU1.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(TEMP_UNOB) TYPE STRING
*" EXPORTING
*" REFERENCE(RET_UNOB) TYPE STRING
*"----------------------------------------------------------------------

DATA laenge TYPE i.
DATA offset TYPE i.
DATA unob(68) TYPE c VALUE
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!"%& ()*+
,-./'.

Data Unob_Temp TYPE c.
Unob_Temp = temp_unob.

laenge = strlen( Unob_Temp ).

CLEAR offset.

WHILE offset < laenge.

IF Unob_Temp + offset(1) = 'Ä'.

* Hier wird der Cursor vor Gleichheitszeichen gesetzt bei dem Fehler.
* Incorrect logical expression: Comparison/SELECT-OPTION can only be
* followed by "AND","OR" or ")".

MOVE 'A' TO Unob_Temp + offset(1).
ELSEIF Unob_Temp +offset(1) = 'ä'.
MOVE 'a' TO Unob_Temp +offset(1).
ELSEIF Unob_Temp +offset(1) = 'Ö'.
MOVE 'O' TO Unob_Temp +offset(1).
ELSEIF Unob_Temp+offset(1) = 'ö'.
MOVE 'o' TO Unob_Temp+offset(1).
ELSEIF Unob_Temp+offset(1) = 'Ü'.
MOVE 'U' TO Unob_Temp+offset(1).
ELSEIF Unob_Temp+offset(1) = 'ü'.
MOVE 'u' TO Unob_Temp+offset(1).
ENDIF.

IF Unob_Temp+offset(1) CO unob.
ELSE.
MOVE ' ' TO Unob_Temp+offset(1).
ENDIF.

offset = offset + 1.

ENDWHILE.
temp_unob = unob_temp.
WRITE: / Unob_Temp.

ENDFUNCTION.

-------------
Meine 2. Frage wäre:
Wenn ich eine variable definieren will, die aus 4 buchstaben bestehen soll, dann nehme ich doch Datentyp ‚c’ oder? Und für eine 3 stellige zahl ‚p’ :

REPORT z_kurs .

TYPES: BEGIN OF st_kurs,
bez TYPE c length 4 ,
erg TYPE p length 3 ,
END OF st_kurs.

Aber, ich bekomme einen Fehler :

, or DECIMALS … expected after c.

Was ist da nicht richtig?
-------------

Ich bin übrigens Neuling in Abap, Die Sparche gefält mir aber bis jetzt ganz gut.
Es wird wahrscheinlich immer komplexer werden aber, was ist schon einfach im Leben :)

Also, danke schonmal für die Antworten.

Grüße
mineabap

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


Re: Fehlerhafter logischer Ausdruck

Beitrag von Fox (ForumUser / 17 / 0 / 0 ) »
Hallo mineabap,

Hier ist ein funktionierendes Beispiel, wie du so etwas machen kannst.

Code: Alles auswählen.

 
FUNCTION z_convert_string .
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(TEMP_UNOB) TYPE  STRING
*"  EXPORTING
*"     REFERENCE(RET_UNOB) TYPE  STRING
*"----------------------------------------------------------------------

  DATA:
    l_dummy   TYPE c VALUE 'X',
    l_char    TYPE c LENGTH 1000,
    l_unob(68)    TYPE c VALUE
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!"%& ()*+,-./'.

* Wertübergabe
  l_char = temp_unob.


  WHILE l_dummy EQ 'X'.

*   Wenn ein Zeichen in l_char vorkommt was nicht in l_unob vorhanden ist
*   wird sy-fdpos auf die Offsetlänge zum ersten falschem Zeichen gesetzt.
    IF l_char CN l_unob.

      IF l_char+sy-fdpos(1) EQ 'Ä'.

        l_char+sy-fdpos(1) = 'A'.

      ELSEIF l_char+sy-fdpos(1) EQ 'ä'.

        l_char+sy-fdpos(1) = 'a'.

*   und das auch für alle anderen.

      ELSE.

        l_char+sy-fdpos(1) = ' '.

      ENDIF.

    ELSE.

      l_dummy = ''.

    ENDIF.

  ENDWHILE.

  ret_unob = l_char.

ENDFUNCTION.

Du musst nicht jede einzelne Stelle von deinen Char Variable durchlaufen.

Nach einem Vergleich mit CO oder CN steht in der Systemvariable sy-fdpos die Offset Länge zum ersten falschen Zeichen.

Gruß,
Fox

Re: Fehlerhafter logischer Ausdruck

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
Hier ein paar Vorschläge meinerseits:

Der Fehler wird wohl folgendes sein:

Code: Alles auswählen.

Unob_Temp + offset(1) = 'Ä'.
.... sondern
Unob_Temp+offset(1) = 'Ä'.  
OHNE Leerzeichen bei dem '+'

Code: Alles auswählen.

offset = offset + 1.
.... sondern
add 1 to offset.
Ich verwende nie ' ' oder '' (also zwei Hochkomatas) sondern imme die variable SPACE oder den Befehl Clear wenn ich die Variable initialisieren will.

Code: Alles auswählen.

MOVE ' ' TO Unob_Temp+offset(1).
.... sondern
move space to ..... oder clear Variable.

Re: Fehlerhafter logischer Ausdruck

Beitrag von mineabap (ForumUser / 2 / 0 / 0 ) »
Hi Fox,
Ich danke dir für deine Mühe, dein Program ist ja wahrscheinlich viel effizienter als meins. Das muss ich mir noch irgendwie aneignen.

Ich habe jetzt dein quellcode einfach laufen lassen um zu schauen, ob wieder so ein fehler kommt.
Tatsächlich ist der Fehler noch drin . Kann das sein, dass ich irgendwelche Einstellungen ändern muss oder so.

Jetzt sieht der Fehler so aus für die Zeile l_char TYPE c LENGTH 1000, :

< , VALUE… DECIMALS… or VALUE IS INITIAL expected after c >

Ist merkwürdig, dass das Programm bei mir nicht läuft.

Danke schön.
Grüße
mineabap

Re: Fehlerhafter logischer Ausdruck

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo mineabap,

bei der Deklaration eines Feldes mit dem Typ p ist zwingend eine Angabe der Anzahl Dezimalstellen erforderlich:

Code: Alles auswählen.

TYPES: 
  BEGIN OF st_kurs,
    bez TYPE c length 4 ,
    erg TYPE p length 3 DECIMALS 0, "<<<=== Anzahl Dezimalstellen notwendig
  END OF st_kurs.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Re: Fehlerhafter logischer Ausdruck

Beitrag von Fox (ForumUser / 17 / 0 / 0 ) »
Mein Code funktioniert auf einem R3P und ECC 6.0 System. Wahrscheinlich benutzt du einen älteren Realeasestand. Mit denen kenne ich mich zwar nicht so aus, aber nach der Fehlermeldung muss die Zeile so lauten:

l_char TYPE c value '' LENGTH 1000,


Gruß

Re: Fehlerhafter logischer Ausdruck

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
Noch mal zum Ersetzen...
Wenn man immer genau ein Zeichen des Quellstrings durch jeweils ein Zeichen ersetzen will, geht das (auch noch in älteren Releases) mit einer einzigen Translate-Anweisung.

Code: Alles auswählen.

TRANSLATE quellfeld USING 'Ä Ö Ü ä ö ü ß '.
ersetzt alle Umlaute und jedes ß durch space.
oder z.B.

Code: Alles auswählen.

TRANSLATE quellfeld USING 'ÄAÖOÜUäaöoüu'.
.

Was so nicht geht, ist z.B. alle 'Ä' durch 'Ae' zu ersetzen.
Das könnte man aber z.B. mit REPLACE ALL OCCURRENCES OF ... erledigen (erfordert aber SY-SAPRL > '46D').

Seite 1 von 1

Vergleichbare Themen

0
Antw.
921
Views
MEDRUCK => Cache Problem oder fehlerhafter Code
von Tobbworld » 29.11.2005 15:53 • Verfasst in ABAP® für Anfänger
1
Antw.
270
Views
Logischer Dateiname
von L0w-RiDer » 25.09.2019 16:37 • Verfasst in ABAP® für Anfänger
3
Antw.
2869
Views
Report mit logischer Datenbank PNM
von Nautilus » 05.09.2005 10:09 • Verfasst in ABAP® Core
1
Antw.
1451
Views
Probleme mit logischer Datenbannk DDF
von vhoffe » 10.10.2006 06:43 • Verfasst in Financials
11
Antw.
6635
Views
Sapscript Ausdruck.
von SAPDIDI2 » 24.05.2007 08:05 • Verfasst in ABAP® Core

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.