Page 1 of 1

Optimizando filtros

Posted: Tue Apr 27, 2010 7:07 am
by Loren
Compañeros,

Estoy actualizando un proyecto que escribí hace más de 10 años e intentando optimizar los filtros ya que mi cliente me comenta que se ralentiza muchísimo cuando trabaja en red local.

El proyecto trabaja con DBF + NTX + ADS. El problema lo tengo con los filtros, que por entonces (hace más de 10 años) abusé de ellos y ahora me están "pasando factura".

Filtros de tipo:

Code: Select all

set filter to albaclie->numero=nNUMALB .and. albaclie->fecha=dFECHA .and. albaclie->cliente=cCODCLI ; go top
estoy intentando optimizarlos a fin de mejorar los tiempos de espera, mediante:
cfiltr=¿? --> aquí tengo la duda, porque no consigo armar la "cadena" para crear el filtro porque existen campos numér,date y caracteres bfiltr="{||"+cfiltr+"}"
dbsetfilter(&bfiltr,cfiltr)

o bien mediante
albaclie->( AdsSetAOF( cfiltr ) )

¿ Sabeis como armar la cadena "cfiltr" teniendo en cuenta que existen campos numéricos, date y caracteres ?

Mil gracias.
LORENZO.

Re: Optimizando filtros

Posted: Tue Apr 27, 2010 3:51 pm
by Loren
¿ Alguna sugerencia, por favor ?

Gracias.

Re: Optimizando filtros

Posted: Tue Apr 27, 2010 3:56 pm
by karinha
Hola,

Use ORDSCOPE() ó crea un Indice temporario.

Saludos.

Re: Optimizando filtros

Posted: Tue Apr 27, 2010 4:33 pm
by jcenteno
Loren,

SWITCH uVal
CASE "C"
cString += CHR(34)+UPPER(ALLTRIM(aGet[1,2]))+CHR(34); EXIT
CASE "N"
cString += STR(aGet[1,2],,,.t.) ; EXIT
CASE "D"
cString += "CTOD("+'"'+DTOC(aGet[1,2])+'")' ; EXIT
CASE "L"
cString += "."+ALLTRIM(aGet[1,2])+"."
END

IF ! HB_IsNull( cString ) //! EMPTY( cString )
cFilter := "'"+cString+"'"
TRY
(aFAlias[1,2])->( DbSetFilter( {||&cString}, cFilter ) )
CATCH oErr
lOk := FALSE
? "Caught:", oErr:Description
MsgInfo("Error de sintaxis, favor corrija")
oErr:Description
END
ENDIF

Espero te sirva.

Saludos. Jairo

Re: Optimizando filtros

Posted: Tue Apr 27, 2010 7:03 pm
by RenOmaS
set filter to albaclie->numero=nNUMALB .and. albaclie->fecha=dFECHA .and. albaclie->cliente=cCODCLI ; go top

cfiltr= "numero = " + Alltrim( Str( nNUMALB ) ) + " .and. fecha = " + DtoC( dFECHA ) + " .and. cliente = '" + cCODCLI + "'"

Re: Optimizando filtros

Posted: Tue Apr 27, 2010 7:42 pm
by Marcelo Via Giglio
Hola,

puedes utilizar SQL de ADS que internamente hace uso de los filtros

saludos

Marcelo

Re: Optimizando filtros

Posted: Tue Apr 27, 2010 9:57 pm
by acuellar
Loren usa OrdScope con Filter
Indexá por número

Code: Select all

*set filter to albaclie->numero=nNUMALB .and. albaclie->fecha=dFECHA .and. albaclie->cliente=cCODCLI ; go top

OrdScope(0,nNUMALB);OrdScope(1,nNUMALB)
ALBACLIE->( dBSetFilter( { || (ALBACLIE->fecha=dFECHA  .AND. albaclie->cliente=cCODCLI ) } ) )
DbGoTop()
 
Si sigue lento asocia _ en el indice ya sea numero y fecha ó numero y cliente ó por último los tres y solo usas OrdScope.

Saludos

Adhemar

Re: Optimizando filtros

Posted: Tue May 04, 2010 12:23 pm
by Loren
Compañeros,

aunque con mucho retraso, pero encontré la solución para combiar campos Numeric,Date y Character en un mismo filtro:

AdsClearAof()
cfiltr='alltrim(str(numalb))="'+alltrim(str(albaclie->numero))+'" .and. fecha="'+dtoc(albaclie->fecha)+'" .and. codcli="'+alltrim(albaclie->cliente)+'"'
albaran->(AdsSetAOF( cfiltr )) ; go top

Dando gracias a todos los compañeros que han aportado una luz a mis dudas, saluda
LORENZO.