Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Filterproblem mit TTable (https://www.delphipraxis.net/82055-filterproblem-mit-ttable.html)

Grolle 7. Dez 2006 12:29

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...

bttb930 7. Dez 2006 12:50

Re: Filterproblem mit TTable
 
würde man die frage verstehen könnte man die vielleicht helfen.

vielleicht hilft LIKE oder MATCHES?

shmia 7. Dez 2006 12:51

Re: Filterproblem mit TTable
 
Zitat:

Zitat von Grolle
In dem Datenbankfeld werden die Daten durch Simikolon getrennt gespeichert (3;5;6....)

Fehlerhaftes Datenbankdesign.
das verstösst gegen die 1. Normalform
Zitat:

Die erste Normalform (1NF) verlangt, dass die Information in jedem Feld einer Datenbank atomar ist, das heißt eine nicht weiter zerlegbare Einzelinformation. Eine Spalte wie PLZ_ORT oder STRASSE_HAUSNR würde beispielsweise dagegen verstoßen.
Lies mal: http://support.microsoft.com/kb/209534/de

Grolle 7. Dez 2006 13:00

Re: Filterproblem mit TTable
 
Zitat:

Zitat von shmia
Fehlerhaftes Datenbankdesign. das verstösst gegen die 1. Normalform

Ich weiss. Es ist ein Kundenwunsch!

Zitat:

Zitat von bttb930
würde man die frage verstehen könnte man die vielleicht helfen.
vielleicht hilft LIKE oder MATCHES?

Was genau versteht du nicht?

//Edit: Ich habe Mist erzählt. In der Datenbank werden die Daten nicht durch
einen Semikolon getrennt gespeichert, sondern so: 012345 ...

Viele Grüße...

mkinzler 7. Dez 2006 22:49

Re: Filterproblem mit TTable
 
Zitat:

Was genau versteht du nicht?
Nach was du filtern willst.

Grolle 7. Dez 2006 22:58

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....

marabu 8. Dez 2006 09:08

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:
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;
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.

Grüße vom marabu

Grolle 8. Dez 2006 11:41

Re: Filterproblem mit TTable
 
Hi Marabu,
danke für deinen Vorschlag. Mit meinem bisherigen Ansatz habe ich auch noch einige Probleme:
Delphi-Quellcode:
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;
Die Daten kommen aus ner Ini-Datei. Aber in der for-Schleife ist irgendwo ein Fehler?!?
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....

marabu 8. Dez 2006 12:56

Re: Filterproblem mit TTable
 
Sorry, hier ein Nachschlag:

Delphi-Quellcode:
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;
Grüße

Grolle 8. Dez 2006 14:39

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 02:08 Uhr.
Seite 1 von 4  1 23     Letzte »    

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