Hallo,
ich habe meine Topdown Version auf neuesten Stand gebracht und habe angefangen damit zu arbeiten. Nun gibt es dort bei der Erstellung der Index Files ein Beispiel:
-- SAMPLE --
********************** Do this for each DBF
******* dbf cdx cFlag lUseBar nEvery aTags
aDbf := {"cust.dbf","cust.cdx","customer", .F., 10, { {"name","lname+fname"},; // tag1 {Tag Name,Index Key}
{"dob" ,"stod('dob')"} ; // tag2
} }
aadd(aFiles,aDbf)
Wenn ich das richtig verstanden habe, so wird hier eine Indexdatei cust.cdx erstellt aber mit 2 Tags bzw. 2 Indexkeys.
Geht das überhaupt in einer Indexdatei?
Falls ja, wie kann man diese im Programm ansprechen?
Hello
All my program have CDX index like this
aDbf := {"&pot_baze"+"PARTNER.dbf","&pot_baze"+"PARTNER.CDX","PARTNER", .T., 10,;
{ {"sifra","sifpar"},{"davcna","davcna_st"},{"naziv","naziv"} } }
this is something like old clipper way:
USE PARTNER
INDEX ON sifpar TAG sifra TO PARTNER
INDEX ON davcna_st TAG davcna TO PARTNER
INDEX ON naziv TAG naziv TO PARTNER
So, in PARTNER.CDX you have 3 keys (sifra, davcna,naziv) (translate: partner number, VAT number, name)
In program, i open the dbf
IF !tdOpenDbf("&pot_baze"+"PARTNER.dbf","PARTNER","shared")
close all; RETURN nil
ELSE
SET INDEX TO "&pot_baze"+"PARTNER" OrdSetFocus("naziv")
ENDIF
so, when I first browse the partner.dbf , data are sorting by name, or, when you control input get data
(VAT) you must swith to example OrdSetFocus("sifra")
FUNCTION Ctrl_Part(oGetX1,oGetX2,oOld,novi)
LOCAL lVrni:=.F.
LOCAL aFields
LOCAL nRows := 24 , nCols := 76
seit FoxPro (oder SixDriver, was weiss ich, mein Gedächtnis setzt da aus) gibt es CDX-Dateien, die es ermöglichen, innerhalb der CDX-Datei (wohlgemerkt, nicht INDEX-Datei) individuelle Indices zu erstellen, die als "Tags" bezeichnet werden.
nun ist CDX nur die "ORDER" Komponente und bei FOX hast du bei der "DATA" Komponente ja verschiedene Möglichkeiten.
abhängig davon welche DATA Komponente du verwendest ist die Indexkey() Länge bei CDX evtl. auf 120/240*** beschränkt.
***PDR 2940, 4846
georg hat geschrieben:Der Vorteil unter DOS war, dass man lediglich einen File-Handle benötigte, aber trotzdem mehr als einen Index für eine Datei öffnen konnte.
Die Anzahl der File-Handles ist jetzt zwar kein Thema mehr, aber wenn man nur eine CDX Datei je DBF braucht, kann man den gleichen Namen verwenden !
Eine Anwendung braucht also nur noch die Indexdatei mit dem Dateinamen der DBF (ohne ".DBF") zu öffnen und man spart sich interne Listen welche Indexdateien nun dazu gehören.
Handbuch hat geschrieben:Eine wichtige Eigenschaft des CDX Dateiformats ist, daß die Sortierfolge für Zeichen in der CDX Datei gespeichert wird, wenn eine Zeichenvergleichstabelle ausgewählt ist (siehe SET COLLATION). Dadurch wird die Sortierung von Zeichenketten zu dem Zeitpunkt festgelegt, zu dem ein Index erzeugt wird.
Handbuch hat geschrieben:Weiterhin ist anzumerken, daß Indizes für Zeichenausdrücke bei der CDXDBE unabhängig von Groß- und Kleinschreibung werden,
sobald eine Zeichenvergleichstabelle aktiv ist. Dieses Verhalten ist wiederum kompatibel mit Visual FoxPro.
Und Textindexfelder werden komprimiert abgespeichert, das spart nicht nur Plattenplatz, sondern auch Bandbreite im Netzwerk.
Hier ein Beispiel mit Ergebnis:
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Inkey.ch"
#include "DBFDBE.CH"
#include "NTXDBE.CH"
#include "FOXDBE.CH"
#include "CDXDBE.CH"
PROCEDURE dbeSys()
SET COLLATION TO GERMAN
SET DATE TO GERMAN
SET EPOCH TO year(date())-80
SET CHARSET TO OEM
IF ! DbeLoad( "DBFDBE", .t.)
Alert( "DBFDBE: MSG_DBE_NOT_LOADED" , {"OK"} )
ENDIF
IF ! DbeLoad( "NTXDBE", .t.)
Alert( "NTXDBE: MSG_DBE_NOT_LOADED" , {"OK"} )
ENDIF
IF ! DbeBuild( "DBFNTX","DBFDBE","NTXDBE" )
Alert( "DBFNTX: MSG_DBE_NOT_CREATED" , {"OK"} )
ENDIF
IF ! DbeLoad( "FOXDBE", .t.)
Alert( "FOXDBE: MSG_DBE_NOT_LOADED" , {"OK"} )
ENDIF
IF ! DbeLoad( "CDXDBE", .t.)
Alert( "CDXDBE: MSG_DBE_NOT_LOADED" , {"OK"} )
ENDIF
IF ! DbeBuild( "FOXCDX","FOXDBE","CDXDBE" )
Alert( "FOXCDX: MSG_DBE_NOT_CREATED" , {"OK"} )
ENDIF
IF ! DbeBuild( "DBFCDX","DBFDBE","CDXDBE" )
Alert( "DBFCDX: MSG_DBE_NOT_CREATED" , {"OK"} )
ENDIF
DbeInfo( COMPONENT_DATA, FOXDBE_MEMOBLOCKSIZE , 80 )
DbeInfo( COMPONENT_ORDER, DBE_LOCKMODE , LOCKING_EXTENDED )
DbeSetDefault("DBFNTX")
RETURN
proc main
field text, id
cls
? "Aktive DBE: ",DbeSetDefault()
CreateALL()
DbeSetDefault("DBFCDX")
? "Aktive DBE: ",DbeSetDefault()
CreateALL()
DbeSetDefault("FOXCDX")
? "Aktive DBE: ",DbeSetDefault()
CreateALL()
? "Fertig"
?
wait
return
procedure CreateALL()
field text, id
local x, cFN
cFN := "A_Test_"+DbeSetDefault()
? "CreateALL(), Start ",time()," ", DbeSetDefault()
dbcreate(cFN, {{"ID","N",10,0},{"Text","c",100,0}})
use (cFN) exclusive
for x := 1 to 1000
append blank
replace ID with x
replace text with "Satz "+str(x,5,0)
next
? "CreateALL(), Index ",time()
index on text tag "Text" to (cFN)
? "CreateALL(), Ende ",time()
set index to (cFN)
if dbseek("satz") // Kleinbuchstaben suchen
? "'satz' wurde gefunden in '"+rtrim(text)+"' Recno():",recno()
else
? "'satz' wurde nicht gefunden. CASE sensitive ! "
endif
use
return
Ein Feldname TEXT ist natürlich unglücklich, da TEXT auch ein Befehl ist.
Diese Beispiel funktioniert aber dennoch !
Hier das Ergebnis:
Seitdem ich die verwende habe ich keine Probleme mit korrupten Indizee mehr. Bei ntx-indizee ständig.
Der Index heißt bei mir immer so wie die dbf, das macht es enorm übersichtlich.
Wenn ich irgendwo einen Index hinzufüge, dann muß ich mit ntx-Indizee darauf achten, die neu hinzugekommenen auch an allen anderen Öffnungspunkten im gleichen oder anderen Programmen mit Zugriff auf diese dbf hinzuzufügen. Bei cdx-Indizee nicht, denn die eine Datei öffne ich ohnehin, und der neu hinzugekommene wird automatisch mit geöffnet.
Wobei ich vor langer Zeit, als ich von ntx auf cdx umgestellt habe, im Alaska Forum den Hinweis gelesen habe, man sollte aus Gründen der Stabilität nur 5 Tags pro Indexdatei verwenden, bei mehr, sollte man lieber mehrere Indexdateien verwenden.
Als ich verwende teilweise mehr als 20... und kann nicht sagen, dass mit CDXen mit mehr als 5 tags mehr Probleme hätte, als mit CDXen mit weniger als 5...