String-Eingabe prüfen auf numerischen Wert


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

Moderatoren: Jan, Steff

String-Eingabe prüfen auf numerischen Wert

Beitragvon madeleine104 » 02.12.2016, 01:10

Hallo zusammen,

ich habe ein Eingabefeld, das CHAR 250 definiert ist.
Es dient dazu, einen Wert für ein zuvor ausgewähltes Feld einzugeben.
Das einzugebende Feld kann natürlich auch NUM sein (wie z.B. EISBE aber auch CHAR wie z.B. Dispo.

Wird nun ein Num-Wert im falschen Format eingegeben, gibt es einen Dump. (Z.B. 21, 345 anstatt 21.345)
D.h. ich müsste prüfen, ob die Eingabe sich auf ein NUM-Feld bezieht und dann ggf. von CHAR auf NUM konvertieren.
Ich kann aber unmöglich alle infrage kommenden NUM-Felder explizit abfragen.
Bestimmt gibt es ein schöne Lösung, dies herauszufinden ? ... die ich nicht kenne (stecke noch in den "Kinderschuhen")
Und dann noch das Konvertieren?

Danke und Grüße
madeleine104
ForumUser
 
Beiträge: 7
Registriert: 29.09.2016, 10:30
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: String-Eingabe prüfen auf numerischen Wert

Beitragvon SAP_ENTWICKLER » 02.12.2016, 06:45

Hallo,

wenn ich das Problem richtig verstehe wird im Vorfeld ein Zielfeld ausgewählt in das die Eingabe erfolgen soll. Dann braucht man ja nur die Eigenschaften dieses einen Feldes prüfen und nicht die aller möglichen Felder.

Ich weiß jetzt nicht ob die Zielfelder über eine Struktur definiert sind. Das sollte man tun, weil man dann über das DDIC (Tabelle DD03L Tabellenfelder) den Datentyp ermitteln und prüfen kann.



Viele Grüße

Norbert

Für diese Nachricht hat SAP_ENTWICKLER einen Dank bekommen :
madeleine104
SAP_ENTWICKLER
Specialist
 
Beiträge: 274
Registriert: 27.05.2013, 09:40
Dank erhalten: 3 mal
Ich bin: Berater/in

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon Thanatos82 » 02.12.2016, 09:14

Moin,

reicht es nicht zu prüfen, ob dein CHAR250 Feld ein Komma enthält? Wenn ein Komma gefunden wird dann einfach mit
Code: Alles auswählen
TRANSLATE lv_char250 USING ',.'.
umformen?
Sofern es über 1000 geht im Wert müsste man das ganze noch vorab mit
Code: Alles auswählen
TRANSLATE lv_char250 USING '. '. CONDENSE lv_char250 NO-GAPS.
der Tausender Trenner entfernt werden.
Gruß,
der Matze

Für diese Nachricht hat Thanatos82 einen Dank bekommen :
madeleine104
Thanatos82
Expert
 
Beiträge: 695
Registriert: 13.09.2012, 13:01
Wohnort: Hagen
Dank erhalten: 125 mal
Ich bin: Entwickler/in

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon Tron » 02.12.2016, 11:02

moin.
Mein Vorschlag:
Code: Alles auswählen
* Stelle sicher Code hat nur Ziffern
IF code CO '0123456789'.
  lv_QCODE = qpcd-code.
ENDIF.


CO = Contains Only

und wenn der Punkt auch noch gültig ist, dann..
Code: Alles auswählen
* Stelle sicher Code hat nur Ziffern oder Punkt
IF code CO '.0123456789'.
  lv_QCODE = qpcd-code.
ENDIF.



gruß Jens
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Für diese Nachricht hat Tron einen Dank bekommen :
madeleine104
Tron
Expert
 
Beiträge: 884
Registriert: 04.08.2007, 21:08
Wohnort: Hamburg
Dank erhalten: 158 mal
Ich bin: Entwickler/in

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon madeleine104 » 02.12.2016, 12:38

Hallo Norbert,
das ist genau das, was ich gesucht habe! Vielen Dank. Allerdings gibt es auch eine Klasse/Methode, mit der man das auch festellen kann/ können soll: CL_ABAP_TYPEDESCR
Hast Du damit schon Erfahrungen gemacht? Danke und Grüße

An die anderen:
Ich kann nicht einfach auf numerische Eingabe prüfen, da abhängig vom "Zielfeld", auf das sich die Eingabe bezieht, auch eine CHAR - Eingabe richtig sein kann. Ich muss also erst ermitteln, wie das Zielfeld (das variabel ist) definiert ist.


AUf jeden Fall vielen Dank an alle. Ich probiere jetzt erst mal DD03L aus.... Und vielleicht die genannte Klasse

Grüße und schon mal ein schönes Wochenende
madeleine104
ForumUser
 
Beiträge: 7
Registriert: 29.09.2016, 10:30
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon Dele » 02.12.2016, 12:48

Vielleicht hilft dir auch der Funktionsbaustein RS_CONV_EX_2_IN.

Für diese Nachricht hat Dele einen Dank bekommen :
madeleine104
Dele
Specialist
 
Beiträge: 277
Registriert: 06.05.2005, 11:07
Dank erhalten: 39 mal

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon black_adept » 02.12.2016, 14:19

Wenn du faul sein willst nimm einen TRY-CATCH-Block.
live long and prosper
Stefan Schmöcker

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

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon a-dead-trousers » 03.12.2016, 10:03

black_adept hat geschrieben:Wenn du faul sein willst nimm einen TRY-CATCH-Block.

Vorsicht. Das funktioniert leider nicht immer. Einige der Fehler die bei einer Zuweisung (MOVE TO) auftreten können sind (noch) nicht als behandelbare Exceptions abgebildet. :cry:
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: 2688
Registriert: 07.02.2011, 13:40
Dank erhalten: 618 mal
Ich bin: Entwickler/in

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon black_adept » 03.12.2016, 17:37

a-dead-trousers hat geschrieben:
black_adept hat geschrieben:Wenn du faul sein willst nimm einen TRY-CATCH-Block.

Vorsicht. Das funktioniert leider nicht immer. Einige der Fehler die bei einer Zuweisung (MOVE TO) auftreten können sind (noch) nicht als behandelbare Exceptions abgebildet. :cry:

Huch - welche denn?
live long and prosper
Stefan Schmöcker

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

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon a-dead-trousers » 04.12.2016, 14:03

http://help.sap.com/abapdocu_702/en/abapmove.htm
Abschnitt "Non-Catchable Exceptions"

Ich bin schon des öfteren über MOVE_NOT_SUPPORTED gestolpert (z.B. Parameter mit TYPE ANY auf korrekten Inhalt prüfen)
Auf dieses Beispiel bezogen könnte der BCD_BADDATA eventuell auftreten.
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: 2688
Registriert: 07.02.2011, 13:40
Dank erhalten: 618 mal
Ich bin: Entwickler/in

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon black_adept » 04.12.2016, 19:32

a-dead-trousers hat geschrieben:Auf dieses Beispiel bezogen könnte der BCD_BADDATA eventuell auftreten.

Ich glaube nicht dass dieser Fehler auftreten kann, da hier das Sourcefeld vom Typ P sein müsste. Aber lt Originalposting startet das Ganze von einem Char-250 Feld. Und mir fällt momentan tatsächlich kein Fall ein, in dem ein = ( MOVE ) von einem C-Feld in ein anderes auf eine nicht-abfangbare Exception läuft.
live long and prosper
Stefan Schmöcker

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

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon edwin » 05.12.2016, 15:39

Hi,

noch eine Ergänzung - soll das eine Zahl mit Nachkomma Stellen/Tausender Trenner sein, dann verlasse Dich nicht auf Dezimal Punkt oder Komma, ermittle die Einstellungen aus dem Benutzerstamm:
Code: Alles auswählen
  DATA G_DECIMAL_SIGN TYPE SY-BATCH
  CALL FUNCTION 'CLSE_SELECT_USR01'  "get decimal sign
       IMPORTING
              decimal_sign = g_decimal_sign.
 


erst jetzt kannst Du die Konvertierungen durchführen abhängig von den Einstellungen

Code: Alles auswählen
   DATA data_str  type c length 250.
   DATA data_p   type p decimals 3.
   IF g_decimal_sign = ','.
* Bei Tausender Trenner = '.' ersetze diese mit Space
     TRANSLATE data_Str using '. '.
* zusammenschieben    
     CONDENSE  data_Str NO-GAPS.
* jetzt noch das komma durch Punkt ersetzen  
     TRANSLATE data_Str using ',.'.
* und links schieben, damit das auch in ein packed Feld passt
     shift data_Str left DELETING LEADING space.
   else.
* Bei Tausender Trenner = ',' (engl) ersetze diese mit Space
     TRANSLATE data_Str using ', '.
* zusammenschieben    
     CONDENSE  data_Str NO-GAPS.
* jetzt noch das Dezimal Komma ist eh schon  Punkt  
* und links schieben, damit das auch in ein packed Feld passt
     shift data_Str left DELETING LEADING space.
 endif.


 

nach dieser Konvertierung kannsst das in ein Packed Feld / schieben
Code: Alles auswählen
* Jetzt noch auf gültige Zeichen Dezimalpunkt Vorzeichen Zahlen und Leerzeichen prüfen
  IF data_Str CO ' +-.0123456789'.
    TRY.
        data_p = data_str.
* Fange ab was immer Du willst
      CATCH cx_root.
        "Fehlerbehandlung
    ENDTRY.
  ELSE.
    " Fehler Zeichen nicht gültig
  ENDIF.
 



der FB "RS_CONV_EX_2_IN" gibt leider eine "E" Meldung aus im ALV-Grid ist das besonders "gut"

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

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon Dele » 06.12.2016, 09:38

der FB "RS_CONV_EX_2_IN" gibt leider eine "E" Meldung aus im ALV-Grid ist das besonders "gut"


Bitte Doku zur vordefinierten Exception "error_message" bei CALL FUNCTION lesen.

Für diese Nachricht hat Dele einen Dank bekommen :
edwin
Dele
Specialist
 
Beiträge: 277
Registriert: 06.05.2005, 11:07
Dank erhalten: 39 mal

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon edwin » 06.12.2016, 14:15

Ok, ok - habe ihn schon eine Decade nicht mehr benutzt :oops:

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

Re: String-Eingabe prüfen auf numerischen Wert

Beitragvon abuma » 16.12.2016, 13:55

hallo zusammen,

ich würde hier mit einem try-catch-Block arbeiten.

Code: Alles auswählen
  DATA: lr_root   TYPE REF TO cx_root,
            lv_string TYPE string,
            lv_value  TYPE char10 VALUE '2,3',
            lv_calc   TYPE p DECIMALS 2.

  TRY.
      lv_calc = lv_value.
   CATCH cx_root INTO lr_root.
      lv_string = lr_root->kernel_errid.
  ENDTRY.
 

Im Beispiel erhalte ich den Fehler mit der kernel_errid "CONVT_NO_NUMBER"

In der DB-Tabelle "SNAPT" können die Fehler ausgelesen werden, falls benötigt.

So könnte die Kompatiblität relativ einfach sichergestellt werden.

Liebe Grüße
abuma
abuma
ForumUser
 
Beiträge: 46
Registriert: 17.08.2016, 11:14
Dank erhalten: 5 mal
Ich bin: Entwickler/in


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

  Aktuelle Beiträge   
gelöst Protokoll vergangener RFC Aufrufe
vor 16 Stunden von Dele 3 Antw.
BREAK-POINT-IDs verwenden
vor 15 Stunden von ralf.wenzel 2 Antw.
MEREQ001 Zusatzfelder ausblenden
vor 3 Tagen von SAP4Echo 0 Antw.
gelöst Z Tabelle Key Feld ändern
vor 3 Tagen von DeathAndPain 3 Antw.
gelöst Funktionsbaustein EXIT_SAPLCORF_404 in Transaktion COR6N
vor 20 Stunden von SAP_ENTWICKLER 2 Antw.

  Ähnliche Beiträge beta
String prüfen auf numerische Werte und Stellenanzahl
03.07.2008, 13:14 von edwin 16 Antw.
String die ersten drei Zeichen prüfen
10.04.2012, 14:57 von donossi 2 Antw.
Wert in einem String abfragen
05.03.2012, 15:55 von wreichelt 3 Antw.
Eingabe des Transaktionscodes - Eingabe TACODE -
27.06.2004, 13:46 von Blueshape 7 Antw.
gelöst Eingabe mit '*'
18.11.2016, 09:26 von Dele 8 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]

Feedback ...?

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

... Absenden!