Indexlänge bei CDXDBE

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2827
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Indexlänge bei CDXDBE

Beitrag 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?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Indexlänge bei CDXDBE

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14656
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Indexlänge bei CDXDBE

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Indexlänge bei CDXDBE

Beitrag 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
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2827
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: Indexlänge bei CDXDBE

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 651
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Indexlänge bei CDXDBE

Beitrag 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.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Antworten