So,
ich habe jetzt einmal ein wenig gebastelt:
aus dem hier
Code: Alles auswählen
function ohneArtikel(cIndexKey)
LOCAL cArtikel
LOCAL lFertig := .F.
LOCAL nArtikel1 := 0 // wird nach jedem gefunden Artikel 1 hochgezählt,
LOCAL nArtikel2 := 0 // damit kein Endlosdurchlauf geschieht, bei mehrfach Artikel im Feld
LOCAL nIndexOrgLaenge := LEN(cIndexKey) // wird nachher für die evtl. fehlenden Zeichen benötigt
LOCAL nMenge32 // Leerzeichen
LOCAL nMenge33 // !
LOCAL nMenge34 // "
LOCAL nMenge35 // #
LOCAL nMenge38 // &
LOCAL nMenge39 // '
LOCAL nMenge40 // (
LOCAL nMenge42 // *
LOCAL nMenge43 // +
LOCAL nMenge44 // ,
LOCAL nMenge46 // .
LOCAL nMenge95 // _
DO WHILE ! lFertig
lFertig := .T.
IF EMPTY(cIndexKey) // das kann auch vorkommen
EXIT // es würde sonst arg lange dauern
ENDIF
nMenge32 := COUNTLEFT(cIndexKey,CHR(32)) // Leerzeichen
nMenge33 := COUNTLEFT(cIndexKey,CHR(33)) // !
nMenge34 := COUNTLEFT(cIndexKey,CHR(34)) // "
nMenge35 := COUNTLEFT(cIndexKey,CHR(35)) // #
nMenge38 := COUNTLEFT(cIndexKey,CHR(38)) // $
nMenge39 := COUNTLEFT(cIndexKey,CHR(39)) // %
nMenge40 := COUNTLEFT(cIndexKey,CHR(40)) // (
nMenge42 := COUNTLEFT(cIndexKey,CHR(42)) // *
nMenge43 := COUNTLEFT(cIndexKey,CHR(43)) // +
nMenge44 := COUNTLEFT(cIndexKey,CHR(44)) // ,
nMenge46 := COUNTLEFT(cIndexKey,CHR(46)) // .
nMenge95 := COUNTLEFT(cIndexKey,CHR(95)) // _
IF nMenge32 > 0 // mußer hier rein, weil jetzt auch Leerezeichen am Anfang sein können
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge32 + 1,nIndexOrgLaenge-nMenge32) + SPACE(nMenge32),1)
lFertig := .F.
ELSEIF nMenge33 > 0
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge33 + 1,nIndexOrgLaenge-nMenge33) + SPACE(nMenge33),1)
lFertig := .F.
ELSEIF nMenge34 > 0
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge34 + 1,nIndexOrgLaenge-nMenge34) + SPACE(nMenge34),1)
lFertig := .F.
ELSEIF nMenge35 > 0
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge35 + 1,nIndexOrgLaenge-nMenge35) + SPACE(nMenge35),1)
lFertig := .F.
ELSEIF nMenge38 > 0
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge38 + 1,nIndexOrgLaenge-nMenge38) + SPACE(nMenge38),1)
lFertig := .F.
ELSEIF nMenge39 > 0
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge39 + 1,nIndexOrgLaenge-nMenge39) + SPACE(nMenge39),1)
lFertig := .F.
ELSEIF nMenge40 > 0
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge40 + 1,nIndexOrgLaenge-nMenge40) + SPACE(nMenge40),1)
lFertig := .F.
ELSEIF nMenge42 > 0
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge42 + 1,nIndexOrgLaenge-nMenge42) + SPACE(nMenge42),1)
lFertig := .F.
ELSEIF nMenge43 > 0
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge43 + 1,nIndexOrgLaenge-nMenge43) + SPACE(nMenge43),1)
lFertig := .F.
ELSEIF nMenge44 > 0
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge44 + 1,nIndexOrgLaenge-nMenge44) + SPACE(nMenge44),1)
lFertig := .F.
ELSEIF nMenge46 > 0
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge46 + 1,nIndexOrgLaenge-nMenge46) + SPACE(nMenge46),1)
lFertig := .F.
ELSEIF nMenge95 > 0
cIndexKey := TOKENUPPER(SUBSTR(cIndexKey,nMenge95 + 1,nIndexOrgLaenge-nMenge95) + SPACE(nMenge95),1)
lFertig := .F.
ELSEIF UPPER(SUBSTR(cIndexKey,1,4)) == "DER " .OR.;
UPPER(SUBSTR(cIndexKey,1,4)) == "DIE " .OR.;
UPPER(SUBSTR(cIndexKey,1,4)) == "DAS " .OR.;
UPPER(SUBSTR(cIndexKey,1,4)) == "THE " .OR.;
UPPER(SUBSTR(cIndexKey,1,4)) == "THA "
IF nArtikel1 = 0 // 1. Durchlauf, alles ok
cArtikel := SubStr(cIndexKey,1,3) // Artikel merken
cIndexKey := SUBSTR(cIndexKey,4,46) // Artikel eliminieren
cIndexKey := TRIM(cIndexKey) // LeerZeichen hinten entfernen
cIndexKey += ", " + cArtikel // Artikel hinten dranpacken
cIndexKey := TOKENUPPER(cIndexKey,1) // Anfangsbuchstaben groß
cIndexKey := PADRIGHT(cIndexKey,50) // jetzt wird wieder auf Originallänge aufgefüllt
lFertig := .F.
ENDIF
nArtikel1++
ELSEIF UPPER(SUBSTR(cIndexKey,1,3)) == "LA "
IF nArtikel2 = 0 // 1.Durchlauf, alles ok
cArtikel := SubStr(cIndexKey,1,2) // Artikel merken
cIndexKey := SUBSTR(cIndexKey,3,47) // Artikel eliminieren
cIndexKey := TRIM(cIndexKey) // LeerZeichen hinten entfernen
cIndexKey += ", " + cArtikel // Artikel hinten dranpacken
cIndexKey := TOKENUPPER(cIndexKey,1) // Anfangsbuchstaben groß
cIndexKey := PADRIGHT(cIndexKey,50) // jetzt wird wieder auf Originallänge aufgefüllt
lFertig := .F.
ENDIF
nArtikel2++
ENDIF
ENDDO
return cIndexKey
wurde das hier:
Code: Alles auswählen
FUNCTION indexohne(cIndexKey)
LOCAL cArtikel entfernen"
LOCAL lFertig := .F.
LOCAL nArtikel1 := 0 // wird nach jedem gefunden Artikel 1 hochgezählt,
LOCAL nArtikel2 := 0 // damit kein Endlosdurchlauf geschieht, bei mehrfach Artikel im Feld
LOCAL nIndexOrgLaenge := LEN(cIndexKey) // wird nachher für die evtl. fehlenden Zeichen benötigt
LOCAL nMenge32 // Leerzeichen
LOCAL nMenge33 // !
LOCAL nMenge34 // "
LOCAL nMenge35 // #
LOCAL nMenge38 // &
LOCAL nMenge39 // '
LOCAL nMenge40 // (
LOCAL nMenge41
LOCAL nMenge42 // *
LOCAL nMenge43 // +
LOCAL nMenge44 // ,
LOCAL nMenge45 //-
LOCAL nMenge46 // .
LOCAL nMenge47 // /
LOCAL nMenge58
LOCAL nMenge62
LOCAL nMenge63
LOCAL nMenge92 // \
LOCAL nMenge94
LOCAL nMenge95 // _
LOCAL nMenge96
LOCAL nMenge180
DO WHILE ! lFertig
lFertig := .T.
IF EMPTY(cIndexKey) // das kann auch vorkommen
EXIT // es würde sonst arg lange dauern
ENDIF
nMenge32 := COUNTLEFT(cIndexKey,CHR(32)) // Leerzeichen
nMenge33 := COUNTLEFT(cIndexKey,CHR(33)) // !
nMenge34 := COUNTLEFT(cIndexKey,CHR(34)) // "
nMenge35 := COUNTLEFT(cIndexKey,CHR(35)) // #
nMenge38 := COUNTLEFT(cIndexKey,CHR(38)) // $
nMenge39 := COUNTLEFT(cIndexKey,CHR(39)) // %
nMenge40 := COUNTLEFT(cIndexKey,CHR(40)) // (
nMenge41 := COUNTLEFT(cIndexKey,CHR(41))
nMenge42 := COUNTLEFT(cIndexKey,CHR(42)) // *
nMenge43 := COUNTLEFT(cIndexKey,CHR(43)) // +
nMenge44 := COUNTLEFT(cIndexKey,CHR(44)) // ,
nMenge45 := COUNTLEFT(cIndexKey,CHR(45)) // -
nMenge46 := COUNTLEFT(cIndexKey,CHR(46)) // .
nMenge47 := COUNTLEFT(cIndexKey,CHR(47)) // /
nMenge58 := COUNTLEFT(cIndexKey,CHR(58))
nMenge62 := COUNTLEFT(cIndexKey,CHR(62))
nMenge63 := COUNTLEFT(cIndexKey,CHR(63))
nMenge92 := COUNTLEFT(cIndexKey,CHR(92)) // \
nMenge94 := COUNTLEFT(cIndexKey,CHR(94))
nMenge95 := COUNTLEFT(cIndexKey,CHR(95)) // _
nMenge96 := COUNTLEFT(cIndexKey,CHR(96))
nMenge180 := COUNTLEFT(cIndexKey,CHR(180))
IF nMenge32+nMenge33+nMenge34+nMenge35+nMenge38+nMenge39+nMenge40+nMenge41+nMenge42+;
nMenge43+nMenge44+nMenge45+nMenge46+nMenge47+nMenge62+nMenge63+;
nMenge92+nMenge94+nMenge95+nMenge96 > 0
cIndexKey := SUBSTR(cIndexKey,2,nIndexOrgLaenge-1) + SPACE(1)
lFertig := .F.
ELSEIF SUBSTR(cIndexKey,1,4) == "DER " .OR.;
SUBSTR(cIndexKey,1,4) == "DIE " .OR.;
SUBSTR(cIndexKey,1,4) == "DAS " .OR.;
SUBSTR(cIndexKey,1,4) == "THE " .OR.;
SUBSTR(cIndexKey,1,4) == "THA "
IF nArtikel1 = 0 // 1. Durchlauf, alles ok
cArtikel := SubStr(cIndexKey,1,3) // Artikel merken
cIndexKey := SUBSTR(cIndexKey,4,46) // Artikel eliminieren
cIndexKey := TRIM(cIndexKey) // LeerZeichen hinten entfernen
cIndexKey += ", " + cArtikel // Artikel hinten dranpacken
cIndexKey := PADRIGHT(cIndexKey,50) // jetzt wird wieder auf Originallänge aufgefüllt
lFertig := .F.
ENDIF
nArtikel1++
ELSEIF SUBSTR(cIndexKey,1,3) == "LA "
IF nArtikel2 = 0 // 1.Durchlauf, alles ok
cArtikel := SubStr(cIndexKey,1,2) // Artikel merken
cIndexKey := SUBSTR(cIndexKey,3,47) // Artikel eliminieren
cIndexKey := TRIM(cIndexKey) // LeerZeichen hinten entfernen
cIndexKey += ", " + cArtikel // Artikel hinten dranpacken
cIndexKey := PADRIGHT(cIndexKey,50) // jetzt wird wieder auf Originallänge aufgefüllt
lFertig := .F.
ENDIF
nArtikel2++
ENDIF
ENDDO
RETURN cIndexkey
Warum ich diesen Blödsinn oben mit jeder IF Abfrage gebaut habe, weiß ich heute auch nicht mehr. Aber egal
So, knapp 536000 Datensätze
einfacher NTX Index ohne Function ca.13 Sekunden
Index mit Funktion = 32 Sekunden
cIndexKey wird Upper() übergeben, also ist schon groß wenn er kommt. Das hatte ich damals übersehen und deshalb nochmals Upper überall eingebaut. Tokenupper war auch überflüssig, hat aber alles nix gebracht. Auch der Tipp von Steffen dies nicht in die Schleife einzubauen, brachte keinen Tempogewinn.
Egal, was ich gemacht habe, es gab keinen Tempovorteil. Ich denke mir jetzt aber, der Rest wird irgendwie bremsen. Nur fehlt mir jetzt irgendwie der Schmalz. Hat jemand eine Idee, wie man den Rest vereinfachen kann?