Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi TQuery/TTable filtern ohne Daten neu abzurufen (https://www.delphipraxis.net/180492-tquery-ttable-filtern-ohne-daten-neu-abzurufen.html)

Perlsau 24. Mai 2014 09:29

AW: TQuery/TTable filtern ohne Daten neu abzurufen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1260064)
Wenn es um ein paar GB geht ist ein Memory-Dataset bei mir allerdings auch keine Option mehr :lol:
Ich glaube, ich lasse die ganze Filter-Geschichte einfach sein...

Du entwickelst doch mit XE5, da kann man doch wunderbar 64-Bit-Anwendungen compilieren, und wenn du wie heute üblich mind. 8 oder besser gleich 16 oder 32 GB Arbeitsspeicher hast, passen da die allermeisten Tabellen doch locker rein :wink:

Dejan Vu 24. Mai 2014 10:33

AW: TQuery/TTable filtern ohne Daten neu abzurufen
 
Man liest keine GB an Daten in den Speicher. Wozu? Wer soll sich das anschauen?

Ich würde noch mit dem 'OnFilterRecord'-Event herumspielen, das finde ich flexibler und es wäre denkbar, das die Daten dann doch nicht mehrfach geladen werden. Ich kann mir das auch nicht vorstellen, ehrlich gesagt.

Zeig mal den Code, mit dem Du das testest.

Ich lass mich gerne überzeugen. :)

Edit: Ich habe das hier mal (allerdings mit ADO) nachgestellt. Die Daten werden *nicht* neu geladen, wenn ich das Filtern umstelle:
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender : TObject)
Begin
  myDataset.Filtered := not myDataSet.Filtered;
End;
Aber klar, ADO != FireDAC. (Und TDataSet.SetFiltered ist virtual).

Nils S. 24. Mai 2014 11:28

AW: TQuery/TTable filtern ohne Daten neu abzurufen
 
Also wenn ich .Filter := ... setze, werden immer die aktuellen Daten aus der Datenbank angezeigt.
Hier ist der Code:
Delphi-Quellcode:
procedure SetTblUserFilter;
begin
  with UserDat.tblUser do
  begin
    Close;
    Filter :=
      ('lower(LAST_NAME) like ''%' +
      AnsiLowerCase(UserSettingsFrm.edtSearchUser.Text) + '%''' +
      ' or lower(FIRST_NAME) like ''%' +
      AnsiLowerCase(UserSettingsFrm.edtSearchUser.Text) + '%''' +
      ' or lower(LOGIN_NAME) like ''%' +
      AnsiLowerCase(UserSettingsFrm.edtSearchUser.Text) + '%''');
    Open;
  end;
Filtered ist standardmäßig auf True gesetzt.
Das Close und Open verwende ich, da es sonst teilweise zu merkwürdigen Anzeigefehlern im Grid kommt,
wo wir schonmal dabei sind, ist das auch schonm Mal jemandem aufgefallen? Arbeite mit XE5, Firemonkey.
Ich habe es aber natürlich auch ohne Open und Close getestet und jedes mal, wenn der Filter geändert wird,
werden die aktuellen Daten aus der Datenbank angezeigt.

Dejan Vu 24. Mai 2014 13:50

AW: TQuery/TTable filtern ohne Daten neu abzurufen
 
Das liegt an dem 'Open' und nicht am Filter.
Ich würde das mit dem Verändern des Filters vielleicht mal so probieren

Delphi-Quellcode:
myDataSet.DisableControls;
Try
  myDataSet.Filtered := False;
  myDataSet.Filter := CreateMyNewFilter();
  myDataSet.Filtered := True;
Finally
  myDataSet.EnableControls;
end;
Vielleicht kann man das Problem damit Umschiffen. Das sieht mir nämlich nach einem Refresh-Problem im FMX-Framework aus.

Nils S. 24. Mai 2014 13:57

AW: TQuery/TTable filtern ohne Daten neu abzurufen
 
Wie gesagt, das Close und Open habe ich nach dem Test hinzugefügt, wegen des Anzeigefehlers.
Und Du meinst Filtered auf False/True setzen macht einen Unterschied?

Kann ich mir noch nicht so ganz vorstellen aber ich werde das später mal ausprobieren.

Dejan Vu 24. Mai 2014 14:03

AW: TQuery/TTable filtern ohne Daten neu abzurufen
 
Zitat:

Zitat von Nils S. (Beitrag 1260092)
Und Du meinst Filtered auf False/True setzen macht einen Unterschied?
Kann ich mir noch nicht so ganz vorstellen aber ich werde das später mal ausprobieren.

... Ich auch nicht, wenn ich darüber nachdenke. :oops:

Perlsau 24. Mai 2014 17:11

AW: TQuery/TTable filtern ohne Daten neu abzurufen
 
Zitat:

Zitat von Nils S. (Beitrag 1260092)
Und Du meinst Filtered auf False/True setzen macht einen Unterschied?

Das ist die normale Vorgehensweise beim Setzen eines neuen Filters. Genau dafür gibt es das Filtered-Property.

Dejan Vu 24. Mai 2014 17:16

AW: TQuery/TTable filtern ohne Daten neu abzurufen
 
Zitat:

Zitat von Perlsau (Beitrag 1260101)
Wenn du den Filter-String bei gesetztem Filtered-Property (filtered := true) änderst, passiert gar nichts.

Das dachte ich auch, bis ich es eben ausprobiert habe (Mit ADO). Aber da SetFilterText auch virtual ist, dürfte das individuell und unterschiedlich sein. Daher: Ausprobieren.

Perlsau 24. Mai 2014 17:29

AW: TQuery/TTable filtern ohne Daten neu abzurufen
 
Zitat:

Zitat von Dejan Vu (Beitrag 1260103)
Zitat:

Zitat von Perlsau (Beitrag 1260101)
Wenn du den Filter-String bei gesetztem Filtered-Property (filtered := true) änderst, passiert gar nichts.

Das dachte ich auch, bis ich es eben ausprobiert habe (Mit ADO). Aber da SetFilterText auch virtual ist, dürfte das individuell und unterschiedlich sein. Daher: Ausprobieren.

Hast du den Filter bei aktivem Dataset und gesetztem Filtered-Property lediglich im Objekt-Inspektor geändert? In dem Fall änders sich auch bei mir die Filtermenge oder, anders ausgedrückt, bei Enter in der OI-Zelle mit dem neuen Filterwert wird der Filter gesetzt und aktiviert. Mache ich dasselbe jedoch im Code, passiert absolut gar nichts:
Delphi-Quellcode:
  IF DatMod.V_Messung.Filter = '' THEN
     DatMod.V_Messung.Filter := 'M_WERT < 100' ELSE
     DatMod.V_Messung.Filter := '';

     StatBarMain.Panels[3].Text := DatMod.V_Messung.Filter;
Erst ein Ausschalten des Filters und darauf folgendes Einschalten aktiviert hier den Filter. (getestet mit IbDac und Firebird)

Dejan Vu 24. Mai 2014 17:39

AW: TQuery/TTable filtern ohne Daten neu abzurufen
 
Ich habe als Test eine Tabelle mit einer Spalte, die 5 unterschiedlicher Werte annehmen kann, genommen. Dann einen Button auf die Form und im Buttonclick:

Delphi-Quellcode:
Procedure TForm.ButtonClick(Sender : TObject);
Begin
  id := id mod 5 + 1;
  myDataSet.Filter := 'ColumnType = '+intToStr(id);
end;
Dann noch ein Grid, ein Dataset, mit der Datenbank verbunden und los. Nun klicke ich auf den Button und sehe im Grid nacheinander jeweils die Einträge mit 'ColumnType=1', 'ColumnType=2' usw.

Funktioniert also. Dann habe ich das so geändert, das ich noch id=6 nehme und dann den Filtertext leere, also so:
Delphi-Quellcode:
Procedure TForm.ButtonClick(Sender : TObject);
Begin
  id := id mod 6 + 1;
  if id=6 then
    myDataSet.Filter := ''
  else
    myDataSet.Filter := 'ColumnType = '+intToStr(id);
end;
Funzt auch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 Uhr.
Seite 2 von 3     12 3      

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