Page 1 of 1

off topic : filtro aof() sobre fecha

Posted: Tue Jan 03, 2006 9:24 pm
by astursoft
como se hace un filtro aof sobre fecha ?
supongamos :

Code: Select all

dfecha:=date()-90
cfiltro:="facturas->fecha >="+dtoc(dfecha)
bfiltro:=&("{||"+cfiltro+"}" )
facturas->(dbsetfilter(bfiltro,cfiltro))
no me funciona en xharbour y ads , ¿donde está el fallo ?

Posted: Thu Jan 05, 2006 12:05 am
by R.F.
Claro que no funciona

las fechas dentro del DBF se almacenan como aaaammdd (no existen los separadores)

Para que un campo fecha quede indexado correctamente siempre se debe indexar sobre DTOS(campo fecha)

Tu problema consiste en que la conversion para el filtro esta mal hecha

Debe ser

Code: Select all

dfecha:=date()-90
cfiltro:="facturas->fecha >="+ DTOS(dfecha)//<--- cambia aqui
bfiltro:=&("{||"+cfiltro+"}" )
facturas->(dbsetfilter(bfiltro,cfiltro)) 

Posted: Sat Jan 07, 2006 1:18 pm
by astursoft
Siempre se aprende algo nuevo :D :D
De momento la solución de cambiar los indices a dtos(dFecha) , no es viable , por compatibilidad ( programas clipper de años atras ) , pero lo he resuelto
asi

Code: Select all


dfecha:=date()-90
cfiltro:="facturas->fecha >=ctod('"+dtoc(dfecha)+"')"
bfiltro:=&("{||"+cfiltro+"}" )
facturas->(dbsetfilter(bfiltro,cfiltro)) 
funcionar funciona, pero no se si con filtro aof optimizado .
Gracias por el tip anterior pues lo tendre en cuenta de ahora en adelante .
Saludos

Posted: Sat Jan 07, 2006 10:16 pm
by R.F.
Jejeje, pues va a ser que no es un AOF.

Recuerda: lo que estás haciendo es un FILTRO, no un SCOPE, por lo tanto puedes utilizar el DTOS() tranquilamente en vez del DTOC(), ten en cuenta que el FILTRO no requiere del INDICE para nada.

Si estuvieras haciendo SCOPE, entonces si tendrias que tener indexado sobre DTOS, pero como no lo es, el truco del DTOS() en la expresion te vale para filtrar correctamente.

Posted: Sun Jan 08, 2006 8:55 am
by astursoft
Rene , pues con dtos(dfecha) no me funciona el filtro ¿? :( :( , me sale que no existen resultados para la expresion (hago un dbgotop() , y el registro es el eof() ) .
Por otra parte revisando la ayuda de advantage en la seccion aof encontre esto :

For example, consider the filter expression:

hiredate > CTOD(‘1/19/90’) .OR. ( hiredate > CTOD(‘1/18/85’) .AND. deptnum = 15)

If field "hiredate" is indexed and field "deptnum" is not, the expression will be partially optimized. Each simple expression involving field "hiredate" will be fully optimized but the simple expression involving field "deptnum" will not be optimized. The expression can be viewed as:

Full .OR. (Full .AND. Not Optimized)

según lo que pone parece como que en este caso los indices no fueran dtos(dfecha) , y pone que está optimizado ¿? .

:shock: :shock:
Sigo sin aclararme demasiado .
saludso y gracias por perder el tiempo conmigo.