View Full Version : Ungültige Werte in numerischen Feldern
Harald.Wallukat
17-07-13, 15:17
Hallo Kolleginnen und Kollegen !
Wir haben ein Thema (Problem/Herausfoderung), dass in einigen Dateien (DDS beschrieben) und dort in mehreren Datensätzen ungültige Daten (Hex'40') in numerischen Feldern stehen. Verursacht durch ältere RPG-Programme.
Wir möchten nun mit SQL diese fehlerhaften Sätze bereinigen, um nicht pro Datei jeweils ein RPG-Programm schreiben zu müssen.
Es wäre sehr hilfreich wenn uns jemand auf die Schnelle bei einer Lösung unterstützen könnte. :cool:
Mit freundlichen Grüßen :)
Per SQL hast du leider keine Chance!
SQL versucht die Daten zu lesen, kann dies aber nicht, da sie ja ungültig sind.
Dies kannst du nur per Programm, wobei hier die RPG-Runtime ja beim READ einen Fehler bringt sobald das Feld angesprochen wird.
Dies ereichst du bereits, wenn die Felder als E DS definiert sind.
Den READ kannst du per MONITOR abfangen, da RPG ja intern per MOVE in die DS überträgt und bei ungültigen Daten einen MCH-Fehler bekommt.
Welches Feld das dann ist, kann man nicht herausfinden, aber wenigstens hat man die Satznummer (INFDS).
Alternativ könnte auch ein CPYF ... FMTOPT(*MAP *DROP) ERRLVL(*NOMAX)funktionieren.
Harald.Wallukat
17-07-13, 15:37
Danke für die schnelle Info.
Den CPYF hatte ich getestet, aber den ERRLVL vergessen.
Versuche ich direkt.
Bin da nicht sicher, aber kannst du nicht in einer coalesce Gruppe das Feld durch 1 dividieren oder in einer case Anweisung diese division auf NULL abfragen?
update datei set numfeld1 = case when numfeld1/1 = NULL then 0 else numfeld1 end
oder
update datei set feld = coalesce(numfeld1/1, 0)
Robi
Wenn "numfeld" ungültig ist, da nicht numerisch, stirbt der SQL und macht dann auch nichts.
Ich hatte buchstäblich vor Jahrzehnten 'mal Kontakt zu einem Tool namens FILESCOPE, das solche ungültigen Werte in gültige numerische Werte umändern konnte und zwar nicht nur feldweise, sondern für ganze Dateien. Hier findest Du einen link : Filescope – iSeries Data Manipulation Tool for Enhancing Programmer Productivity (http://www.razlee.com/products/scopetools/filescope/filescope_o.php)
Vielleicht hilft Dir das ja weiter.
Ich würde die Datei intern definieren und dabei die falschen *BLANKS Felder als Alpha definieren.
Anschließend xlate x'40' 0 und gut ist.
Allerdings kann es dabei passieren, das bei negativeren das - verloren geht
Moin,
vielleicht etwas spät aber trotzdem
DAS (http://www.itjungle.com/fhg/fhg080713-story02.html)
zeigt wie's mir SQL geht
Robi
Hallo Gemeinde :-)
Ich hatte das vor Jahren (nach der Umstellung von S/36) mal so gelößt, dass ich die DDS der Datei eingelesen habe, damit einen RPG Quelle erstellt habe und diese mit der option
Dezimaldatenfehler ignorieren . IGNDECERR *YES
umgewandelt habe.
Dieses Programm hat alle Sätze gelesen und einen Update gmeacht.
damit waren alle nummerischen x'40' Felder nachher "sauber"
auf 0
Klaus