Autor Beitrag
edvsklave
Hält's aus hier
Beiträge: 13

WinXP
Delphi 5 Pro, Delphi 2006 Pro
BeitragVerfasst: Di 05.06.07 15:34 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13

WinXP
Delphi 5 Pro, Delphi 2006 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 08.06.07 22:35 
Das müßte eigentlich funktionieren.
Das setzen des Filters sieht bei dir so aus?
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 13

WinXP
Delphi 5 Pro, Delphi 2006 Pro
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 13

WinXP
Delphi 5 Pro, Delphi 2006 Pro
BeitragVerfasst: 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.