Entwickler-Ecke

Datenbanken - [ADO] RecordCount und Filter


edvsklave - Di 05.06.07 15:34
Titel: [ADO] RecordCount und Filter
Hallo Datenbankprogrammspezialisten ;-) ,
hab folgendes Problem:
Unter D5/BDE gab eine gefilterte Table-Komponente mit RecordCount die Menge an gefilterten Datensätzen zurück. Unter D2006Win32/ADO gibts aber auch bei gefilterten Tabellen immer die Gesamtanzahl zurück und nicht die Anzahl der gefilterte Datensätze. Gibts eine andere Funktion oder ein Workaround?

Gruß, André


Ralf Jansen - Di 05.06.07 19:20

Das konkrete Verhalten von Filtern und Recordcount in ADO ist abhängig von deiner Einstellungen und deiner DB.
Also, um das zu beantworten brauchen wir mehr Details .

Welche ADO Komponente benutze du? (Table,Dataset,Query)
Welchen Cursortype?
Welchen Locktype?
Welche DB?

Gruß


edvsklave - Fr 08.06.07 08:46

Hallo,

erst mal danke für den Hinweis.
Ich benutze eine ADOTable Komponente in Verbindung mit einer Datasource Komponente. Der Cursortyp steht auf dsStatic (Voreinstellung), der Locktype auf ltOptimictic (auch Vorenstellung), die Datenbank ist SQL2005 SP1.

Gruß, André


Ralf Jansen - Fr 08.06.07 22:35

Das müßte eigentlich funktionieren.
Das setzen des Filters sieht bei dir so aus?

Delphi-Quelltext
1:
2:
3:
  ADOTable1.Open;
  ADOTable1.Filter := 'irgendeinFilter';
  ADOTable1.Filtered := true;



Und was grundsätzliches. Benutze NIEMALS eine Table Komponente mit einer Server Datenbank das bringt nur Probleme(insbesondere Performance Probleme). Versuch nicht das BDE Vorgehen mit ADO nachzubilden. Das wird nicht gutgehen.
Nimm IMMER eine Query Komponente(im Fall von ADO ist TADODataset TADOQuery vorzuziehen).
In der Query benuzte möglichst immer eine WHERE Clause und hole nur die Daten die du auch wirklich brauchst(also nicht einfach alles holen wie mit einer ADOTable und dann mit filter das ausblenden was man nicht braucht).


edvsklave - Di 12.06.07 14:43

Nochmals Danke für die Tips, werds beim nächsten Projekt beachten.
Ich benutze für das Filtern der Daten den ACCEPT-Parameter des OnFilterRecord-Ereignis der Tabel-Komponente.
Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TDMMain.ADOTRechnungFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
  .
  .
  .
  Dat1 := StrToDate(Datum1);
  Dat2 := StrToDate(Datum2);
  Accept := ((DataSet['Datum'] >= Dat1) AND (DataSet['Datum'] < Dat2));
  .
  .
end;

Wie gesagt, gefiltert wird richtig nur die Anzeige der Datensätze stimmt nicht. Ich hab das Delhpi-Projekt 1:1 aus D5 so übernommen und nur auf die Syntax von DDS2005Win32 angepasst (daher auch die Table-Komponenten von BDE). Für diese Anwendung lass ich das aber jetzt so, da es hier nicht auf Geschwindigkeit ankommt (werd es wie schon gesagt in den nächsten Projekten mit den Querys machen).
Falls es keine direkte Lösung gibt, muss ich mir halt eine Zählfunktion schreiben, möchte mir die Mühe aber erst mal nicht machen.


edvsklave - Di 19.06.07 12:02

Für die Nachwelt:
Die Funktion liefert immer die Gesamtanzahl der Datensätzen einer Tabelle unabhängig vom Filterstatus, dass war unter der BDE anders. Man muss also einen anderen Weg finden um die Anzahl der gefilterten Datensätze zu erhalten.