Amigos:
Durante mas de 10 años desarrollé sistemas basados en el rdd NTX y jamás tuve problemas con el siguiente codigo que les presento. Hoy he tratado inútilmente, por mas de 6 hrs, y no me funciona utilizando los famosos DBFCDX.
La función original (insignificante, por cierto), es la siguiente:
//-----------------------
Function ImporWmd(fi,ff)
local cFicTemp:="TEMPO"
dbSelectArea("wmdata")
DbsetOrder(5) // por FECHA
DBSEEK(FI,.T. )
__dbCopy( (cFicTemp), { },, {|| field->fechemis>=fi .AND. field->fechemis<=ff },,, .F., )
WMDATA->(DbSetOrder(1))
SysRefresh()
Return nil
Uso el VERCE y he agregado en lib de terceros DBFCDX.LIB de xHabour 1.10
Aquí están los cambios usando DBFCDX
//-----------------------
Function ImporWmd(fi,ff)
local cFicTemp:="TEMPO"
dbSelectArea("wmdata")
OrdSetFocus(5) // por FECHA
if !wmdata->( DBSEEK(FI,.T.) )
msginfo("Que pasa?") //no encuentra nada, y existen datos de esa fecha
endif
__dbCopy( (cFicTemp), { },, {|| field->fechemis>=fi .AND. field->fechemis<=ff },,, .F., )
WMDATA->(OrdSetFocus(1))
SysRefresh()
Return nil
Al inicio del programa principal tengo:
EXTERN DBFCDX
REQUEST DBFCDX
//----------------------------------------------------------------------//
function Main()
local oBar, Logo, oCur, oIco, oFont, oFont2, hDll
LOCAL oBmp
local oDlg
RDDSETDEFAULT( "DBFCDX" )
....
....
Asi creo los indices CDX:
//---------------------------------------------
Function Indexar(aAlias)
IF UPPER( aAlias[n] )="WMDATA"
IntegIndex( oSay2,oMeter1,oMeter2,oSay3,@nTotReg,;
"WMDATA->numdoc","WMDATDCT", aAlias [n] )
IntegIndex( oSay2,oMeter1,oMeter2,oSay3,@nTotReg,;
"WMDATA->cta+WMDATA->scta+WMDATA->sscta+WMDATA->ssscta+WMDATA->sssscta+dtos(WMDATA->fechemis)","WMDATCTA", aAlias [n] )
IntegIndex( oSay2,oMeter1,oMeter2,oSay3,@nTotReg,;
"dtos(WMDATA->fechemis)+str(WMDATA->numdoc)","WMDATFEC", aAlias [n] )
IntegIndex( oSay2,oMeter1,oMeter2,oSay3,@nTotReg,;
"WMDATA->TD+STR(WMDATA->NUMDOC)","WMDOCTIP", aAlias [n] )
IntegIndex( oSay2,oMeter1,oMeter2,oSay3,@nTotReg,;
"dtos(WMDATA->fechemis)","WMDFECHA", aAlias [n] )
Return nil
//----------------------------------------------------------------
Function IntegIndex( oSay2,oMeter1,oMeter2,oSay3,nTotReg,Campos,cNombIndice, cAlias )
oSay2:SetText( "Integrando Indice " + cNombIndice )
**oMeter1:nTotal = RecCount()
oMeter1:SetRange(0,RecCount())
INDEX ON &(Campos) TAG &(cNombIndice) TO &(cAlias) ; //Todos lo indices de una misma dbf en una bolsa con el nombre de la dbf
EVAL( oMeter1:SetPos( RecNo() ),oMeter2:SetPos(nTotReg+RecNo()), oSay3:SetText( "Registros Indexados: "+Transform(nTotReg+RecNo(),"99,999,999") ), SysRefresh() )
nTotReg+=RecCount()
Return nil
Asi abro las dbfs, y lo hago una soloa vez, al inicio:
DBUSEAREA(.T.,,"WMDATA","WMDATA",.T.)
IF !NETERR()
DBSETINDEX("WMDATA")
ENDIF
¿Pueden ayudarme a descubrir qué es lo que estoy haciendo mal?
De antemano, muchas gracias.