Seite 1 von 1

Scope + Filter EOF() [ERLEDIGT]

Verfasst: Fr, 08. Dez 2023 14:31
von Manfred
Ich setze einen Scope über eine DBF mit Index und dann noch einen Filter. Dann wird auch was gefunden. Sobald ich aber dann in der gefundenen menge auf das Ende springe mit Dbgobottom() komme ich nicht wieder zurück. Es wird immer eof() angezeigt. Wo mache ich den Denkfehler?

Re: Scope + Filter EOF()

Verfasst: Fr, 08. Dez 2023 14:44
von Tom
Was heißt "Dann wird auch etwas gefunden" genau?

DbSetScope() bewegt den Datensatzzeiger auf den ersten gültigen Datensatz, aber DbSetFilter() macht das nicht. Wenn Du also beides nacheinander ausführst, ohne ein DbGotop() zu machen, bleibst Du auf dem ersten Datensatz, der dem Scope genügt, aber möglicherweise trifft der Filter nicht zu. Das wird erst bei der ersten Bewegung evaluiert. Wahrscheinlich also findet Dein Filter überhaupt keine Datensätze, und beim DbGoBottom() merkst Du das.

Re: Scope + Filter EOF()

Verfasst: Fr, 08. Dez 2023 14:48
von Manfred
verdammt, ich hatte es geahnt, das ich auf jeden Fall das Gotop nach dem Filter vergessen hatte. Das war mal feste eingebrannt. Seit ich aber mit SQl viel mache, habe ich es vergessen. Werde mal sehen, ob es das war.

Re: Scope + Filter EOF() [ERLEDIGT]

Verfasst: Sa, 09. Dez 2023 7:45
von AUGE_OHR
hi Manfred,

ich setze einen FILTER erst nach einem SEEK mit dem "Inhalt" des (TOP) FILTER
damit stelle ich fest "ob" es überhaupt einen Treffer gibt und brauche dann auch kein GOTOP()

Re: Scope + Filter EOF() [ERLEDIGT]

Verfasst: Sa, 09. Dez 2023 8:39
von Tom
Wenn Du einen Filterausdruck hast, nach dem Du eine Indexsuche ausführen kannst, brauchst Du keinen Filter.

Re: Scope + Filter EOF() [ERLEDIGT]

Verfasst: Sa, 09. Dez 2023 9:27
von AUGE_OHR
hi Tom,

ich habe mich da falsch ausgedrückt denn das SEEK bezieht sich natürlich auf SCOPE und nicht FILTER
dabei enthält mein FILTER auch den Teil von SCOPE was früher notwendig war vor Sixdrive / SCOPE

Code: Alles auswählen

SEEK (cArtnr)
IF FOUND() 
   SET FILTER TO ARTNR = cArtnr and LAGER > 0
   BROWSE()
durch den "Skipper" wird der Pointer in den Bereich des FILTER "bewegt" wenn er den Bildschirm aufbaut

aber du hast natürlich Recht das ohne "Bewegung" des Pointer der FILTER nicht aktiv werden kann

Re: Scope + Filter EOF() [ERLEDIGT]

Verfasst: Sa, 09. Dez 2023 14:38
von Tom
Hallo, Jimmy.

Verstehe, aber das ist vermutlich der problematischere Vorgang. Ein DbSetScope() führt ja implizit schon das Seek aus; man steht also anschließend bereits auf dem ersten Datensatz. Wenn man dann den Filter setzt und DbGotop() auslöst, müssen nur noch Datensätze evaluiert werden, die sowieso im Scope sind. Das ergänzt einander auf diese Weise auch fast perfekt: Mit dem Scope erst die Datenmenge reduzieren, mit dem Filter dann mehr oder weniger unscharf in dieser Teilmenge suchen.