Datensätze ausfiltern

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Datensätze ausfiltern

Beitrag von Jan »

In einem DbEdit() sollen Datensätze angezeigt werden, die bestimmten Kriterien entsprechen. Das Kriterium ist eine dreistellige Nummer, die in zwei Feldern vorkommen kann. Alle Sätze müssen berücksichtigt werden, in denen das Kriterium in einem der beiden Felder vorkommt.

Bislang wurde das historisch bedingt über einen Filter geregelt. Was bei mehreren 10.000 Datensätzen nicht gerade als performant zu bezeichnen ist. Ich habe in dem gesamten Projekt auch schon die meisten Filter eliminiert und meist durch Scopes ersetzt. In diesem Fall scheint mir das aber nicht zu gehen, da Scopes zwar über mehrere Felder gehen können, davon aber nur eines variabel sein darf. Hier sind aber beide Felder variabel.

Hat jemand eine Idee dazu?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Datensätze ausfiltern

Beitrag von Tom »

Hallo, Jan.

Eine Beschleunigung wenigstens in der Darstellung erreichst Du bereits dadurch, dass Du SET SMARTFILTER ON einfügst. Damit merkt sich jedes Browse nach und nach alle anzuzeigenden Datensätze und evaluiert den Filter je Datensatz nur einmal. Nicht vergessen, das wieder abzuschalten, sonst aktualisieren sich Browses auf dynamischen Daten nicht mehr.

Du kannst mir OrdWildSeek() experimentieren, was Du aber zweimal machen müsstest, da ja zwei Felder betroffen sind, die dann auch beide indexiert sein müssten. Edit: Quatsch. Einmal reicht ja. Der Treffer soll schließlich in beiden Feldern vorkommen müssen.

Ansonsten, um Martin zuvorzukommen: Am schnellsten ist das wahrscheinlich, wenn Du einfach alle (Ziel-)Datensätze in ein Array holst. :wink: Also einfach ein DO WHILE !Eof() und dann für jeden Datensatz die Bedingung prüfen. Treffer kommen ins Array, die anderen nicht.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Datensätze ausfiltern

Beitrag von Jan »

Hallo Tom,

ja, das mit dem Array wäre mein Plan B. Ich würde dann auf beide Felder je einen Index setzen, beide Indizee schnell abarbeiten und Treffer ins Array, Array sortieren, und ein AChoice() draus bauen. Geht garantiert rattenschnell. Aber: Ich muß dafür die gesamte Funktion neu schreiben, weil die vorhandene nicht mehr viel dafür hergibt. Das wollte ich nach Möglichkeit vermeiden.

OrdWildSeek() wäre super, wenn das auf einem Scope laufen würde. Denn ich möchte ja nicht nur einen Satz haben, sondern mehrere, verstreut über die gesamte Datenbank. Das dann inkrementell zu machen scheint mir eher ungünstig.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Datensätze ausfiltern

Beitrag von Tom »

Hallo, Jan.

Da der Ausdruck in beiden Feldern vorkommen muss, genügt ein Index für OrdWildSeek().

Du kannst auch ein Tabellenbrowse verwenden, wenn Du die Navigationscodeblöcke entsprechend umbaust. Das ist allerdings nicht trivial, denn es geht zwar mit OrdWildSeek() vorwärts, aber nicht rückwärts. Vielleicht lässt sich eine Mischform bewerkstelligen: Du sammelst in einem Array alle Treffer(datensatznummern) und bewegst Dich in den Navicodeblöcken in diesem Array, wobei nach dieser Bewegung der Datensatzzeiger aktualisiert wird.
Herzlich,
Tom
Antworten