Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Hilfe bei "FilterRecord" (https://www.delphipraxis.net/10662-hilfe-bei-filterrecord.html)

Computersklave 23. Okt 2003 01:34


Hilfe bei "FilterRecord"
 
Hallo,

wer kann mir helfen? :?

Habe folgenden Code:


Code:
procedure TSuche_Empf.TableSucheFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
if TableSuche.FieldByName('ZugewieseneFirma').AsString=Edit1.text
 then Accept:=true
 else Accept:=false;
end;
Das funzt wunderbar, aber wie bekomme ich jetzt ein zweites Feld in die Bedingungen?
Thanks fürs antworten.

By

Leuselator 23. Okt 2003 01:36

Re: Hilfe bei "FilterRecord"
 
Meinst Du das
Delphi-Quellcode:
procedure TSuche_Empf.TableSucheFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
if (TableSuche.FieldByName('ZugewieseneFirma').AsString=Edit1.text)
and (TableSuche.FieldByName('AndererFeldName').AsString=AnderesEdit.text)
 then Accept:=true
 else Accept:=false;
end;

Computersklave 23. Okt 2003 01:43

Re: Hilfe bei "FilterRecord"
 
:-D Danke, für die schnelle Hilfe!

Hab die Klammern () vergessen. Nun funzt es.

By

negaH 23. Okt 2003 02:39

Re: Hilfe bei "FilterRecord"
 
Delphi-Quellcode:
begin
  Accept := (TableSuche.FieldByName('ZugewieseneFirma').AsString = Edit1.text) and
            (TableSuche.FieldByName('AndererFeldName').AsString = AnderesEdit.text);
end;
Aber in einer Filterbedinung auf diese Weise auf die Felder zuzugriffen ist schon Performance schädigend in grobster Weise.

Erzeuge für die TableSuche Feldkomponenten, speichere Edit1.Text unf AnderesEdit.Text in private Felder des TForm1 zwischen und nutze folgenden Source:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
     ... blablabla
  private
    FFirma: String;
    FAnderes: String;
  end;

begin
  Accept := (AnsiCompareText(TableSucheZugewieseneFirma.AsString, FFirma) = 0) and
            (AnsiCompareText(TableSucheAnderesFeld.AsString, FAnderes) = 0);
end;
FFirma und FAnderes wird bevor gefiltert wird gesetzt.
Die Aufrufe von AnsiCompareText() vergleichen die String ohne Berücksichtigung der Groß/Klein Schreibung.

Eventuell wäre es sowieso besser wenn man auf solche Filterungen verzichten kann und z.B. mit SQL Queries und Cachedupdates arbeitet.

Bei jedem Aufruf von Edit1.Text sendet die GetText Methode des Controls eine wm_GetText Message an das dahinterliegende Fensterhandle. Somit ist der Aufruf von Edit.Text nicht nur eine einfache Zugriffproperty auf einen String der im Edit gespeichert wurde. Dieser Aufruf kosstet ne Menge Zeit.

Der Aufruf von TableSuche.FieldByName('ZugewieseneFirma') durchsucht jedesmal die Feldlister der Tabelle nach dem gewünschten Feld. Angenommen "ZugewieseneFirma" ist das letzte Feld von 100 Tabellenfeldern so vergleicht .FieldByName() den gesuchten Feldnamen 100 mal bei jedem Aufruf.

Durch Tabellenkomponenten wird diese beseitigt, über diese hat man direkt Zugriff.

Bei jedem Scrolling in der Tabelle wird die Filterung für alle sichtbaren Rows aufgrufen, so lange bis entwerder Row-Count Datensätze gefunden wurden oder eben die Tabelle EOF ist.
Diese Filterung erfolgt auch bei Table.First/.Last/.Next/.Prior. Angenommen in der Tabelle stehen 10.000 Datensätze und nur EINER stimmt mit der Filterbedinung überein, dann würde in deinem Falle 100 * 10.000 * 2 .FieldByName() einzelne Vergleiche machen und 10.000 * 2 mit SendMessage(wm_GetText, ) der Text der Edits geholt.

Gruß Hagen

Computersklave 23. Okt 2003 03:59

Re: Hilfe bei "FilterRecord"
 
Hallo Hagen,
danke für's Posten.

Zitat:

Eventuell wäre es sowieso besser wenn man auf solche Filterungen verzichten kann und z.B. mit SQL Queries und Cachedupdates arbeitet.
Habe aber leider keine Erfahrung mit SQL. :wall:
Ist der Aufwand groß das Problem mit SQL Query zu lösen?

Es gibt einen vorher feststehenden für Wert für das Feld "ZugewieseneFirma" und einen Wert für
das Feld "Firma" der bei ButtonClick aus dem Editfeld "Edit1" gewonnen wird.

Dann soll mir "DBGrid1" nur die Werte anzeigen für welche beide Felder stimmen oder zumindest
die eingegebenen Werte von "Edit1" mit den ersten Zeichen des Felds "Firma" übereinstimmen.
Oben genannte Lösung klappt ja, aber wie Du schon sagst wird das bei einigen Tausend Datensätzen
eine Menge Zeit kosten.

Aber select ???

By

negaH 23. Okt 2003 07:52

Re: Hilfe bei "FilterRecord"
 
SQL-Code:
  select * from Datenbank
  where (ZugewieseneFirma = :Firmenname) and (AnderesFeld = :Feld1)
oder

SQL-Code:
  select * from Datenbank
  where (ZugewieseneFirma like :Firmenname) and (AnderesFeld like :Feld1)
geöffnet wird mit

Delphi-Quellcode:
  Query.Close;
  Query.ParamByname('Firmenname').AsString := Edit1.Text;
  Query.ParamByName('Feld1').AsString := Edit2.text;
  Query.Open;
1.) Query.SQL.Text in der IDE bearbeiten
2.) Query.Params in der IDE bearbeiten
3.) Doppelklick auf Query in IDE und Felder hinzufügen
4.) Query.Active := True in IDE setzen
5.) DataSource mit Query verbinden

Es ist immer schwierig exakte und funktionstüchtige SQL's hier zu Posten, das jede Datenbank Unterschiede in ihren SQL Dialekten besitzt. Obige SQL's sollte mit der Local SQL der BDE funktionieren.

Gruß Hagen

Computersklave 23. Okt 2003 13:47

Re: Hilfe bei "FilterRecord"
 
:? Hallo Hagen, bin wieder lebendig.

Ich habe das mal so versucht, aber noch kein Ergebnis bekommen. :( :wall: :gruebel:
Bei der IDE habe ich zum Query1 folgendes gesetzt:

Query.SQL.Text in der IDE bearbeiten -
SQL-Code:
select * from datenbank.db
where (ZugewieseneFirma like : ZugewieseneFirma) and (Firma like : Firma)
Query.Params in der IDE bearbeiten - Firmenname und Feld1
Doppelklick auf Query in IDE und Felder hinzufügen - Will er nicht
Query.Active := True in IDE setzen - Will er nicht
DataSource mit Query verbinden - OK

Ich habe also ein TQuery aufs Form gelegt und o.g. Einstellungen gemacht.
In meiner ButtonClick Prozedur steht nun:

Delphi-Quellcode:
Query1.Close;
  Query1.ParamByname('ZugewieseneFirma').AsString := Edit1.Text;
  Query1.ParamByName('Firma').AsString := FlatEdit1.text;
  Query1.Open;

Meine Datenbank ist die Paradox 7 von Delphi.

Danke :love:
der sklave


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 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