Anmelden

View Full Version : Frage zum Cast beim SQL



KingofKning
05-09-13, 12:00
Hallo *all, ich habe eine Verständnisfrage zum Cast.

Habe folgende Formel hier:
Right('0000000000' concat Varchar(Dec(CSRC1.ums2012, 8, 2)), 10)

Und die Daten die zur Summe führen (Ausschnitt)

000014 2013 4350 20.130.112 319680,000
000015 2013 4350 20.130.112 49896,000
000016
000017 SUMME 1336826,520 Wie man sieht habe ich 8 Vorkamma und 2 Nachkommastellen er kommt mir aber mit folgender FEhlermeldung:

Nachricht . . . : Datenzuordnungsfehler in Teildatei QSQPTABL.
Ursache . . . . : Bei Feld (Cast(ReferenceVar(1), Long Packed(31,3)) AS
Short Packed(8,2)) im Satz mit Nummer 0 und Format *FIRST in Teildatei
QSQPTABL mit Nummer 1 der Datei QSQPTABL in Bibliothek QSYS2 ist wegen
Fehlercode 2 ein Datenzuordnungsfehler aufgetreten. Fehlercodes und ihre
Bedeutung:
1 - Dezimalfeld enthält ungültige Daten.
2 - Signifikante Ziffer wurde abgeschnitten. Klar ich könnte das Feld größer definieren aber ich würde gerne verstehen wo sein Problem ist.

GG

andreaspr@aon.at
05-09-13, 12:19
Hallo,

Ich verstehe ehrlich gesagt die Frage nicht. Die Fehlermeldung sagt ja dass das Problem darin liegt ein Long Packed(31,3) Feld auf Dec (8, 2) zu kürzen.
Du würdest dadurch falsche Daten erhalten (wenn du einen Wert hättest der dec (8, 2) übersteigen würde).

lg Andreas

KingofKning
05-09-13, 12:31
Wenn --- Dann.
Er macht es ja bei weit über 1.000 Kunden. Und wie Du siehst passt die Zahl ja.

GG

andreaspr@aon.at
05-09-13, 12:40
Korrektur:
Wo passiert denn der Fehler eigentlich?
Wenn du z.B. 1336826,520 versuchst auf 8, 2 zu casten wirst du einen fehler bekommen, da du instesammt 9 Stellen hast. Und du dabei aber auf 8 Stellen verringern willst.

Fuerchau
05-09-13, 12:50
Da sich SQL ja um den Inhalt nun mal nicht kümmert, wird durch den Cast eines langen Feldes in ein kurzes Feld eben eine Warnung ausgegeben, die zu Verlust von Daten führen könnte.

Solche Dinge sollte man vermeiden, ins besonders wenn bei u.U. Millionen von Sätzen dadurch das Joblog zugemüllt wird und sogar der Job (wenn Systemwerte entsprechend eingestellt sind) angehalten werden kann.
Im Zweifel wird bei *WRAP auch noch jedesmal ein Joblog ausgegeben.
Da geht dann sogar die Performance in die Knie.

Wenn du sicher bist, dass der Inhalt passt, musst du halt mehrere Schritte verwenden:

dec(dec(substr(digits(MyField), Start, Länge), 10, 0) / 100, 8, 2)
* case when MyField < 0 then -1 else 1 end

Start und Länge hängen dann halt von der Ursprungsgröße ab.

Fuerchau
05-09-13, 12:58
Je nach Release steht dir auch die skalare Funktion MOD zur Verfügung:

mod(trunc(myfield, 2), 100000000)

KingofKning
05-09-13, 13:12
Korrektur:
Wo passiert denn der Fehler eigentlich?
Wenn du z.B. 1336826,520 versuchst auf 8, 2 zu casten wirst du einen fehler bekommen, da du instesammt 9 Stellen hast. Und du dabei aber auf 8 Stellen verringern willst.

Das war mein Denkfehler, ich bin beim cast davon ausgegangen das er 8 Stellen vor dem Komma und 2 nach dem Komma macht, richtig ist aber das die Gesamte Zahl 8 Stellen hat wovon 2 Nachkommastellen sind.

Das kommt davon wenn man copy paste macht und sich nicht durchliest was cast bedeutet.

Handbücher lesen war früher nicht das schlechteste da wußte man hinterher wovon man spricht.

GG