Seite 1 von 1

Custom Index

Verfasst: Mi, 09. Nov 2016 9:27
von Manfred
Hat jemand schonmal damit gearbeitet? Wir haben gestern bei unserem Treffen in Leverkusen versucht einen Custom Index aufzubauen, aber leider war das Ergebnis nicht so wie erwartet. Vielleicht was es etwas zu eng mit der Zeit gestern, aber wir sind zu keinem zufriedenstellenden Ergebnis gekommen.

das ist hier ein kurzer Auszug aus dem versuch.

Code: Alles auswählen

do while ! Eof()
OrdKeyAdd("datum")
Dbseek(datum+1)
enddo
Beim Ordkeyadd() wird ein .F. zurückgeliefert. Aber was kann man da falsch machen?

Re: Custom Index

Verfasst: Mi, 09. Nov 2016 16:51
von AUGE_OHR
du musst den Index erst aufbauen bevor du etwas "add"en kannst.

wichtig : der IndexKey muss immer die selbe Länge haben

Code: Alles auswählen

// CUSTOM Index
INDEX ON ZAHLUNG->ZDUMMY TAG "FTS" TO "ZAHL_FTS.NTX" CUSTOM
? IndexKey()
OrdSetFocus(0)

nStart := SECONDS()
Ondummy("Start",TIME() )
GO TOP
DO WHILE !EOF()
   // zerlege Memo
   FTS_MEMOADD(ZAHLUNG->ZZUSATZ)
   SKIP
ENDDO
Ondummy("Stop",SECONDS()-nStart )

OrdSetFocus("FTS")
SEEK("verrechnet")
? FOUND()
WAIT

Re: Custom Index

Verfasst: Mi, 09. Nov 2016 17:00
von Manfred
Ich habe den Index aufgebaut, allerdings lief das absolut schnell. Sicherlich weil ja nix drin steht. Der Index hat auch immer die gleiche Länge.

Re: Custom Index

Verfasst: Mi, 09. Nov 2016 17:04
von AUGE_OHR
hm ... schon mal mit

Code: Alles auswählen

OrdKeyAdd(DTOS(FIELD->datum))
versucht ?

Re: Custom Index

Verfasst: Mi, 09. Nov 2016 17:12
von Manfred
Nein, daran gedacht hatte ich schon, aber in der Anleitung steht ausdrücklich, das der TAG angegeben werden muß und nicht der Wert. Bei der Erstellung, durch die ja nichts eingetragen wird steht der Schlüssel schon drin.

Re: Custom Index

Verfasst: Mi, 09. Nov 2016 19:10
von AUGE_OHR
Manfred hat geschrieben:... aber in der Anleitung steht ausdrücklich, das der TAG angegeben werden muß und nicht der Wert.
du hast Recht.

aber den "Wert" musst du trotzdem noch manuell in den Custom Index einfügen.

Code: Alles auswählen

FUNCTION FTS_MEMOADD(cZUSATZ)
LOCAL aText
LOCAL i,iMax

// trennt die Wörter
aText := AtInside( " ",cZUSATZ)
iMax := LEN(aText)

IF iMax > 0
   FOR i := 1 TO iMax
      Ondummy(RecNo(), aText[i] )                        // Debug
      REPLACE ZAHLUNG->ZDUMMY WITH aText[i]
      OrdKeyAdd( "FTS")
   NEXT
ENDIF
RETURN .T.
Erklärung : ich habe ein "extra" Feld ZDUMMY wegen der "Länge" des IndexKey()
es dient nur zum "füllen" des Custom Index mit gleicher Länge wobei es, nach dem OrdKeyAdd(),
nicht mehr wichtig ist "was" in dem Feld steht ( ist nun im Custom Index )

der Nachteil des Custom Index ist die "Pflege" denn man benötigt auch eine DEL und REPLACE Function.

p.s. ich suche nicht mit SEEK sondern mit OrdWildSeek()

Re: Custom Index

Verfasst: Mi, 09. Nov 2016 19:12
von Manfred
was heißt den Wert muß ich eintragen? Den Wert, den ich gefunden habe? Aber wo trägt man den ein? Da gibt es keinen Parameter. Nur den TAG. Oder was meinst Du?
Ach so, und SEEK wird mit Softseek gemacht. Das klappt eigentlich prima.

Re: Custom Index

Verfasst: Mi, 09. Nov 2016 19:21
von AUGE_OHR
Manfred hat geschrieben:was heißt den Wert muß ich eintragen?
Den Wert, den ich gefunden habe?
Aber wo trägt man den ein?
Da gibt es keinen Parameter. Nur den TAG. Oder was meinst Du?
Tja ... "das" ist eben das "Geheimnis" des Custom Index ;-)
siehe dir noch mal den Code von mir an ... der funktioniert "so"
Manfred hat geschrieben:Ach so, und SEEK wird mit Softseek gemacht. Das klappt eigentlich prima.
OrdWildSeek() ist noch was anderes.
ich will ja in Memo suchen und da kann es eben auch ein Teil-Ausdruck sein.

Re: Custom Index

Verfasst: Do, 10. Nov 2016 7:56
von Manfred
Du machst ein Psyeudoupdate auf das Schlüsselfeld?

Re: Custom Index

Verfasst: Do, 10. Nov 2016 19:58
von AUGE_OHR
Manfred hat geschrieben:Du machst ein Psyeudoupdate auf das Schlüsselfeld?
JA
üblicherweise würde der IndeyKey() ja automatisch "gepflegt" aber bei CUSTOM musst du dich eben selbst darum kümmern und die Aktion "auslösen" mit OrdKeyAdd()

dito. OrdKeyRemove()

Code: Alles auswählen

FUNCTION FTS_MEMODEL(cZUSATZ)
LOCAL aText
LOCAL i,iMax

aText := AtInside( " ",cZUSATZ)
iMax := LEN(aText)

IF iMax > 0
   FOR i := 1 TO iMax
      Ondummy(RecNo(), aText[i] )              // debug
      REPLACE ZAHLUNG->ZDUMMY WITH aText[i]    // dummy Feld (Länge) wegen Memo Inhalt
      OrdKeyRemove( "FTS")                     // CUSTOM Aktion "auslösen" 
   NEXT
ENDIF
RETURN .T.

Re: Custom Index

Verfasst: Fr, 11. Nov 2016 7:04
von Manfred
Hi Jimmy, das war nicht meine Frage. Das man OrdKeyAdd() oder OrdKEyRemove() selbst machen muß, ist mir klar. Meine Frage war, ob Du vorher das entsprechende Feld mit einem Wert upgedatet hast. Und dann erst OrdkeyAdd() den "neuen" Wert einträgt und ein .T. zurückliefert und nicht so wie bei mir ein .F. Ich habe nämlich vorher nichts ins feld geschrieben, weil ich es so verstanden habe, das ein OrdKEyAdd() genügt, wenn man auf dem Satz steht, den man aufnehmen will.

Re: Custom Index

Verfasst: Fr, 11. Nov 2016 13:27
von AUGE_OHR
Manfred hat geschrieben:Das man OrdKeyAdd() oder OrdKEyRemove() selbst machen muß, ist mir klar.
OK
Manfred hat geschrieben:Meine Frage war, ob Du vorher das entsprechende Feld mit einem Wert upgedatet hast. Und dann erst OrdkeyAdd() den "neuen" Wert einträgt und ein .T. zurückliefert und nicht so wie bei mir ein .F. Ich habe nämlich vorher nichts ins feld geschrieben, weil ich es so verstanden habe, das ein OrdKEyAdd() genügt, wenn man auf dem Satz steht, den man aufnehmen will.
habe kein CUSTOM Index auf ein "normales" Feld aber wenn es bei dir nicht funktioniert muss man es offensichtlich machen.