Amigos del Foro

Amigos del Foro

Postby FranciscoA » Sat May 23, 2009 6: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
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Amigos del Foro

Postby Armando » Sat May 23, 2009 7: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
User avatar
Armando
 
Posts: 3061
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Amigos del Foro

Postby FranciscoA » 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
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Amigos del Foro

Postby FranciscoA » 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
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 78 guests