Anmelden

View Full Version : Sqlfehler 304 SQLSTT = '01515'



tarkusch
11-06-13, 04:41
Hallo *all,

ich zerbreche mir den Kopf, warum eigentlich SQL Statement:


exec sql
SELECT SUM(ZTEV + ZTAV)
INTO :SOLLZ :MyIndikator
FROM (
SELECT SUM(DISTINCT
CASE WHEN ZTAV = 0 THEN ZTEV ELSE 0 END) AS ZTEV,
SUM(DISTINCT
CASE WHEN ZTAV <> 0 THEN ZTAV ELSE 0 END) AS ZTAV
FROM WORKF
WHERE PENR = :PENR AND AUF# = :AUF#
GROUP BY ABT, KST, LAG, AUF#)
AS X;

den Fehler:

Sqlcod 304 SQLSTT = '01515'
Explanation: Conversion error in assignment to host variable &2
liefert.

Wenn ich das Sql direkt absetze bekomme ich folgende Werte:

EVZT ZTAV
29.720 0


Die 2 Variablen sind mit 6, 0 definiert, daher ist mir der Error nicht verständlich da das Ergebnis
5, 0 ist.

In der Programmstruktur hätte ich MyIndikator wie immer wie folgt definiert:

d MyIndikator 5I 0


Was hats den da?

Dank im Voraus

Tarki

B.Hauser
11-06-13, 05:55
Das Problem liegt wohl darin, dass Du die Summen nicht explizit auf einen bestimmten Datentyp und länge gecastest hast. Damit kann es vorkommen, dass die automatisch ermittelte Länge größer ist, als das ErgebnisFeld.

Versuchs so:

SELECT Cast(SUM(ZTEV + ZTAV) as Dec(6, 0))
INTO :SOLLZ :MyIndikator
...

Birgitta

tarkusch
11-06-13, 06:19
Morgen Birgitta,

habe es vorher schon versucht die summen im inneren Select mit Decimal 6, 0 anzugeben, aber leider ohne erwünschten Erfolg.

Leider hat das mit dem Cast auch nicht funktioniert.

Der MyIndikator ist bei dem Fehler auf -2.
Kann ich da irgendetwas rauslesen?

Danke

Tarki

Fuerchau
11-06-13, 07:33
Mach mal einen "create table test as (select ...)" um den Typ des Zielfeldes festzustellen.
Wer weiß schon wie SQL genau Ergebnisfelder definiert um den maximal möglichen Ergebniswert aufzunehmen selbst wenn das tatsächliche Ergebnis durchaus kleiner sein kann.

-2 bedeutet nur "Wert zu groß für Zielfeld".

tarkusch
11-06-13, 08:09
Die Ergebnisfelder sind 31 Decimal.

Ich hätte es so versucht, aber bekomme immer noch den Fehler.
Wie definiere ich ZTEV, ZTAV?


SELECT Cast(SUM(ZTEV + ZTAV) as Dec(6, 0))
INTO :SOLLZ :MyIndikator
...
Decimal( SUM(DISTINCT
CASE WHEN ZTAV = 0 THEN ZTEV ELSE 0 END), 6, 0) AS ZTEV,

...

Danke vielmals

Tarki

B.Hauser
11-06-13, 09:22
Und warum definierst Du dann Deine Ausgabe-Felder nicht 31P 0?
Anstatt mit Gewalt in SQL auf 6, 0 konvertieren.

Indikator -2 deutet allerdings auch darauf hin, dass mindesten eines der Felder ungültige numerische Wert beinhaltet (irgend einen krummen Hex-Wert).

Birgitta

BenderD
11-06-13, 09:58
Die Ergebnisfelder sind 31 Decimal.

Ich hätte es so versucht, aber bekomme immer noch den Fehler.
Wie definiere ich ZTEV, ZTAV?


SELECT Cast(SUM(ZTEV + ZTAV) as Dec(6, 0))
INTO :SOLLZ :MyIndikator
...
Decimal( SUM(DISTINCT
CASE WHEN ZTAV = 0 THEN ZTEV ELSE 0 END), 6, 0) AS ZTEV,

...

Danke vielmals

Tarki

was haben denn ZTEV und ZTAV in der Tabelle für eine Datenart?

Ein spezifische Eigenart von interaktivem SQL ist das Übergehen von Daten Umsetzungsfehlern (die ominösen Pluszeichen in der Anzeige). Das kann zu Deinem Resultat beitragen, wenn in Daten, die in der Where Klausel wegfallen, aber bei der Berechnung der Ergebnismenge ausgwertet werden, nicht umsetzbare Daten sind.

D*B