Page 1 of 1
ERROR CON TDATABASE Y CODGRUP.DBF
Posted: Mon Dec 30, 2019 12:31 am
by rterraz
Hola a todos
Estoy corriendo una funcion para modificar estructuras de bases de datos .DBF y me he encontrado con lo siguiente
Tengo una base de datos CODGRUP.DBF
si hago esto Dbusearea(.t.,,cPath+'CODGRUP',,.t.) la base se abre perfectanmente
si intento abrirla con oDbf := TDatabase():Open( , cPath+'CODGRUP' ,'DBFCDX' , .T. ) me da un error y el programa se cuelga !!!
Necesito el oDbf para poder usar oDbf:Dbstruct() en un xbrowse.
si le cambio el nombre a la DBF ej: CODIGOS.DBF lo anterior anda perfectamente ?????
No se me ocurre que pueda estar pasando , CODGRUP será una palabra RESERVADA y por eso se cuelga ? o algun error en la TDatabase ?
Estuve mirando la Clase pero no encuentro nada!
Ayuda please...
Saludos a todos y Feliz año nuevo.
Re: ERROR CON TDATABASE Y CODGRUP.DBF
Posted: Mon Dec 30, 2019 1:03 am
by cnavarro
Si pones esto
Code: Select all
Dbusearea(.t.,"DBFCDX",cPath+'CODGRUP',,.t.)
También se abre bien?
Re: ERROR CON TDATABASE Y CODGRUP.DBF - SOLUCIONADO
Posted: Mon Dec 30, 2019 12:03 pm
by rterraz
Hola
Despues de mucho probar encontre esto:
La base de datos tiene un indice .CDX construido de esta manera
Ordcreate(".\data\codgrup","ID","codgrup->id")
Ordcreate(".\data\codgrup","DESCR","codgrup->descgrup")
Ordcreate(".\data\codgrup","CODIGO","STR(codgrup->codigo,4)")
Dbusearea(.t.,,'.\data\CODGRUP',,.t.) FUNCIONA PERFECTAMENTE
oDbf := TDatabase():Open( , '.\data\CODGRUP , 'DBFCDX' , .T. ) NO FUNCIONA
Regenero el indice de esta manera:
Ordcreate(".\data\codgrup","ID","_FIELD->id")
Ordcreate(".\data\codgrup","DESCR","_FIELD->descgrup")
Ordcreate(".\data\codgrup","CODIGO","STR(_FIELD->codigo,4)")
Dbusearea(.t.,,'.\data\CODGRUP',,.t.) FUNCIONA PERFECTAMENTE
oDbf := TDatabase():Open( , '.\data\CODGRUP , 'DBFCDX' , .T. ) FUNCIONA PERFECTAMENTE
No se por que pasa esto, teoricamente el indice debería ser igual ?????
De todas manera creo que esto le podria servir a otros a los que les pase algo similar
abrazo
Re: ERROR CON TDATABASE Y CODGRUP.DBF
Posted: Wed Jan 01, 2020 3:10 pm
by nageswaragunupudi
The real problem is to use fieldname with dbfname as alias.
Code: Select all
Ordcreate (".\ Data \codgrup","DESCR", "codgrup->descgrup" )
Problem is to use "codgrup->descgrup". We should never use the dbfname as alias name while creating indexes.
If index is created in this way, the CODGRUP.DBF can never be opened with a different Alias.
For examples
USE CODGRUP SHARED VIA "DBFCDX" // works
USE CODGRUP SHARED VIA "DBFCDX" ALIAS COD // FAILS.
TDatabase always opens with a different alias and so a dbf with this kind of indexes always fails to open.
Next if you want to read the structure of a DBF, without opening the DBF, we can use the FWH function:
This function reads the structure from the raw dbf file without USEing it.
Re: ERROR CON TDATABASE Y CODGRUP.DBF
Posted: Wed Jan 01, 2020 3:31 pm
by nageswaragunupudi
Best way to create indexes, when the DBF is used in exclusive mode:
Code: Select all
function mycreateindexes()
field ID,FIRST,AGE,DATE
INDEX ON ID TAG ID
INDEX ON UPPER(FIRST) TAG FIRST
INDEX ON AGE TAG AGE
INDEX ON DATE TAG DATE
return nil
FWH function FW_CdxCreate() makes the process on indexing easy.
Code: Select all
FERASE( "CUSTOMER.CDX" )
USE CUSTOMER NEW EXCLUSIVE VIA "DBFCDX"
FW_CdxCreate()
CLOSE CUSTOMER
FW_CdxCreate() without any parameters creates indexe tags on all fields. In case of character fields, the index is built on UPPER(fldname)
In addition, it creates an index
This index is used to optimize filters.
Full Syntax:
Code: Select all
FW_CdxCreate( [acTagList], [lMemory] )
Examples:
Code: Select all
FW_CdxCreate( "ID,FIRST,CITY,SALARY" )
Re: ERROR CON TDATABASE Y CODGRUP.DBF
Posted: Thu Jan 02, 2020 2:00 pm
by rterraz
Apreciado Mr. Rao, como siempre Ud. tan atento...
Le agradezco infinitamente su respuesta a mi problema!
Fue muy clara y didáctica, parece mentira que despues de tantos años de trabajar con DBF's me haya enterado de este importante detalle con respecto a la construccion de los CDX.
Por suerte habitualmente uso _FIELD-> los del alias fue solo en algunos pocos lugares y fueron seguramente resabios del viejo Clipper
Ya los modifique en todos los sitios donde encontre el 'bug'
Mi afectuoso saludo y que tenga Ud. un muy buen 2020