Filtern von Daten
Moderator: Moderatoren
- Manfred
- Foren-Administrator
- Beiträge: 21248
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 211 Mal
- Danksagung erhalten: 71 Mal
Filtern von Daten
Moin,
ich habe eine DBF, die mehrere Indexfelder hat. Zusätzlich zu den Indexfeldern gibt es noch eine Spalte, in der eine Nummer steht, nach der später auch gefiltert werden muß. Innerhalb jedes Index muß aber gesucht werden können. Kann man da etwas mit Scope machen? Set Filter dürfte wohl bei einigen 1000 Sätzen im Netzwerk etwas langsam werden. Aber wie Scoped man, wenn das Scopefeld erst an 2. Stelle steht? Theoretisch würde ich ja Index + Nummer setzen für den Schlüssel, aber wie geht man dann damit um?
Hat jemand eine Idee, die mir im Moment nicht kommt?
ich habe eine DBF, die mehrere Indexfelder hat. Zusätzlich zu den Indexfeldern gibt es noch eine Spalte, in der eine Nummer steht, nach der später auch gefiltert werden muß. Innerhalb jedes Index muß aber gesucht werden können. Kann man da etwas mit Scope machen? Set Filter dürfte wohl bei einigen 1000 Sätzen im Netzwerk etwas langsam werden. Aber wie Scoped man, wenn das Scopefeld erst an 2. Stelle steht? Theoretisch würde ich ja Index + Nummer setzen für den Schlüssel, aber wie geht man dann damit um?
Hat jemand eine Idee, die mir im Moment nicht kommt?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1931
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Filtern von Daten
Hi Manfred,
d.h. du müßtest filtern, da immer die gleiche Nummer gebraucht wird. ? Ist das richtig ? -folgender vorschlag mache einen index drauf suche und mache ein do while. bis nicht mehr identisch und eof() - wenn du die Datenbank gleichzeitig mit einem anderen do while durchläufst mußt du dir diesen Satzzeiger natürlich in eine Variable sichern.
d.h. du müßtest filtern, da immer die gleiche Nummer gebraucht wird. ? Ist das richtig ? -folgender vorschlag mache einen index drauf suche und mache ein do while. bis nicht mehr identisch und eof() - wenn du die Datenbank gleichzeitig mit einem anderen do while durchläufst mußt du dir diesen Satzzeiger natürlich in eine Variable sichern.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Filtern von Daten
grundsätzlich könnte man den Scope ja auch über mehrere Felder ziehen so wie auch den Index.Manfred hat geschrieben:ich habe eine DBF, die mehrere Indexfelder hat. Zusätzlich zu den Indexfeldern gibt es noch eine Spalte, in der eine Nummer steht, nach der später auch gefiltert werden muß.
hm ... wenn ich dich jetzt richtig verstehe ist die zusätzliche Spalte mit Nummern "nicht" im Index enthalten ... warum ... ?Manfred hat geschrieben:Innerhalb jedes Index muß aber gesucht werden können. Kann man da etwas mit Scope machen? Set Filter dürfte wohl bei einigen 1000 Sätzen im Netzwerk etwas langsam werden. Aber wie Scoped man, wenn das Scopefeld erst an 2. Stelle steht? Theoretisch würde ich ja Index + Nummer setzen für den Schlüssel, aber wie geht man dann damit um?
wenn das nun bei dir alle nicht geht würde ich die "Einschränkung" mittels Codeblock realisieren.
(siehe auch http://www.xbaseforum.de/viewtopic.php?f=31&t=5727 )
die Frage dabei ist "wie" Du es einsetzten willst : Browser "live" -> Skipblock oder beim "sammeln" innerhalb der Scope Schleife ?
gruss by OHR
Jimmy
Jimmy
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Filtern von Daten
Immer ein bisschen schade, auf einem Hauptschlüssel keinen Index zu haben.
Ansonsten: Scopes und Filter kann man nach Belieben kombinieren. Filter sind deutlich schneller, wenn die Datenbank bereits einen Scope besitzt. Aber die Indexe müssen natürlich geeignet sein.
![Wink :wink:](./images/smilies/wink.gif)
Ansonsten: Scopes und Filter kann man nach Belieben kombinieren. Filter sind deutlich schneller, wenn die Datenbank bereits einen Scope besitzt. Aber die Indexe müssen natürlich geeignet sein.
Herzlich,
Tom
Tom
- Manfred
- Foren-Administrator
- Beiträge: 21248
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 211 Mal
- Danksagung erhalten: 71 Mal
Re: Filtern von Daten
Nene,
ich versuche es nochmal richtig. Ich meinte oben mit Index + nummer -> Schlüssel plus Feld, das gefiltert werden soll. Es ist ein Browse, in dem die Möglichkeit besteht zu suchen über den Index. Leider kennt diese Such-Funktion aber nicht wirklich was da gefordert wird, sondern kann nur einfach pauschal im Index suchen. Der Index wird auch erst im Browser umgeschaltet. Auch da also keine großen Möglichkeiten noch etwas zu tun. Also wäre es sicherlich interessant, wenn man vorher schon den Scope auf die Nummer setzen kann.
ich versuche es nochmal richtig. Ich meinte oben mit Index + nummer -> Schlüssel plus Feld, das gefiltert werden soll. Es ist ein Browse, in dem die Möglichkeit besteht zu suchen über den Index. Leider kennt diese Such-Funktion aber nicht wirklich was da gefordert wird, sondern kann nur einfach pauschal im Index suchen. Der Index wird auch erst im Browser umgeschaltet. Auch da also keine großen Möglichkeiten noch etwas zu tun. Also wäre es sicherlich interessant, wenn man vorher schon den Scope auf die Nummer setzen kann.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2828
- Registriert: Fr, 10. Feb 2006 9:51
- Wohnort: Aachen
- Hat sich bedankt: 259 Mal
- Danksagung erhalten: 12 Mal
- Kontaktdaten:
Re: Filtern von Daten
Hallo Manfred,
ich bin mir nicht ganz sicher, was Du meinst.
Geht es um folgendes?
Du hast beispielsweise folgenden kontrollierenden Index:
Du möchtest einen Scope auf einen Nummernbereich setzen, z.B. 1000<=Nummer<10000:
Ich meine, dies funktioniert auch, wenn der kontrollierende Index nach Setzen des Scope wechselt.
Uli
ich bin mir nicht ganz sicher, was Du meinst.
Geht es um folgendes?
Du hast beispielsweise folgenden kontrollierenden Index:
Code: Alles auswählen
str(Nummer,10)+Name
Code: Alles auswählen
DbSetScope( SCOPE_BOTTOM/*<nScope>*/,str( 1000 ,10 ) /*<xValue>*/ )
DbSetScope( SCOPE_TOP /*<nScope>*/,str( 10000-1,10 )+chr(255)/*<xValue>*/ )
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück
- Manfred
- Foren-Administrator
- Beiträge: 21248
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 211 Mal
- Danksagung erhalten: 71 Mal
Re: Filtern von Daten
Hm,
ich weiß jetzt nicht, ob ich euch verstehe, aber ich male es mal auf
Nummer1 beinhaltet einen Wert, auf dem gesucht werden soll. Nummer2 beinhaltet den Wert, der "gefiltert" werden soll.
bin ich ganz ehrlich wüßte ich jetzt auf dem Papier nicht, was das richtige wäre.
ich weiß jetzt nicht, ob ich euch verstehe, aber ich male es mal auf
Nummer1 beinhaltet einen Wert, auf dem gesucht werden soll. Nummer2 beinhaltet den Wert, der "gefiltert" werden soll.
Code: Alles auswählen
Wenn ich jetzt Str(nummer1,nLaenge,0) + Str(nummer2,nLaenge,0) als Schlüssel eingebe, oder:
Str(nummer2,nLaenge,0) + Str(nummer1,nLaenge,0) also Schlüssel eingebe,
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2833
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 99 Mal
- Danksagung erhalten: 13 Mal
Re: Filtern von Daten
Hallo, Manfred -
in der Dokumentation zu SET SCOPE finde ich (ach ja, ich verwende die englische Dokumentation):
Alternativ (wenn es nur um einen Wert von Feld2 geht) könntest Du einen zusätzlichen Index dieser Art verwenden:
INDEX ON Str(Feld2, 10) + Str(Feld1, 10) + Str(Feld2, 10)
Damit wäre die Bedingung erfüllt, dass der Scope-Wert "vorne" im Index-Begriff steht. Brauchst Du mehrere Werte von Feld2, geht das natürlich nicht.
Zweite Alternative: einen temporären Index mit einem WHERE Bedingung.
Oder SQL.
Gruss,
Georg
in der Dokumentation zu SET SCOPE finde ich (ach ja, ich verwende die englische Dokumentation):
Wenn Du also INDEX ON Str(Feld1, 10) + Str(Feld2, 10) TO ... hast, und dieser Index aktiv ist, kannst Du den Scope nur auf Feld1 beziehen, Du willst aber auf Feld2 eingrenzen. Das geht nicht, da die Dokumentation besagt, dass der Scope auf die jeweils gesetzte ORDER bezogen ist, d.h. wenn Du zwei Index Tags verwendest, und bei der ersten einen SET SCOPE durchführst, greift dieser. Wechselst Du zum anderen Index Tag, kannst Du jetzt die Tabelle ohne Einschränkung lesen, da bei dieser ORDER kein Scope gesetzt ist.Scope: current work area, current order
...
A scope can be set for each order, be it a physical or logical order. A table may have its own scope using a record number as the scope value. The scope remains active until it is cleared using SET SCOPE TO (with no value) or the relating index or table is closed.
Alternativ (wenn es nur um einen Wert von Feld2 geht) könntest Du einen zusätzlichen Index dieser Art verwenden:
INDEX ON Str(Feld2, 10) + Str(Feld1, 10) + Str(Feld2, 10)
Damit wäre die Bedingung erfüllt, dass der Scope-Wert "vorne" im Index-Begriff steht. Brauchst Du mehrere Werte von Feld2, geht das natürlich nicht.
Zweite Alternative: einen temporären Index mit einem WHERE Bedingung.
Oder SQL.
Gruss,
Georg
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Manfred
- Foren-Administrator
- Beiträge: 21248
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 211 Mal
- Danksagung erhalten: 71 Mal
Re: Filtern von Daten
Hi Georg,
das ist ja mein Problem. Deshalb hatte ich ja gefragt, ob es da evtl. eine andere Lösung gibt. Ich hatte auch schon mit Set Filter spekuliert, da bin ich aber noch nicht so weit, dass ich getestet habe, wie es dann mit dem Tempo aussehen wird. Nur bevor ich jetzt irgendeinen Weg einschlage wollte ich halt mal die Ideenküche vom Forum anzapfen. Es gibt ja immer wieder die tollsten Gedankengänge hier.
das ist ja mein Problem. Deshalb hatte ich ja gefragt, ob es da evtl. eine andere Lösung gibt. Ich hatte auch schon mit Set Filter spekuliert, da bin ich aber noch nicht so weit, dass ich getestet habe, wie es dann mit dem Tempo aussehen wird. Nur bevor ich jetzt irgendeinen Weg einschlage wollte ich halt mal die Ideenküche vom Forum anzapfen. Es gibt ja immer wieder die tollsten Gedankengänge hier.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2828
- Registriert: Fr, 10. Feb 2006 9:51
- Wohnort: Aachen
- Hat sich bedankt: 259 Mal
- Danksagung erhalten: 12 Mal
- Kontaktdaten:
Re: Filtern von Daten
Doch, man kann mit einem Bereich den Scope verwenden (s.o.) . Man muß nur darauf achten, dass alle benötigten Werte innerhalb des Scopes lieben.georg hat geschrieben:Brauchst Du mehrere Werte von Feld2, geht das natürlich nicht.
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Filtern von Daten
Dieser Thread ist das beste Beispiel, warum wir endlich von den NTX und CDX Beschränkungen weg und hin zur SQL Auswertung kommen müssen.
Arctica wir warten ...
Auf meinem Samsung Galaxy S plus habe ich eine SQLite Datenbank, egal ob dort 1000 oder 10000 Datensätze sind, bringt mir die Anfrage
"Select * where ... order by ..." ohne merkliche Laufzeit das Ergebnis, das du bräuchtest
ich denke bei den meinsten DBF Dateien kämen wir ohne Index aus ...
Arctica wir warten ...
Auf meinem Samsung Galaxy S plus habe ich eine SQLite Datenbank, egal ob dort 1000 oder 10000 Datensätze sind, bringt mir die Anfrage
"Select * where ... order by ..." ohne merkliche Laufzeit das Ergebnis, das du bräuchtest
![Wink ;-)](./images/smilies/wink.gif)
ich denke bei den meinsten DBF Dateien kämen wir ohne Index aus ...
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2828
- Registriert: Fr, 10. Feb 2006 9:51
- Wohnort: Aachen
- Hat sich bedankt: 259 Mal
- Danksagung erhalten: 12 Mal
- Kontaktdaten:
Re: Filtern von Daten
Manfred hat geschrieben:Hi Georg,
das ist ja mein Problem
![Question :?:](./images/smilies/question.gif)
![Exclamation :!:](./images/smilies/exclaim.gif)
Ohne geeigneten Index kein Scope!
Ohne kontrollierenden Index funktioniert der Scope übrigens über die Record-Nummern.
----
Hubert: da brauchst Du aber nicht auf Arctica zu warten!
----
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück
- Manfred
- Foren-Administrator
- Beiträge: 21248
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 211 Mal
- Danksagung erhalten: 71 Mal
Re: Filtern von Daten
Ah,
Moment..
Ich muß das Suchfeld (nummer1)am Anfang haben, damit ich drin suchen kann. Dann müßte also das "Filterfeld" (nummer2) dahinter kommen.
Also Index on Str(nummer1,5,0) + Str(nummer2,2,0) to index
Dann kann ich über nummer1 suchen. Kann man denn vorher über nummer2, was ja auch im Index ist einen Scope setzen?
Moment..
Ich muß das Suchfeld (nummer1)am Anfang haben, damit ich drin suchen kann. Dann müßte also das "Filterfeld" (nummer2) dahinter kommen.
Also Index on Str(nummer1,5,0) + Str(nummer2,2,0) to index
Dann kann ich über nummer1 suchen. Kann man denn vorher über nummer2, was ja auch im Index ist einen Scope setzen?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Filtern von Daten
Hallo, Manfred.
Ein konkatinierter (zusammengesetzter) Indexausdruck ist nichts weiter als eine Zeichenkette, die als Suchbegriff genutzt werden kann - beim Suchen ist dann unerheblich, wie sich der Index aufgebaut hat. Bei Scopes auf Zeichenketten mit einem Teilsuchbegriff werden alle Datensätze gefunden, die mit diesem beginnen. Wenn ich einen Index Str(kundennr,10,0)+Upper(name) habe, kann ich einen Scope "BOTH" nur auf die Kundennummer setzen und finde alle Einträge: DbSetScope(SCOPE_BOTH,Str(nSuchNummer,10,0)). Das gilt auch für die Ergänzung des Suchbegriffs: Index auf Str(kundennr,10,0)+Str(artikelnr,10,0) zum Beispiel in einer Datei mit Rechnungspositionen schränkt die Suchergebnisse immer weiter ein, je länger der Suchbegriff wird - Achtung übrigens bei umgewandelten numerischen Werten, bei denen es sich empfiehlt, mit Nullen zu füllen, auch im Suchbegriff! Scopes sind leichter zu verstehen, wenn man sie sich als DO-WHILES vorstellte: So lange der Indexausdruck (Länge entsprechend Suchbegriff) mit dem Suchbegriff übereinstimmt, gilt ein Datensatz als zugehörig (DO WHILE Left(IndexInhalt,Len(SuchBegriff)) == cSuchBegriff). Anders ist das bei Datumsausdrücken und bei numerischen Werten - die müssen exakt übereinstimmen, damit überhaupt etwas gefunden wird. Ein Scope auf "kundennr" (numerisch) findet mit der Suche nach "1" nichts, wenn es keinen Kunden mit genau der Nummer "1" gibt, sehr wohl aber welche, deren Nummern hiermit beginnen. Ein Scope auf Datumsfelder verhält sich entsprechend.
Schwierig bis unmöglich wird das verständlicherweise, wenn man von beiden Teilbegriffen immer nur einen Teil kennt. Will ich also alle Kunden scopen, deren Nummern mit "1" beginnen und zugleich auf die Artikel einschränken, für die das ebenfalls gilt, müsste ich im vorliegenden Beispiel auf "1" scopen und dann zusätzlich nach Artikelnummer filtern. Mir fehlten ja jetzt 9 Stellen der Kundennummer. Also DbSetScope(SCOPE_BOTH,"1") und ein anschließendes SET FILTER TO Left(artikelnr,1) = "1" (bzw. DbSetFilter).
Ein konkatinierter (zusammengesetzter) Indexausdruck ist nichts weiter als eine Zeichenkette, die als Suchbegriff genutzt werden kann - beim Suchen ist dann unerheblich, wie sich der Index aufgebaut hat. Bei Scopes auf Zeichenketten mit einem Teilsuchbegriff werden alle Datensätze gefunden, die mit diesem beginnen. Wenn ich einen Index Str(kundennr,10,0)+Upper(name) habe, kann ich einen Scope "BOTH" nur auf die Kundennummer setzen und finde alle Einträge: DbSetScope(SCOPE_BOTH,Str(nSuchNummer,10,0)). Das gilt auch für die Ergänzung des Suchbegriffs: Index auf Str(kundennr,10,0)+Str(artikelnr,10,0) zum Beispiel in einer Datei mit Rechnungspositionen schränkt die Suchergebnisse immer weiter ein, je länger der Suchbegriff wird - Achtung übrigens bei umgewandelten numerischen Werten, bei denen es sich empfiehlt, mit Nullen zu füllen, auch im Suchbegriff! Scopes sind leichter zu verstehen, wenn man sie sich als DO-WHILES vorstellte: So lange der Indexausdruck (Länge entsprechend Suchbegriff) mit dem Suchbegriff übereinstimmt, gilt ein Datensatz als zugehörig (DO WHILE Left(IndexInhalt,Len(SuchBegriff)) == cSuchBegriff). Anders ist das bei Datumsausdrücken und bei numerischen Werten - die müssen exakt übereinstimmen, damit überhaupt etwas gefunden wird. Ein Scope auf "kundennr" (numerisch) findet mit der Suche nach "1" nichts, wenn es keinen Kunden mit genau der Nummer "1" gibt, sehr wohl aber welche, deren Nummern hiermit beginnen. Ein Scope auf Datumsfelder verhält sich entsprechend.
Schwierig bis unmöglich wird das verständlicherweise, wenn man von beiden Teilbegriffen immer nur einen Teil kennt. Will ich also alle Kunden scopen, deren Nummern mit "1" beginnen und zugleich auf die Artikel einschränken, für die das ebenfalls gilt, müsste ich im vorliegenden Beispiel auf "1" scopen und dann zusätzlich nach Artikelnummer filtern. Mir fehlten ja jetzt 9 Stellen der Kundennummer. Also DbSetScope(SCOPE_BOTH,"1") und ein anschließendes SET FILTER TO Left(artikelnr,1) = "1" (bzw. DbSetFilter).
Herzlich,
Tom
Tom
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Filtern von Daten
Bei einer Tabelle, die sich auf einem Flashspeicher befindet oder/und sogar für die Suche komplett in den Hauptspeicher geladen wird. Und einem Betriebssystem, das Multitasking nur vortäuscht.ohne merkliche Laufzeit
![Wink :wink:](./images/smilies/wink.gif)
Herzlich,
Tom
Tom
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2828
- Registriert: Fr, 10. Feb 2006 9:51
- Wohnort: Aachen
- Hat sich bedankt: 259 Mal
- Danksagung erhalten: 12 Mal
- Kontaktdaten:
Re: Filtern von Daten
Manfred, Du kannst ja meines Erachtens mit 2 Indizes arbeiten: einen benutzt du für die schnelle Suche nach nummer1, den anderen für den Scope über nummer2.Manfred hat geschrieben:Also Index on Str(nummer1,5,0) + Str(nummer2,2,0) to index
Dann kann ich über nummer1 suchen. Kann man denn vorher über nummer2, was ja auch im Index ist einen Scope setzen?
Spricht etwas dagegen, einen 2. Index anzulegen?
Uli
Tom: Top-Antwort!
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Filtern von Daten
ich habe auch SQLExpress, aber über den ODBC Treiber möchte ich damit nicht in DBFs arbeitenUliTs hat geschrieben:Hubert: da brauchst Du aber nicht auf Arctica zu warten!
und richtige "SQL-Server" sind für meine Datenmengen nicht nötig.
Mit MySQL habe ich schon experimentiert, mehr nicht.
Arctica würde SQL Befehle direkt auf vorhandene DBFs ermöglichen, die bisher umständlich ausgewertet wurden.
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21248
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 211 Mal
- Danksagung erhalten: 71 Mal
Re: Filtern von Daten
Hi Uli,
ich denke über den Index entscheide ich, da wäre sicherlich was zu machen.
Aber wie schon erwähnt, der browse und die Suchfunktion sind pauschal und schon vorhanden, da würde ich dann ungerne etwas ändern müssen. Wobei mir aber jetzt schon wieder eine Erweiterung dazu im Kopf herumschwirrt.
ich denke über den Index entscheide ich, da wäre sicherlich was zu machen.
Aber wie schon erwähnt, der browse und die Suchfunktion sind pauschal und schon vorhanden, da würde ich dann ungerne etwas ändern müssen. Wobei mir aber jetzt schon wieder eine Erweiterung dazu im Kopf herumschwirrt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2833
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 99 Mal
- Danksagung erhalten: 13 Mal
Re: Filtern von Daten
Hallo, Manfred -
langsam verdiene ich mir einen Orden dafür, dass ich beim Thema bleibe ...
Versuche es doch testweise mal mit einem Filter und schau Dir die Performance an. Auf einem Atom-Dual-Core PC (2 * 1,6 GHz) mit 8 GB RAM, Windows 7, schneller WD-Festplatte greift ein SET FILTER auf eine DBF mit ca. 50.000 Sätzen rasant schnell (nicht von aussen messbar), selbst dann, wenn nur wenige (oder gar kein Satz, kommt in der Konstellation schon mal vor) Treffer anzuzeigen sind.
Versuch macht klug.
Gruss,
Georg
P.S.: SQL-Befehle auf eine DBF-Datei sind nicht schneller als ein SET FILTER, wenn die DBE nicht angepasst wird. Nur die Syntax alleine macht es nicht ... (Auweia, jetzt habe ich doch das Thema gewechselt)
langsam verdiene ich mir einen Orden dafür, dass ich beim Thema bleibe ...
Versuche es doch testweise mal mit einem Filter und schau Dir die Performance an. Auf einem Atom-Dual-Core PC (2 * 1,6 GHz) mit 8 GB RAM, Windows 7, schneller WD-Festplatte greift ein SET FILTER auf eine DBF mit ca. 50.000 Sätzen rasant schnell (nicht von aussen messbar), selbst dann, wenn nur wenige (oder gar kein Satz, kommt in der Konstellation schon mal vor) Treffer anzuzeigen sind.
Versuch macht klug.
Gruss,
Georg
P.S.: SQL-Befehle auf eine DBF-Datei sind nicht schneller als ein SET FILTER, wenn die DBE nicht angepasst wird. Nur die Syntax alleine macht es nicht ... (Auweia, jetzt habe ich doch das Thema gewechselt)
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Filtern von Daten
Kann mich Georg nur anschließend. Viele von uns haben möglicherweise noch den "Filter im Kopf", aus Clipper-Zeiten, aber die Hardware hat sich verändert, und die verbliebenen Lücken schließen Techniken wie Caching. Filter werden bei jeder Datensatznavigation ausgewertet, was umgekehrt bedeutet, dass ihre Evaluierung vorläufig abgeschlossen ist, wenn der erste Datensatz gefunden wurde, und das kann sehr schnell gehen. Und übrigens gibt es da noch SET SMARTFILTER ON und SET RUSHMORE ON. Diese Techniken sollte man sich ruhig mal anschauen.
Herzlich,
Tom
Tom
- Manfred
- Foren-Administrator
- Beiträge: 21248
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 211 Mal
- Danksagung erhalten: 71 Mal
Re: Filtern von Daten
Jaja,
ihr habt ja Recht. Set Filter benutze ich bisher nur im Zusammenhang mit Scope und da ist das echt toll. Ich hatte ja schon erwähnt, dass ich es probieren wollte. Vielleicht erledigt sich ja dann alles.
ihr habt ja Recht. Set Filter benutze ich bisher nur im Zusammenhang mit Scope und da ist das echt toll. Ich hatte ja schon erwähnt, dass ich es probieren wollte. Vielleicht erledigt sich ja dann alles.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Filtern von Daten
Eine Warnung vor allzu viel Euphorie ist allerdings angebracht. Etwa eine Volltext-Instring-Suche per Filter auf einer großen Tabelle, vielleicht sogar noch auf dem Inhalt eines Memofelds, kann durchaus recht langsam werden ("SET FILTER TO 'Manfred' $ memotext). Vor allem, wenn die Ergebnisse in einem Browser angezeigt werden, dessen Navi-Codeblöcke die anzuzeigenden Daten mindestens zweimal "durchwandern", wodurch der Filterausdruck recht häufig evaluiert wird.
Herzlich,
Tom
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Filtern von Daten
theoretisch jaManfred hat geschrieben:Ich muß das Suchfeld (nummer1)am Anfang haben, damit ich drin suchen kann. Dann müßte also das "Filterfeld" (nummer2) dahinter kommen.
Also Index on Str(nummer1,5,0) + Str(nummer2,2,0) to index
Dann kann ich über nummer1 suchen. Kann man denn vorher über nummer2, was ja auch im Index ist einen Scope setzen?
Code: Alles auswählen
SET SCOPETOP TO "0000000000"+Nummer2_Top
SET SCOPEBOTTOM TO "9999999999"+Nummer2_Bottom
ein "Filter" ist ja eine Art "Abfrage" und da würde ich immer erst mal alle Daten "sammeln" um sie dann in einem Array Browse ( oder ListView ) anzuzeigen.
hierfür eignet sich ausgezeichnet OrdWildSeek() zusammen mit Scope
Code: Alles auswählen
Seek(cString)
IF FOUND()
SET SCOPE TO cString
OrdWildSeek(*cString*cOther*) // mit 2nd. Bedingung
DO WHILE FOUND()
IF EVAL( bBlock) // hier evtl, 3th Bedingung
AADD(aTreffer,DatenSatz)
ENDIF
OrdWildSeek()
ENDDO
SETSCOPE TO
Do_Array_Browse(aTreffer)
ENDDO
gruss by OHR
Jimmy
Jimmy
- Manfred
- Foren-Administrator
- Beiträge: 21248
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 211 Mal
- Danksagung erhalten: 71 Mal
Re: Filtern von Daten
Hi,
OrdWildSeek hat einen Nachteil: solange bis der erste Begriff gefunden wurde, geht gar nichts mehr. Man sieht nichts und man kann auch nicht abbrechen.
Es gibt auch nur 1 Artikel zu einem Kunden. Es gibt aber mehrere Kunden zu dem Artikel.
OrdWildSeek hat einen Nachteil: solange bis der erste Begriff gefunden wurde, geht gar nichts mehr. Man sieht nichts und man kann auch nicht abbrechen.
Es gibt auch nur 1 Artikel zu einem Kunden. Es gibt aber mehrere Kunden zu dem Artikel.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Filtern von Daten
kannst du das bei einem SEEK() ? die Geschwindigkeit ist die selbe !Manfred hat geschrieben:OrdWildSeek hat einen Nachteil: solange bis der erste Begriff gefunden wurde, geht gar nichts mehr. Man sieht nichts und man kann auch nicht abbrechen.
dann muss du den Index "umstellen" mit den Artikel zuerstManfred hat geschrieben:Es gibt auch nur 1 Artikel zu einem Kunden. Es gibt aber mehrere Kunden zu dem Artikel.
![Wink ;)](./images/smilies/wink.gif)
Frage : wie viele Indexe hast du so im Schnitt ... man kann doch bis zu 255 TAG(s) haben
gruss by OHR
Jimmy
Jimmy