FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Amigos del Foro
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Amigos del Foro
Posted: Sat May 23, 2009 06:51 PM
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.
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Amigos del Foro
Posted: Sat May 23, 2009 07:56 PM

Francisco:

Como decia Jack "El destripador" :) vamos por partes.

No sé si esto sea toda la solución, pero hay dos cosas que a mi me "saltan"

1.- En verce no es necesario incluir la LIB DEBCDX.LIB como librería de terceros, basta con activar el check box que hay en el primer folder "Datos generales del proyecto" de tu proyecto, está en la parte inferior.

2.- Al crear un índice cuyo campo sea de tipo DATE es necesario hacerlo usando la función DTOS() y yo utilizo la extensión FIELD->, mira este ejemplo:
INDEX ON FIELD->CAP_MOD+DTOS(FIELD->CAP_FDR) TAG (cIdx1) TO (cAlias) FOR ! DELETED()

3.- Desde luego en la busqueda (DBSEEK()), tambien debes usar la funcíon DTOS()

Ojala estos puntos sirvan para empezar a desatorarte.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Amigos del Foro
Posted: Sat May 23, 2009 10:12 PM
Estimado Armando, muchas gracias por contestar.

Precisamente ya había notado que era el Dtos() el que estaba dando problemas. (siempre utilizo Dtos(), como puedes observar). Al quitarle el Dtos() al codigo IntegIndex( oSay2,oMeter1,oMeter2,oSay3,@nTotReg,;
"dtos(WMDATA->fechemis)","WMDFECHA", aAlias [n] )
, el programa me funciona como antes.

Lo raro es que mi sistema solo me da problemas en ese pedacito de codigo, y lo he vendido de esa forma (NTX) y nunca tuve ningún reclamo desde hace muchos años.

Haciendo incapié en lo raro del comportamiento, si te fijas nunca usé el Dtos() en la busqueda DBSEEK(FI,.T. ) y siempre funcionó con NTXs, no así con CDXs.

Parece que con CDX me falla solamente cuando el indice lo compone UN SOLO CAMPO y este es tipo Date, ya que los demas indices compuestos (incluyendo campos Date) trabajan bien. Qué raro, ¿no?

De todas maneras, quitandole el DTOS() en la creacion de este indice expecíficamente, me trabaja bien.

Tienes toda la razón sobre el VERCE.

Nuevamente gracias.
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Amigos del Foro
Posted: Sat May 23, 2009 10:34 PM

Armando:
Corrijo esto:
De todas maneras, quitandole el DTOS() en la creacion de este indice expecíficamente, me trabaja bien.
Leelo asi:
Agregué el Dtos() al codigo y queda asI: DbSeek(dTos(FI),.T.) .
Saludos

Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql

Continue the discussion