Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensätze Zählen klappt nicht ! Finde Fehler nicht. (https://www.delphipraxis.net/55433-datensaetze-zaehlen-klappt-nicht-finde-fehler-nicht.html)

wlfmario 20. Okt 2005 20:05

Datenbank: Interbase • Zugriff über: IB

Datensätze Zählen klappt nicht ! Finde Fehler nicht.
 
Hallo,

ich benutze eine Interbase Datenbankmit zwei tabellen.
Jetzt möchte ich wissen wie viel Datensätze in einer Tabelle sind und benutze folgende Zeilen:
Delphi-Quellcode:
procedure TFilmFact.FormActivate(Sender: TObject);
 var anzKunden: integer;
begin
  DM.IBKunde.Close;
  DM.IBKunde.SelectSQL.Text := 'SELECT Count(*) FROM KUNDEN';
  DM.IBKunde.Open;
  AnzKunden := DM.IBKunde.Fields[0].AsInteger;
  StatusBar1.Panels[0].Text := 'Kunden Gesammt: '+ inttostr(AnzKunden);
end;
in dem Form wo das Script leigt, sind noch drei DBGrid's Inkl. je einen Datasource. Die IBDataSet ist auf Activ = True.
Wenn ich das Script so ausführe, kommt folgende Meldung:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt FilmFactProj.exe ist eine Exception der Klasse EDatabaseError aufgetreten. Meldung: 'IBKunde: Das Feld 'KDID' wurde nicht gefunden'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
Wenn ich das DM.IBKunde.Close weck mache, kommt diese Meldung:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt FilmFactProj.exe ist eine Exception der Klasse EIBClientError aufgetreten. Meldung: 'Größenfehler - Feld KDID ist zu klein für die Daten'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
Meine vermutung ist, das es an den TataSourcen hängt.
Ich möchte einfach nur die Anzahl der Datensätze in einer Variabel stehen haben.

Bevor mich jemand da drauf Aufmerksam macht, das dieses schon in einem anderem Forum steht ! Ja ich habe das auch woander gepostet, leider nicht die Antworten bekommen die ich suchte. Ich möchte nur wissen wo der Hacken ist um mein Hintergrund Wissen zu vertieven. Mit Aussagen wie Lies ein Buch oder Schmeichelnd umschrieben du bist zu Blöd kann ich nichts anfagen.
Ich hoffe, das mir Einsteiger jemand erkären kann wie so die Fehler kommen und was ich bei einer DB wie Interbase Beachten muß in Delphi.

Danke schon einmal für die Antworten.

Hansa 20. Okt 2005 22:54

Re: Datensätze Zählen klappt nicht ! Finde Fehler nicht.
 
Zitat:

Zitat von wlfmario
...Bevor mich jemand da drauf Aufmerksam macht, das dieses schon in einem anderem Forum steht ! Ja ich habe das auch woander gepostet, leider nicht die Antworten bekommen die ich suchte... Schmeichelnd umschrieben du bist zu Blöd kann ich nichts anfagen.
Ich hoffe, das mir Einsteiger jemand erkären kann wie so die Fehler kommen...

Fehlt vielleicht nur die Geduld ? :mrgreen: Was soll denn das :
Delphi-Quellcode:
AnzKunden := DM.IBKunde.Fields[0].AsInteger;
Was soll das Fields [0] ? :shock: Woher soll die DB wissen, was AnzKunden ist usw. ??

Jelly 20. Okt 2005 22:59

Re: Datensätze Zählen klappt nicht ! Finde Fehler nicht.
 
Zitat:

Zitat von Hansa
Was soll denn das :
Delphi-Quellcode:
AnzKunden := DM.IBKunde.Fields[0].AsInteger;
Was soll das Fields [0] ? :shock: Woher soll die DB wissen, was AnzKunden ist usw. ??

Fields[0] ist das erste Feld des Resultsets. Im Resultset ist nur eine Spalte drin, nämlich die Anzahl der Datensätze. Und diesen Wert speichert er als Integer in der Variable AnzKunden. Also darin seh ich keinen Fehler.

Hansa 20. Okt 2005 23:50

Re: Datensätze Zählen klappt nicht ! Finde Fehler nicht.
 
Ja, das stimmt. Im Prinzip müßte es so schon gehen. Einen Array - Index anzugeben, das ist aber schlecht. 8) Vielleicht liegts nur an dem AS.

Delphi-Quellcode:
  DM.KuDS.Close;
  DM.KuDS.SelectSQL.TEXT :='SELECT COUNT (*) AS Z FROM KUNDE';
  DM.KuDS.Open;
  Button1.Caption := IntToStr (DM.KuDS.FieldByName ('Z').AsInteger);

Sharky 21. Okt 2005 06:34

Re: Datensätze Zählen klappt nicht ! Finde Fehler nicht.
 
Hai wlfmario,

kann es sein das Du dem DataSet IBKunde über den Feldeditor (rechter Mausklick auf die Komponente) Felder zugewiesen hast?
Wenn ja wäre dies nämlich die Erklärung für den Fehler. Wenn im Feldeditor Einträge vorhanden sind erwartet das DataSet diese auch bei jeder SELECT-Abfrage und giebt genau diese Felder zurück.

Ich würde an deiner Stelle eine extra Funktion in deinem DataModule erzeugen welches Dir die Anzahl der Datensätze aus einer Tabelle zurückgibt:
Delphi-Quellcode:
function TDM.TableCount(aTable: string): integer;
begin
  Result := -1;
  with TIBQuery.Create(nil) do
  begin
    try
      Database := IBDataBase1;
      Close;
      SQL.Text := Format('SELECT Count(*) FROM %s', [aTable]);
      Open;
      Result := Fields[0].AsInteger;
    finally
      Free;
    end;
  end;
end;
Diese Funktion kannst Du dann in deiner Form benutzen.
Delphi-Quellcode:
procedure TFilmFact.FormActivate(Sender: TObject);
begin
  StatusBar1.Panels[0].Text := Format ('Kunden Gesammt: %d',[DM.TableCount('kunde')]);
end;

nieurig 21. Okt 2005 07:13

Re: Datensätze Zählen klappt nicht ! Finde Fehler nicht.
 
Guten Morgen Mario,
wie Sharky schon geschrieben hat ...

Irgendetwas an Deinem Programm (und nicht der dargestellte Code) verlangt nach dem Feld KDID. Eine Möglichkeit sind die von Sharky genannten Datenbankfelder die über den Feldeditor der Query oder Tabelle festgelegt sein könnten.

Ein anderer Grund könnten Objekte vom Register "DB-Steuerung" auf Deinem Formular sein. Wenn eines davon auf dieses Feld verweist (z.B. weil Du vorher mit dieser Abfrage die Inhalte der Tabelle dargestellt hast) dann kracht es jetzt, weil die neue Abfrage nur ein Feld mit der Summe zurückliefert.

Viel Erfolg
Niels

wlfmario 21. Okt 2005 08:02

Re: Datensätze Zählen klappt nicht ! Finde Fehler nicht.
 
Zitat:

Zitat von Sharky
Delphi-Quellcode:
function TDM.TableCount(aTable: string): integer;
begin
  Result := -1;
  with TIBQuery.Create(nil) do
  begin
    try
      Database := IBDataBase1;
      Close;
      SQL.Text := Format('SELECT Count(*) FROM %s', [aTable]);
      Open;
      Result := Fields[0].AsInteger;
    finally
      Free;
    end;
  end;
end;

Aha das bringt schon viel ! Danke für die tollen Erkärungen.
Gibt es eine möglichkei auch ohne TIBQuery damit zu arbeiten ?

MrSpock 21. Okt 2005 08:10

Re: Datensätze Zählen klappt nicht ! Finde Fehler nicht.
 
Hallo wlfmario,

es gibt die Alternative mit einer IBTable zu arbeiten und mit FetchAll alle Datensätze zu holen. Dann kannst du mit RecordCount die Anzahl der Datensätze ermitteln. Dabei werden aber alle Datensätze ggf. übers Netz übertragen, was natürlich um einiges länger dauert als das Absetzen einer Query, die nur einen Wert übers Netz als Antwort liefert.

Hansa 21. Okt 2005 08:41

Re: Datensätze Zählen klappt nicht ! Finde Fehler nicht.
 
Ne, IBTable ist nicht die Alternative. Sowohl IBTable als auch IBQuery ist nur für BDE geschädigte gedacht. 8) Benutze besser immer IBDataset.

wlfmario 21. Okt 2005 08:45

Re: Datensätze Zählen klappt nicht ! Finde Fehler nicht.
 
Das wollte ich wissen !

Da ich IBDataSet in meinem Prg. benutze und nicht IBQuerry oder Table.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz