AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Hilfe bei "FilterRecord"
Thema durchsuchen
Ansicht
Themen-Optionen

Hilfe bei "FilterRecord"

Ein Thema von Computersklave · begonnen am 23. Okt 2003 · letzter Beitrag vom 23. Okt 2003
Antwort Antwort
Computersklave

Registriert seit: 23. Okt 2003
Ort: Sachsen
11 Beiträge
 
Delphi 5 Professional
 
#1

Hilfe bei "FilterRecord"

  Alt 23. Okt 2003, 01:34
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
Wer nichts neues lernen will ist schon so gut wie Tot.
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#2

Re: Hilfe bei "FilterRecord"

  Alt 23. Okt 2003, 01:36
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;
Tim Leuschner
  Mit Zitat antworten Zitat
Computersklave

Registriert seit: 23. Okt 2003
Ort: Sachsen
11 Beiträge
 
Delphi 5 Professional
 
#3

Re: Hilfe bei "FilterRecord"

  Alt 23. Okt 2003, 01:43
Danke, für die schnelle Hilfe!

Hab die Klammern () vergessen. Nun funzt es.

By
Wer nichts neues lernen will ist schon so gut wie Tot.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: Hilfe bei "FilterRecord"

  Alt 23. Okt 2003, 02:39
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
  Mit Zitat antworten Zitat
Computersklave

Registriert seit: 23. Okt 2003
Ort: Sachsen
11 Beiträge
 
Delphi 5 Professional
 
#5

Re: Hilfe bei "FilterRecord"

  Alt 23. Okt 2003, 03:59
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.
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
Wer nichts neues lernen will ist schon so gut wie Tot.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#6

Re: Hilfe bei "FilterRecord"

  Alt 23. Okt 2003, 07:52
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
  Mit Zitat antworten Zitat
Computersklave

Registriert seit: 23. Okt 2003
Ort: Sachsen
11 Beiträge
 
Delphi 5 Professional
 
#7

Re: Hilfe bei "FilterRecord"

  Alt 23. Okt 2003, 13:47
Hallo Hagen, bin wieder lebendig.

Ich habe das mal so versucht, aber noch kein Ergebnis bekommen.
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
der sklave
Wer nichts neues lernen will ist schon so gut wie Tot.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 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