Optimizando filtros

Post Reply
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Optimizando filtros

Post 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.
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Re: Optimizando filtros

Post by Loren »

¿ Alguna sugerencia, por favor ?

Gracias.
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Optimizando filtros

Post by karinha »

Hola,

Use ORDSCOPE() ó crea un Indice temporario.

Saludos.
João Santos - São Paulo - Brasil
jcenteno
Posts: 23
Joined: Thu Dec 10, 2009 6:07 am

Re: Optimizando filtros

Post 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
User avatar
RenOmaS
Posts: 205
Joined: Fri Oct 07, 2005 5:07 pm

Re: Optimizando filtros

Post 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 + "'"
Saludos/regards
RenOmaS

skype: americo.balboa
Marcelo Via Giglio
Posts: 1033
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Optimizando filtros

Post by Marcelo Via Giglio »

Hola,

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

saludos

Marcelo
User avatar
acuellar
Posts: 1312
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Optimizando filtros

Post 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
Saludos,

Adhemar C.
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Re: Optimizando filtros

Post 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.
Post Reply