Autor Beitrag
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 17.08.02 08:09 
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 :

ausblenden 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 :
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 307

Win XP Prof, Linux, Win 7
D5 Prof, D7 Architect, D2005 Architect, D2007 Architect
BeitragVerfasst: 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:
ausblenden 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:

_________________
Alfons Grünewald
bis11 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 307

Win XP Prof, Linux, Win 7
D5 Prof, D7 Architect, D2005 Architect, D2007 Architect
BeitragVerfasst: 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
ausblenden 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.

:)

_________________
Alfons Grünewald
bis11 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: 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 :
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 299



BeitragVerfasst: Sa 17.08.02 16:09 
Falscher Text:

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

_________________
Keine Signatur ...
bis11 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 17.08.02 19:26 
Sorry,

aber es funktioniert leider noch immer nicht.
bis11 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 299



BeitragVerfasst: 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)...

_________________
Keine Signatur ...