PDA

View Full Version : SQLDA - dynamisches SQL SUM Funktion



chrisssiie
05-09-16, 12:48
Hallo,

ich arbeite in einem Programm mit der SQLDA - Struktur um dynamisch SQL´s auszuführen.

Das funktioniert auch sehr gut, außer wenn ich eine SUM - Funktion im SQL verwende:

z.B. SELECT SUM(WERT) FROM TABELLE

Dann bekomme ich immer im SQLCOD den Fehlercode -822 zurück, ich weiß aber nicht so recht warum.


Die Programmvariablen weiße ich folgendermaßen zu:

Beim FETCH (exec sql FETCH NEXT FROM C1 USING DESCRIPTOR :SQLDA) kommt es dann immer zum -822 Fehler.

Die SUM-Felder sind vom SQLTYP 485.

ein COUNT(*) funktioniert z.B., nur der SUM mag nicht :(

Irgendwer eine Idee?






D alpha s 4096A inz dim(999)
D timestamp s Z inz dim(999)
D packedDec S 31p 9 inz dim(999)
D zonedDec s 31s 9 inz dim(999)
D integer s 8B 0 inz dim(999)




for index = 1 to SQLD;
SQLVAR = SQL_VAR(index);

select;
when SQLTYPE = 484 or SQLTYPE = 485; //Packed
SQLDATA = %addr(packedDec(index));
#MSQLL(index) = SQLLEN;
SQLLEN = (256*%len(packedDec(index))) + %decpos(packedDec(index));
when SQLTYPE = 488 or SQLTYPE = 489; //Zoned
SQLDATA = %addr(zonedDec(index));
#MSQLL(index) = SQLLEN;
SQLLEN = (256*%len(zonedDec(index))) + %decpos(zonedDec(index));
when SQLTYPE = 392 or SQLTYPE = 393; //Timestamp
SQLDATA = %addr(timestamp(index));
#MSQLL(index) = SQLLEN;
SQLLEN = %len(timestamp(index));
when SQLTYPE = 496; //Integer
SQLDATA = %addr(integer(index));
#MSQLL(index) = SQLLEN;
other;
SQLDATA = %addr(alpha(index));
#MSQLL(index) = SQLLEN;
SQLLEN = %len(alpha(index));
endsl;

#FLDS($CF) = %trimr(SQLNAME);
$CF = $CF+1;

SQL_VAR(index) = SQLVAR;
ENDFOR;

andreaspr@aon.at
05-09-16, 13:18
Probiere mal die SUM mit einem CAST zu überziehen:

SELECT CAST(SUM(WERT) as DEC(31, 9)FROM TABELLE

lg Andreas

chrisssiie
05-09-16, 13:26
auch schon probiert, leider ohne erfolg :(

bin aber denke ich kurz vor der Lösung ;)
Man muss denke ich noch bei diesem SQLTYP noch die SQLIND (Null-Indikator) Variable zuweisen.



Probiere mal die SUM mit einem CAST zu überziehen:

SELECT CAST(SUM(WERT) as DEC(31, 9)FROM TABELLE

lg Andreas

BenderD
05-09-16, 13:27
... bei ungeradem SQLTYPE brauchst Du zusätzlich einen Null-Indicator.

D*B