Problem mit Index

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Problem mit Index

Beitrag von Rudolf »

Hallo,
habe ein ganz verrücktes Problem beim Erstellen von Indexdateien. Muss entweder mit der 1.9er oder mit der letzten eXPress++ Version entstanden sein, jedenfalls war das Problem vorher nicht. Habe den Fehler jetzt auf ein kleines Beispiel reduziert. Wenn ich die Indexdateien innerhalb der Funktion progmain() erstelle, ist alles ok, wenn ich jedoch mit dem selben Syntax den Index mit makindex2() erstelle, ist die Indexdatei kaputt. In meiner grossen Applikation werden einzelne Tags überhaupt nicht erstellt, andere wieder einwandfrei. Das Ergebnis ist auch immer gleich, also kein willkürlicher Effekt. Habe jetzt 2 Tage lang gesucht und bin mit meinem Latein am Ende, veilleicht habe ich eine Fehler im Source und kann ihn einfach nicht mehr sehen.
Vielleicht könnte jemand den Code testen ob es ein allgemeines Problem ist oder nur bei mir auftritt.

Grüsse
Rudolf








#include "xbp.ch"
#include "dll.ch"
#include "dcgra.ch"
#include "appevent.ch"
#include "dcdialog.ch"
#include 'common.ch'
#include 'std.ch'
#include 'set.ch'
#include "xbp.ch"
#include "foxdbe.ch"
#include "Dbfdbe.ch"
#include "CDxdbe.ch"

FUNCTION Main ( cParam1, cParam2 )
******************************************************************
DEFAULT cParam1 to ""
DEFAULT cParam2 to ""

IF ! DbeLoad( "CDXDBE",.T.)
Alert( "Database-Engine CDXDBE not loaded" , {"OK"} )
ENDIF

IF ! DbeBuild( "DBFCDX", "DBFDBE", "CDXDBE" )
Alert( "DBFCDX Database-Engine;Could not build engine" , {"OK"} )
ENDIF

IF ! DbeLoad( "FOXDBE",.T.)
Alert( "Database-Engine FOXDBE not loaded" , {"OK"} )
ENDIF

IF ! DbeBuild( "FOXCDX", "FOXDBE", "CDXDBE" )
Alert( "FOXCDX Database-Engine;Could not build engine" , {"OK"} )
ENDIF
SET COLLATION TO GERMAN


DbeSetDefault("DBFCDX")
DbeInfo(COMPONENT_DATA, DBFDBE_LOCKRETRY, 1000000)
DbeInfo(COMPONENT_ORDER, CDXDBE_LOCKRETRY, 1000000)

DbeSetDefault("FOXCDX")
DbeInfo(COMPONENT_DATA, FOXDBE_LOCKRETRY, 1000000)
DbeInfo(COMPONENT_ORDER, CDXDBE_LOCKRETRY, 1000000)


DbeSetDefault("DBFCDX")
SET COLLATION TO GERMAN

DbeInfo( COMPONENT_ORDER, DBE_LOCKMODE, LOCKING_EXTENDED )

progmain(cParam1,cParam2)

RETURN nil

/* ------------- DBFDBE_LOCKRETRY */

PROCEDURE AppSys()

LOCAL oCrt, nAppType := AppType()

DO CASE

CASE .t.

// PM Mode: create an XbpCrt instance
CASE nAppType == APPTYPE_PM

// First active SetAppWindow() == Desktop
AppDesktop ( SetAppWindow() )

// Create XbpCRT object
oCrt := XbpCrt():New ( NIL, NIL, { 0, 0 }, 25, 80 )
oCrt:FontWidth := 8
oCrt:FontHeight := 16
#ifdef __OS2__
oCrt:FontName := "System VIO"
#endif
#ifdef __WIN32__
oCrt:FontName := "Alaska Crt"
oCrt:Title := "C-TEC Softwareentwicklung Rudolf Reinthaler"
#endif
oCrt:Create()

// Init Presentation Space
oCrt:PresSpace()

// XbpCrt gets active window and output device
SetAppWindow ( oCrt )

// VIO or NOVIO Mode: create a RootCrt instance
CASE nAppType == APPTYPE_VIO .OR. nAppType == APPTYPE_NOVIO

// Create RootCrt object
oCrt := RootCrt():New():Create()

// RootCrt gets active window and output device
SetAppWindow ( oCrt )

ENDCASE

RETURN


function progmain()
******************************************************************
local getlist := {}, oProgress,oSay1,oSay2,oSay3,a_dbf := {}
local cIndexFile := "kunden.cdx"
local cDBF := "kunden.dbf"
local aIndex := {}
if !fexists("kunden.dbf")
aadd(a_dbf ,{"name1" ,"C", 30,0})
aadd(a_dbf ,{"name2" ,"C", 30,0})
aadd(a_dbf ,{"vorname" ,"C", 30,0})
aadd(a_dbf ,{"selektor" ,"C", 10,0})
aadd(a_dbf ,{"nummer" ,"N", 5,0})
dbcreate("kunden",a_dbf)
endif

aadd(aIndex,{"NUMMER", "nummer" ,"","","","kunden",.f.})
aadd(aIndex,{"NAME1", "upper(name1)" ,"","","","kunden",.f.})
aadd(aIndex,{"MATCH", "vorname" ,"","","","kunden",.f.})
aadd(aIndex,{"SELEKTOR", "SELEKTOR" ,"","","","kunden",.f.})
*---------------------- make testdata ---------------------------------
DbUseArea(.t.,"DBFCDX",cDBF,"KUN",.f.)
if lastrec() < 10
for x := 1 to 10
append blank
repl nummer with x
repl name1 with "kunde " + var2char(x)
repl name2 with "kunde " + var2char(x)
repl selektor with "TEST"
repl vorname with "SEL" + var2char(x)
next x
endif
go bottom
repl vorname with "TEST"
ordlistclear()
ferase(cIndexFile)
*------------------------- does not work !!!-----------------
makeindex2(cIndexFile,aIndex)
*------------------------------------------------------------
dbcloseall()
DbUseArea(.t.,"DBFCDX",cDBF,"KUN",.f.) // FUNCT nicht
ordlistadd(cIndexFile)
ordsetfocus("MATCH")
seek "TEST"
if eof()
msgbox("3 not found")
else
msgbox("3 found")
endif
*------------------------ works !!!----------------------------
dbcloseall()
DbUseArea(.t.,"DBFCDX",cDBF,"KUN",.f.)
@ 1,1 DCSAY 'Erstelle Indexdatei '
@ 2,1 DCPROGRESS oProgress SIZE 50,1.2 COLOR GRA_CLR_RED PERCENT EVERY 100
DCREAD GUI EXIT FIT PARENT @oDlg TITLE "Datenbankindizierung"
ordCondSet( , , ,{||.t.} ,{||.f.} , , RECNO(), , , , )
for i := 1 to len(aIndex)
ordCreate(cIndexFile, aIndex[i,1], aIndex[i,2], {||DC_GetProgress(oProgress,RecNo(),RecCount()),&(aIndex[i,2]) },.f.,.F. )
next i
oDlg:setModalState(XBP_DISP_MODELESS)
oDlg:Destroy()
ordsetfocus("MATCH")
seek "TEST"
if eof()
msgbox("2 not found")
else
msgbox("2 found")
endif
dbcloseall()
return .t.

FUNCTION makeindex2(cFile,aIndex)
******************************************************************
LOCAL oDlg, oSay, oSay2,oSay3,oProgress,GetList := {}, ;
i, oAppFocus := SetAppFocus()
@ 1,1 DCSAY 'Erstelle Indexdatei ' + cFile
@ 2,1 DCPROGRESS oProgress SIZE 50,1.2 COLOR GRA_CLR_RED PERCENT EVERY 100
DCREAD GUI EXIT FIT PARENT @oDlg TITLE "Datenbankindizierung"
FOR i := 1 TO Len(aIndex)
ordCondSet( , , ,{||.t.} ,{||.f.} , , RECNO(), , , , )
dcqdebug aIndex[i,1]
dcqdebug aIndex[i,2]
dcqdebug aIndex[i,3]
dcqdebug aIndex[i,4]
ordCreate(cFile, aIndex[i,1], aIndex[i,2],{||DC_GetProgress(oProgress,RecNo(),RecCount()),&(aIndex[i,2]) },.f.,.f. )
NEXT
oDlg:setModalState(XBP_DISP_MODELESS)
oDlg:Destroy()
SetAppFocus(oAppFocus)
RETURN .t.

function ntrim(n)
return var2char(n)
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

Problem gelöst. Es ist ein Fehler im XBase++, der While Block in ordcondset() darf ab der 1.9er nicht mehr verwendet werden !
Es resultieren daraus leere Index Tag's. Es dürfte ein PDR dafür schon erstellt werden.

Grüsse
Rudolf
Antworten