PDA

View Full Version : SQL-Fehler free-rpg



AS400SD
06-10-10, 13:17
Hallo zusammen,
folgende Fehlermeldung habe ich:
Nachricht . . . : Anzeigervariable erforderlich.
Ursache . . . . : Eine Anweisung FETCH, eine eingebettete Anweisung SELECT,
eine Anweisung CALL, GET DESCRIPTOR, SET oder VALUES INTO hatte einen
Nullwert zur Folge, für Host-Variable AMOUNT wurde jedoch keine
Anzeigervariable angegeben. Die relative Position der Host-Variablen in der
Klausel INTO oder der Parameterliste ist 2. Ist der Name der Host-Variablen
*N, wurde ein Deskriptorbereich angegeben.
Tritt dieser Fehler bei einer Anweisung GET DESCRIPTOR auf, wird der
Nullwert zurückgegeben, aber das Element INDICATOR wurde bei der Anweisung
GET DESCRIPTOR nicht angegeben.
Fehlerbeseitigung: Eine Anzeigervariable angeben und das Programm erneut
vorkompilieren.

Im Programm habe ich folgendes codiert :

/free
exec sql select sum(Wert1 - Wert2) into :AMOUNT
from DateiX

sum(Wert1 - Wert2) kann = 0 sein
D AMOUNT s 14 2

Hat jemand eine Lösung zu diesen Problem?

B.Hauser
06-10-10, 13:36
So wie es aussieht kann Dein SQL-Statement einen NULL-Wert (hat nichts zu tun mit dem deutschen Wort Null = 0) zurückbringen. (NULL-Wert = Nix, Kein Ergebnis)

Um auf NULL-Wert prüfen zu können, wird eine Indikator/Anzeiger-Variable erwartet.

Eine Indikator-Variable wird in RPG mit 5I 0 definiert und im SQL-Statement unmittelbar (nur durch ein Blank getrennt) nach der Variablen angegeben, die geprüft werden soll. Wurde für die Variable ein NULL-Wert ausgegeben, so geht die Indikator-Variable auf -1 anderenfalls wird 0 zurückgegeben. Bei einem NULL-Wert wird die Host-Variable nicht initialisiert. Also am besten vor dem SQL-Statement clearen oder die Indikator-Variable abfragen und dann clearen.



D MyInd S 5I 0

/Free
Clear Amount;
Exec SQL Select sum(Wert1 - Wert2) into :AMOUNT :MyInd
from DateiX;
If MyInd < *Zeros;
Clear Amount;
Endif;
/End-Free

Birgitta

AS400SD
06-10-10, 13:49
Vielen Dank! :)
Hat nun funktioniert!!!

andreaspr@aon.at
06-10-10, 14:43
Hallo,

mit der Funktion COALESCE kannst du NULL in einen Defaultwert umwandeln:


exec sql select COALESCE(sum(Wert1 - Wert2), 0) into :AMOUNT
from DateiX

ab 6.1 geht auch:

exec sql select IFNULL(sum(Wert1 - Wert2), 0) into :AMOUNT
from DateiX

Fuerchau
06-10-10, 15:23
Wobei der Anzeiger insoweit hilfreich ist festzustellen, dass keine Daten für die Summe vorhanden sind.

BenderD
06-10-10, 15:34
... alles Murks!
es muss heißen:
select sum(coalesce (Wert1, 0) - coalesce (Wert2, 0))
from ...

alles andere liefert nicht erwartete Ergebnisse.

"null" versteht man am Besten, wenn man es mit "unbestimmt" übersetzt.

null - irgendwas = null !!!
sum(irgendwas) = null, falls mindestens ein Wert null ist

D*B



Wobei der Anzeiger insoweit hilfreich ist festzustellen, dass keine Daten für die Summe vorhanden sind.