Entwickler-Ecke

Datenbanken - "Variante des Typs (Null) konnte nicht in Typ (integer) ...


Stocki1990 - Sa 13.06.09 12:39
Titel: "Variante des Typs (Null) konnte nicht in Typ (integer) ...
... konvertiert werden

Servus Leute!

Ich bins mal wieder und hab eine Frage an euch. Bevor ich euch diese Frage stelle wollte ich mich noch einmal bei euch für eure bisherigen Hilfen bedanken. Habe, seit dem ich im Forum bin, einiges dazu gelernt. Aber nun zu meinem Problem:

In meinem Programm muss in der Statusbar die Anzahl der ausgeliehenen Filme einer Person (Kunden-ID) ausgegeben werden. Bei Kunden, welche Filme ausgeborgt haben, ist dies kein Problem. Wähle ich jedoch einen Kunden ohne ausgeliehene Filme auf, taucht die Fehlermeldung "Variante des Typs (Null) konnte nicht in Typ (integer) konvertiert werden" auf.

Um mein Problem genauer zu verdeutlichen, habe ich 3 Screenshots gemacht. Moderiert von user profile iconNarses: Bilder als Anhang hochgeladen.

Ich habe schon einen Entwurf gemacht, um die Fehlermeldung zu vermeiden. Dazu hätte ich eine IF-Entscheidung verwendet, wie ihr hier sehen könnt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure Tform1.AnzahlFilme();
var
Anzahl: integer;

begin
AdoQuery1.close;
AdoQuery1.SQL.Clear;
AdoQuery1.sql.add('SELECT Verleih.KundenID, Count(Verleih.VerleihID) AS AnzahlDVD, Verleih.Rückgabezeit FROM Verleih GROUP BY Verleih.KundenID, Verleih.Rückgabezeit HAVING Verleih.KundenID = ' + inttostr(treeview1.Selected.stateindex) + ' AND Verleih.Rückgabezeit Is Null');
AdoQuery1.open;

Anzahl := Adoquery1.fieldvalues['AnzahlDVD'];

if Anzahl = null then begin
showmessage('Kein Film wurde ausgeborgt!');
end else begin
Statusbar1.Panels[0].Text := 'Ausgeliehene Filme: ' + inttostr(Anzahl);
end;

end;


Habe es schon mit mehreren Varianten probiert, doch keine scheint zu funktionieren. Ich hoffe, dass ihr mir hier weiterhelfen könnt.
Wie man in der Abfrage sehen kann, haben die ersten 3 Kunden Filme ausgeborgt. Bei dem 4ten jedoch tritt dann der Fehler auf.

Danke im Voraus
Christoph

PS: Bei diesem Projekt wären die SQL-Injections egal - Ist eine Hausübung in größerem Umfang


Xentar - Sa 13.06.09 14:40

Kenn die Ado Komponenten nicht, aber im Prinzip müsste das genau so gehen:

Delphi-Quelltext
1:
2:
3:
4:
if not AdoQuery1.IsEmpty then
begin
  // Daten verarbeiten.
end;


bzw.

Delphi-Quelltext
1:
if not AdoQuery.FieldByName('AnzahlDVD').isNull then ...                    


Delete - Sa 13.06.09 14:58

Eine Aggregatfuntion wie COUNT kann doch niemals NULL zurückgeben.


Stocki1990 - Sa 13.06.09 15:20

Servus Leute!

Danke für eure Hilfe - Nun funktioniert alles, wie es sein sollte.

Wünsche euch noch ein sonniges Wochenende
Christoph


Xentar - Sa 13.06.09 15:22

Ja, weil du deiner Variablen AnzahlDVD in diesem Fall keinen Wert zuweist. In dem Fall steht dort ein zufälliger Wert drin.


Delete - Sa 13.06.09 15:22

Versuch es mal mit AdoQuery.EOF. Wenn kein Satz gefunden wird, ist die Datenmenge leer, dann steht auch kein NULL drin.


Stocki1990 - Sa 13.06.09 15:23

Danke für eure Hilfe - Haben uns da "geschnitten". Alles passt nun ;)