Entwickler-Ecke

Datenbanken - Anzahl der Datensaetze mit SQL auslesen


bis11 - Sa 17.08.02 08:09
Titel: Anzahl der Datensaetze mit SQL auslesen
Hallo Leute,

ich habe da ein Problem, daß ich die Anzahl der Datensaetze nicht mit einem SQL-Befehl auslesen kann und dies dann in einem Label anzeigen lassen kann.

Ich habe es mit folgenden Code versucht zu realisieren. Ich bekomme aber immer Null raus obwohl Datensätze in der Tabelle vorhanden sind :


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function Datensaetze_zaehlen:integer;
begin
  with Kundenformularfenster do begin
    Query1.SQL.Clear;
    result := Query1.SQL.Add('SELECT COUNT(DISTINCT Kundennummer) FROM "' + dirkunden + '\Kunden.DB"');
    Query1.ExecSQL;
  end;
end;


Aufrufen tue ich die Funktion mit :

Quelltext
1:
Lable13.Caption := IntToStr(Datensaetze_zaehlen);                    


Mit Table.RecordCount habe ich es auch schon probiert, daß funktioniert aber nicht, weil ich die Tablekompo nur dazu benutze um die Daten in den DBFeldern anzuzeigen.
Hat jemand vielleicht eine Idee, wie es funktionieren könnte ?


Alfons-G - Sa 17.08.02 08:48

Das kann in dieser Form auch gar nicht funktionieren. Die Eigenschaft SQL einer Query ist eine Stringliste. Die Funktion TStringlist.Add gibt die Position des neuen Eintrages in der Liste zurück. Beim ersten Eintrag ist diese 0.

Eine Query kann überhaupt erst ,nach dem sie ausgeführt wurde, ein Ergebnis ausgeben. Als nächstes schau Dir mal die Delphi-Hilfe zu Exec-SQL an. Dort steht, für welche Zwecke dieser Befehl geeignet ist. Zum Ausführen von Select-Anweisungen ist er es definitiv nicht :roll:

Eine korrekte Lösung sieht z.B. so aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function Datensaetze_zaehlen:integer; 
begin 
  with Kundenformularfenster do begin 
    Query1.SQL.Clear; 
    Query1.SQL.Add('SELECT COUNT(DISTINCT Kundennummer) AS Anzahl FROM "' + dirkunden + '\Kunden.DB"'); 
    Query1.Open; 
    result := Query1.Fields[0].AsInteger;
    Query1.Close;
  end; 
end;
Ich gebe berechneten Feldern im Übrigen grundsätzlich Namen (mit AS Name), falls ich eine Funktion ausbaue und nochmal auf diesen Wert zugreifen muss. Alternativ könnte man im obigen Beispiel auf das Ergebnis mit Query1.FieldByName('Anzahl').AsInteger zugreifen.

:idea:


bis11 - Sa 17.08.02 09:13

Hi,

Ich danke Dir erstmal für Deinen Tip. Ich habe das jetzt mal so eingefügt. Wenn ich jetzt die Funktion aufrufe, kommt immer die Fehlermeldung "Das Feld Bemerkung kann er nicht finden". Das Feld Bemerkung ist ein BLOBMemo. Diese Meldung kommt dann wenn der den Befehl "Query1.Open" abarbeiten will.


Alfons-G - Sa 17.08.02 10:44

Versuch' mal, über eine andere SQL-Abfrage auf das Feld "Bemerkung" zuzugreifen. Normalerweise dürfte es keine Probleme geben. Nur als WHERE-Bedingung sind BLOBs ungeeignet.
Auf jeden Fall muß der Grund für diesen Fehler irgendwo in der Tabelle liegen.
Ein weiterer Versuch wäre

Quelltext
1:
2:
'SELECT COUNT(*) AS ANZAHL FROM
(SELECT DISTINCT Kundennummer FROM '+ dirkunden + '\Kunden.DB")'
Zumindest, wenn sich die innere Abfrage SELECT DISTINCT Kundennummer ... ohne Probleme ausführen lässt, sollte es funktionieren.

:)


bis11 - Sa 17.08.02 15:19

Hi,

ich habe jetzt ziemlich lange rumprobiert, ich komme aber immer wieder auf einen Nenner. Wenn ich den SQL-Befehl ausführe kommt immer Falsche Schlüsselwort : SELECT.

Die Funktion sie jetzt mit Deinem Befehl so aus :

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function Datensaetze_zaehlen:integer;
begin
  with Kundenformularfenster do begin
    Query1.SQL.Clear;
    Query1.SQL.Add('SELECT COUNT(DISTINCT Kundennummer) AS Anzahl FROM (SELECT Kundennummer FROM "'+ dirkunden + '\Kunden.DB")');
    Query1.Open;
    result := Query1.Fields[0].AsInteger;
    Query1.Close;
  end;
end;


Der Befehl den ich zuerst angewendet habe funktioniert ja in dem Programm Datenbankoberfläche hervorragend. Ich verstehe nur nicht, warum das in Delphi nicht funzt.


Steffer - Sa 17.08.02 16:09

Falscher Text:


Quelltext
1:
Query1.SQL.Add('SELECT COUNT(DISTINCT Kundennummer) FROM '+ dirkunden + '\Kunden.DB''');                    


bis11 - Sa 17.08.02 19:26

Sorry,

aber es funktioniert leider noch immer nicht.


bis11 - Sa 17.08.02 22:01

@Alfons-G, Steffer

ich habe jetzt eine Lösung bekommen und zwar Query1.RecordCount. Danke nochmals für Eure Hilfe.


Steffer - Sa 17.08.02 23:43

Nachtrag:
Also RecordCount; kannst du auch in einem TTable einsetzen...

Probier die SQL-Abfrage mal ohne dieses Distinct Kundennummer sondern einfach nur SELECT Count (Kundennummer)...