PDA

View Full Version : Umsetzung Alpha=>Dec (edifact...)



cicero22
03-09-07, 15:24
hi *all

Also - es geht darum eine kleine Umsetzung von Edifact Daten in eine DB2 Datenbank zu realisieren. Hier bin ich momentan an einer Stelle, die mir so etwas zu kompliziert erscheint...

Also - was will ich machen - der Original Satz sieht so aus:

MOA+203:6591.17'

Dahinter verbirgt sich ein Betrag 6591,17 Euro. Allerdings kann auch nur eine Nachkommastelle

MOA+203:6591.1'
=> 6591,10 Euro

oder auch gar keine Nachkommastelle

MOA+203:6591'
=> 6591,00 Euro vorkommen.

Bisher sieht die "vorläufige" Lösung so aus...

DCHARFELD S 12A
DNUMMFELD S 12S 2
DL S 3S 0
DDPUNKT S 3S 0
DPUNKT S 3S 0
DHOCHKOMMA S 3S 0
DSTRING S 12A
* Beispiel fuer die Edifact Daten.... (Ausschnitt)
C EVAL CHARFELD = ' :411.7'''
C*** EVAL CHARFELD = ' :1'''
C EVAL DPUNKT = %SCAN(':': CHARFELD )
C EVAL HOCHKOMMA = %SCAN('''': CHARFELD )
C* MOVE 000000000000 STRING
* mit Nachkomma
C IF %SCAN('.' : CHARFELD) > 0
C EVAL STRING = %SUBST(CHARFELD :DPUNKT +1 :
C HOCHKOMMA - DPUNKT - 1)
C EVAL PUNKT = %SCAN('.': STRING )
C EVAL %SUBST(STRING: PUNKT: 1) = ','
C EVAL NUMMFELD = %DEC(STRING: 5:2)
C ENDIF
* ohne Nachkomma
C IF %SCAN('.' : CHARFELD) = 0
C EVAL STRING = %SUBST(CHARFELD :DPUNKT +1 :
C HOCHKOMMA - DPUNKT - 1)
C STRING DSPLY
C EVAL NUMMFELD = %INT(STRING)
C ENDIF
C**** EVAL NUMMFELD = %DEC(STRING: 5:2)
*
*
C** DPUNKT DSPLY
C** HOCHKOMMA DSPLY
C CHARFELD DSPLY
C STRING DSPLY
C NUMMFELD DSPLY
C SETON LR

Geht das auch kürzer mit einem %EDITC oder so?

Fuerchau
03-09-07, 16:29
%EDITC ist ja die Umkehrfunktion, mach einfach folgendes:

eval start=%scan(':':mystring) + 1
eval len=%scan('''':mystring:start) - start

eval wert = %dec(%xlate(%substr(: mystring: start: len): '.' : ','): 5: 2)

cicero22
03-09-07, 16:40
ja du hast recht mit der umkehrfunktion.
ich werde das morgen ausprobieren und bin wieder einmal begeistert von dir und dem forum hier...

danke schonmal...
dirk

cicero22
04-09-07, 07:34
Hi Fuerchau.

Ich muss leider nochmals nachhaken...

Also - bis zur 3. Zeile kein Problem.

Aber nun diese Zeile

eval wert = %dec(%xlate(%substr(:mystring: start: len): '.' : ','): 5: 2)

Also - erst mal denke ich muss es ja %subst heißen - und der erste : (vor mystring muss auch weg) - aber selbst wenn ich das alles mache steht "quasi" in Wert nur ein Komma ganz links...(und es kommt zu einem Fehler:Eine Zeichendarstellung eines numerischen Werts ist fehlerhaft (C G D F). ) Das bekomme ich zumindest heraus wenn ich die Funktion etwas zerpflücke.... Darf ich Dich nochmals bemühen mir zu helfen? Oder mache ich einen Fehler?

Danke, Danke Dirk

Fuerchau
04-09-07, 08:11
Prüfe die H-Einstellung für DECEDIT, ob Komma oder Punkt erwartet wird.
%XLATE ersetzt eben '.' mit ',' und %dec erwartet dann eben eine Zahl mit oder ohne Komma.
Eigentlich müsste es funktionieren.
Der 1. Doppelpunkt muss tatsächlich weg (kommt wohl aus der SQL-Syntax).

Zu beachen ist natürlich die Dezimalausprägung 5,2 heißt ja auch nur 3 Vorkomma. Da musst du schon die korrekte Gesamtanzahl angeben, eg. 9:2 für 7 VK.

PS:
Tippfehler dürften doch mal erlaubt sein ;)

cicero22
04-09-07, 10:23
Hi Fuerchau!

Selbstverständlich war dies keine Kritik! Entschuldige wenn das so rüberkam. Ich möchte ja nur, dass andere Suchende nicht die gleichen Probleme haben wie ich... Das mit DECEDIT war natürlich entscheidend. Aber ich habe immer noch ein Verständnis Problem...

Folgendes:
Wenn ich diese Geschichten zerlege - so in etwa...
eval string2 = %subst( mystring:
start: len)
eval string3 = %xlate(string2: '.' : ',')

und mir danach mit Debug STRING3 anzeigen lasse steht da nur

STRING3 = ', '

drinne - und das ist so noch ein bisschen mein Verständnisproblem...

Ich kann ja auch theoretisch das XLATE weglassen wenn ich mit DECEDIT gleich auf '.' gehe, nichtwahr???

Was mache ich falsch????

Fuerchau
04-09-07, 17:39
Das ist halt so, wenn man Befehle aus dem Kopf tippt:

%xlate(from:to:myvar)

also
%xlate('.':',':Mystring)

Bitte wieder mal um Entschuldigung.

Was das Komma angeht, hast du natürlich Recht, DECEDIT bestimmt die Erwartung, %xlate stellt diese dann nur sicher, falls doch mal ein Punkt statt Komma (aus USA, GB oder sonstwo her) kommt.

cicero22
05-09-07, 07:00
Hallo Fuerchau!

Bitte entschuldige Dich nicht - das macht mich verlegen :confused:

VIELEN DANK! DANKE!

Gute Zeit noch ...

Dirk