Index On mit FOR [Erledigt]

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:

Index On mit FOR [Erledigt]

Beitrag von Jan »

Ich habe noch nie die FOR-Klausel in der Index-Erstellung benutzt. Und bevor da irgendwas schief läuft frage ich mal vorher in die Runde:

Ich würde gerne einen Index erstellen, in dem schon von vorneherein Datensätze garnicht auftauchen. Wenn ich nun in FOR angebe: Nimm bitte nicht die Datensätze mit in den Index auf, in denen in einem Datenbankfeld ein bestimmter Wert steht. Dann sollte das wohl funktionieren, denke ich. Was passiert aber, wenn sich die Bedingungen in einem Datensatz ändern? Wird der betreffende Satz dann z. B. automatisch aus dem Index rausgeworfen bzw. aufgenommen?

Ich frage extra, weil ich ja beim UNIQUE schon in die ganz böse Falle gelaufen war...

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: Index On mit FOR

Beitrag von Tom »

Hallo, Jan.

Gebräuchlichstes Beispiel hierfür ist: INDEX ON ... FOR !Deleted(). Gelöschte Datensätze tauchen dann im Index nicht auf, was den Vorteil hat, dass die DBE diese - bei SET DELETED ON - nicht überspringen muss, um den gesuchten Eintrag zu finden. Man kann sie allerdings dann über diesen Index überhaupt nicht mehr finden. Aber: DbGoto(n) springt immer zu Datensatz "n", selbst wenn dieser gelöscht ist oder in einem aktuellen Filter, Scope usw. ungültig wäre. Ist allerdings DELETED auf ON, sieht man ihn trotzdem nicht (sondern den Phantomdatensatz). Konditionale Indexe werden von der DBE automatisch gepflegt. Löse ich also ein RECALL aus, sind die gelöschten Datensätze wieder im konditionalen Index. "Entlösche" ich sie aber von außen, ohne dass ich den Index aktiv habe, sind sie (noch) nicht wieder vorhanden, sondern erst nach einem Reindex. Man muss bei solchen Ausdrücken etwas aufpassen, wenn man die ADS verwendet, denn die kennt nicht alle Xbase-Funktionen.

Ergänzung: Man kann das auch mischen, also beispielsweise zwei Indexe auf dem selben Feld haben, einer mit "FOR !Deleted()" und einer ohne das. Beide werden automatisch gepflegt; der eine findet keine gelöschten Datensätze (ganz unabhängig von SET DELETED!), der andere durchaus, wenn SET DELETED OFF ist.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Index On mit FOR

Beitrag von brandelh »

Einfache Antwort ... die FOR Bedingung wird im Index gespeichert, der WHILE nicht !

Also wenn du ein FOR setzt und neue Datensätze angefügt werden, müssen diese auch die FOR Bedingung erfüllen um im Index zu landen.
So wie du es willst ;-)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Index On mit FOR

Beitrag von Manfred »

ich habe die Frage so verstanden, dass es darum ging wenn sich ein bestehender Satz ändert, nicht wenn ein neuer hinzukommt.
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!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Index On mit FOR

Beitrag von brandelh »

Manfred hat geschrieben:ich habe die Frage so verstanden, dass es darum ging wenn sich ein bestehender Satz ändert, nicht wenn ein neuer hinzukommt.
Von der Anforderung ist das das Gleiche ;-)
Aber OK, JA es funktioniert auch beim Speichern eines geänderten Datensatzes :!:
Nach einer Änderung kann er also genauso "rausfliegen" wie nach einer Löschung, damit muss das Programm klar kommen.

PS: wenn man mit dbGoTo() auf einen Satz springt, der nicht im Index ist und den Indexbegriff so ändert,
dass er nun rein passt, wird er nach dem Speichern und Refresh auch sichtbar sein.
Gruß
Hubert
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: Index On mit FOR

Beitrag von Tom »

Der Unterschied zu UNIQUE besteht darin, dass nur für den aktuellen/aktuell veränderten Datensatz geprüft werden muss, ob er der Bedingung genügt und bereits im Index enthalten ist. Funktioniert nach meiner Beobachtung problemlos, auch mit inhaltlichen Bedingungen wie "FOR !Left(name,1)=='_'".
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: Index On mit FOR

Beitrag von Jan »

Moin Hubert, Tom, und Manfred,

vielen Dank für Eure Antworten. Die Bestätigungen helfen mir sehr weiter.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten