![]() |
Hilfe bei "FilterRecord"
Hallo,
wer kann mir helfen? :? Habe folgenden Code:
Code:
Das funzt wunderbar, aber wie bekomme ich jetzt ein zweites Feld in die Bedingungen?
procedure TSuche_Empf.TableSucheFilterRecord(DataSet: TDataSet;
var Accept: Boolean); begin if TableSuche.FieldByName('ZugewieseneFirma').AsString=Edit1.text then Accept:=true else Accept:=false; end; Thanks fürs antworten. By |
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; |
Re: Hilfe bei "FilterRecord"
:-D Danke, für die schnelle Hilfe!
Hab die Klammern () vergessen. Nun funzt es. By |
Re: Hilfe bei "FilterRecord"
Delphi-Quellcode:
Aber in einer Filterbedinung auf diese Weise auf die Felder zuzugriffen ist schon Performance schädigend in grobster Weise.
begin
Accept := (TableSuche.FieldByName('ZugewieseneFirma').AsString = Edit1.text) and (TableSuche.FieldByName('AndererFeldName').AsString = AnderesEdit.text); end; Erzeuge für die TableSuche Feldkomponenten, speichere Edit1.Text unf AnderesEdit.Text in private Felder des TForm1 zwischen und nutze folgenden Source:
Delphi-Quellcode:
FFirma und FAnderes wird bevor gefiltert wird gesetzt.
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; 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 |
Re: Hilfe bei "FilterRecord"
Hallo Hagen,
danke für's Posten. Zitat:
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 |
Re: Hilfe bei "FilterRecord"
SQL-Code:
oder
select * from Datenbank
where (ZugewieseneFirma = :Firmenname) and (AnderesFeld = :Feld1)
SQL-Code:
geöffnet wird mit
select * from Datenbank
where (ZugewieseneFirma like :Firmenname) and (AnderesFeld like :Feld1)
Delphi-Quellcode:
1.) Query.SQL.Text in der IDE bearbeiten
Query.Close;
Query.ParamByname('Firmenname').AsString := Edit1.Text; Query.ParamByName('Feld1').AsString := Edit2.text; Query.Open; 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 |
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:
Query.Params in der IDE bearbeiten - Firmenname und Feld1
select * from datenbank.db
where (ZugewieseneFirma like : ZugewieseneFirma) and (Firma like : Firma) 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 23:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz