[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/privacyprotection/cron/task/anonymize_ip.php on line 83: A non-numeric value encountered
Inoffizielles deutsches Xbase-Forum • Indexlänge bei CDXDBE
Seite 1 von 1

Indexlänge bei CDXDBE

Verfasst: So, 22. Okt 2023 19:51
von georg
Guten Abend,

vielleicht verstehe ich ja etwas falsch. Ich versuche, einen Index mit folgendem Ausdruck zu erstellen:

Code: Alles auswählen

dbCreateIndex("content.cdx", "Upper(Dateiname) + Upper(Verzeich)", , .F.)
Dateiname ist ein Feld mit 80 Zeichen Länge, Verzeich hat 200 Zeichen Länge. Das Erstellen bringt diese Fehlermeldung:
Xbase++ Version : Xbase++ (R) Version 2.00.1948
Betriebssystem : Windows 11 2009 Build 22621
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: C VALUE: content.cdx
-> VALTYPE: C VALUE: Upper(Dateiname) + Upper(Verzeich)
-> VALTYPE: U VALUE: NIL
-> VALTYPE: L VALUE: .F.
oError:canDefault : J
oError:canRetry : J
oError:canSubstitute: N
oError:cargo : NIL
oError:description : L„nge des Datenbankfeldes wurde berschritten
oError:filename :
oError:genCode : 63
oError:operation : DbCreateIndex
oError:osCode : 0
oError:severity : 2
oError:subCode : 8999
oError:subSystem : BASE
oError:thread : 1
oError:tries : 1
Laut Dokumentation sollte es gehen:
Max. length for both
- INDEX plus FOR expression 512 characters
Ich komme aber "nur" auf 280 Zeichen, also etwas mehr als die Hälfe von 512.

Wer's nachstellen will, hier ist ein kleines Testprogramm:

Code: Alles auswählen

#INCLUDE "AppEvent.CH"
#INCLUDE "Xbp.CH"

FUNCTION Main()
   Local aStru

   IF fExists("content.dbf")
      fErase("content.dbf")
   ENDIF
   IF fExists("content.cdx")
      fErase("content.cdx")
   ENDIF

   aStru := {;
      {"CONTENTID",  "N",  10, 0},;
      {"DATEINAME",  "C",  80, 0},;
      {"LAUFWERK",   "C",   1, 0},;
      {"VERZEICH",   "C", 200, 0},;
      {"TITEL",      "C", 128, 0},;
      {"UNTERTITEL", "C", 192, 0},;
      {"QUELLE",     "C", 128, 0},;
      {"DATUM",      "D",  10, 0},;
      {"LIKES",      "N",   7, 3},;
      {"DISLIKES",   "N",   7, 3};
      }

   dbCreate("content.dbf", aStru, "FOXCDX")
   dbUseArea(.T., "FOXCDX", "content.dbf", "content", .T., .F.)
   dbCreateIndex("content.cdx", "Upper(Dateiname) + Upper(Verzeich)", , .F.)
RETURN (.T.)

FUNCTION DBESys()
   IF !DbeLoad("FOXDBE", .T.)
      ConfirmBox()
   ENDIF
   IF !DbeLoad("CDXDBE", .T.)
      ConfirmBox()
   ENDIF
   IF !DbeBuild("FOXCDX", "FOXDBE", "CDXDBE")
      ConfirmBox()
   ENDIF
RETURN (.T.)
Wo liegt mein Denkfehler?

Re: Indexlänge bei CDXDBE

Verfasst: So, 22. Okt 2023 20:41
von AUGE_OHR
hi Georg,

ich finde die Stelle im Help File nicht, aber die 512 als "Länge" für *.CDX ist IMHO falsch

es sind nur 240 bzw 120 die als Länge funktionieren

Re: Indexlänge bei CDXDBE

Verfasst: Mo, 23. Okt 2023 5:30
von Jan
Hallo Georg,

ich habe das mal in meinem FOXCDX-Programm versucht. Ein neuer Index mit 500 Zeichen ist nicht möglich.

Wobei ich mich frage ob die 512 Zeichen sich auf den indexschlüssel beziehen, oder auf den Indexausdruck.

Mich wundert daß Du zwar eine cdx erstellst. Aber ohne Tag-Namen, was ja eigentlich einer der Hauptvorteile der cdx ist. Hast Du das mal mit OrdCreate() versucht? DbCreateIndex() ist ja ohnehin deprecated.

Jan

Re: Indexlänge bei CDXDBE

Verfasst: Mo, 23. Okt 2023 6:29
von AUGE_OHR
PDR 5694
Maximum length of index value not documented
For fields of type character the maximum length of the index value
is 120 characters. When the CDXDBE runs is in FOXPRO2X or COMIX mode
then the maximum length of the key value is 240. This is not documented

Re: Indexlänge bei CDXDBE

Verfasst: Mo, 23. Okt 2023 8:47
von georg
Guten Morgen,


danke für die Rückmeldungen. Ihr bestätigt mir, was ich vermutet habe.

Um den Eintrag in der Dokumentation zu finden, such einfach nach "CDXDBE". In der Trefferliste ist (bei mir) der zweite Eintrag "CDXDBE (ORDER Component)", da habe ich die Angaben her.

Von der Wortwahl her kann sich die "512 characters" natürlich auch auf den Index-AUSDRUCK beziehen.

@Jan: ich verwende hier kein TAG, da das hier nur als Beispiel dient.

Re: Indexlänge bei CDXDBE

Verfasst: Mo, 23. Okt 2023 11:49
von nightcrawler
Hallo Georg,
ich kenne es aus den ADS Dokumentationen, da diese ja kompatibel mit FOXCDX sind. Resultierende Schlüssellänge max 240, Index-Ausdruck (also die Formel zur Erstellung des Schlüsselwertes) 512.