![]() |
Datenbank: Ads local Server • Version: 7.1 • Zugriff über: TDataSet
Filterproblem mit TTable
Hallo,
ich möchte eine Filterung der Datenbank nach Jahreszahlen und zwar: Sortierkriterien: 3;4;5; oder 2-5 In dem Datenbankfeld werden die Daten durch Semikolon getrennt gespeichert (3;5;6....) Meine bisherige Lösung ist die Datenbankfelder pro Datensatz zu durchlaufen und bei einem Treffer eine 1 bzw. eine 0 in ein Extra-DBFeld zu schreiben und darauf dann den Filter zu verwenden. Weiß jemand da eine performantere Lösung (womöglich ohne zusätzliches DBFeld)? Viele Grüße... |
Re: Filterproblem mit TTable
würde man die frage verstehen könnte man die vielleicht helfen.
vielleicht hilft LIKE oder MATCHES? |
Re: Filterproblem mit TTable
Zitat:
das verstösst gegen die 1. Normalform Zitat:
![]() |
Re: Filterproblem mit TTable
Zitat:
Zitat:
//Edit: Ich habe Mist erzählt. In der Datenbank werden die Daten nicht durch einen Semikolon getrennt gespeichert, sondern so: 012345 ... Viele Grüße... |
Re: Filterproblem mit TTable
Zitat:
|
Re: Filterproblem mit TTable
Hi,
nach Jahreszahlen. Diese stehen in einem DB-Feld in dieser Form: 345 (für 2003,2004,2005) Als Filter soll folgende Eingabe möglich sein: 245 oder 2-5 Viele Grüße.... |
Re: Filterproblem mit TTable
Hallo Stefan,
wenn das Datenbankfeld immer einen Wert enthält, der durch das Weglassen beliebiger Ziffern aus der Zeichenfolge 0123456789 gebildet werden kann, dann würde ich einen pattern match mit dem Operator LIKE vorbereiten:
Delphi-Quellcode:
Die Funktion MatchStr('245') liefert dir dann das Pattern '%2%45%' welches du dann für deinen pattern match verwenden kannst. Der Ansatz lässt sich für Bereichsangaben ausbauen.
function MatchStr(const sFilter: String; cWild: Char = '%'): String;
var i: Integer; begin Result := StringOfChar(cWild, 10); for i := 1 to Length(sFilter) do Result[Succ(Ord(sFilter[i]) - Ord('0'))] := sFilter[i]; Result := CompactStr(Result, cWild); end; Grüße vom marabu |
Re: Filterproblem mit TTable
Hi Marabu,
danke für deinen Vorschlag. Mit meinem bisherigen Ansatz habe ich auch noch einige Probleme:
Delphi-Quellcode:
Die Daten kommen aus ner Ini-Datei. Aber in der for-Schleife ist irgendwo ein Fehler?!?
var
sf : TIniFile; i : integer; s : string; begin readstring; Form1.AdsTable1.First; sf := TIniFile.create(ExtractFilePath(ParamStr(0))+'daten\checkbox.ini'); While not Form1.AdsTable1.eof do begin s := Form1.AdsTable1.FieldByName('def3').AsString; for i := 0 to 9 do if (sf.ReadBool('Jahre',IntToStr(i),true)) and (Form1.AdsTable1.FieldByName('bool').AsString = '0') and (pos(IntToStr(i),s)>0) then begin Form1.AdsTable1.Edit; Form1.AdsTable1.FieldByName('bool').AsString := '1'; Form1.AdsTable1.Post; end else begin Form1.AdsTable1.Edit; Form1.AdsTable1.FieldByName('bool').AsString := '0'; Form1.AdsTable1.Post; end; Form1.AdsTable1.Next; end; Form1.AdsTable1.Filter := 'bool="1"'; Form1.AdsTable1.Filtered := true; sf.Free; end; Wie dem auch sei, ich werde mir deine Version mal versuchen auszubauen, da sie wohl etwas performanter ist :stupid: // Edit: Was ist denn CompactStr in deinem Code? Viele Grüße.... |
Re: Filterproblem mit TTable
Sorry, hier ein Nachschlag:
Delphi-Quellcode:
Grüße
function CompactStr(const s: String; c: Char = ' '): String;
var i, iDel: Integer; begin Result := s; iDel := 0; for i := 1 to Length(s) do if (i > 1) and (s[i] = c) and (s[Pred(i)] = c) then Inc(iDel) else Result[i - iDel] := s[i]; SetLength(Result, Length(s) - iDel); end; |
Re: Filterproblem mit TTable
Hi Marabu,
danke, das klappt ganz gut. Leider habe ich jetzt gesehen, dass Ads kein LIKE im Filter unterstützt :cry: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 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 by Thomas Breitkreuz