FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Optimizando filtros
Posts: 479
Joined: Fri Feb 16, 2007 10:29 AM
Optimizando filtros
Posted: Tue Apr 27, 2010 07:07 AM
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 (fw): Select all Collapse
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.
Posts: 479
Joined: Fri Feb 16, 2007 10:29 AM
Re: Optimizando filtros
Posted: Tue Apr 27, 2010 03:51 PM

¿ Alguna sugerencia, por favor ?

Gracias.

Posts: 8523
Joined: Tue Dec 20, 2005 07:36 PM
Re: Optimizando filtros
Posted: Tue Apr 27, 2010 03:56 PM

Hola,

Use ORDSCOPE() ó crea un Indice temporario.

Saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 23
Joined: Thu Dec 10, 2009 06:07 AM
Re: Optimizando filtros
Posted: Tue Apr 27, 2010 04:33 PM

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

Posts: 205
Joined: Fri Oct 07, 2005 05:07 PM
Re: Optimizando filtros
Posted: Tue Apr 27, 2010 07:03 PM
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
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Optimizando filtros
Posted: Tue Apr 27, 2010 07:42 PM

Hola,

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

saludos

Marcelo

Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Optimizando filtros
Posted: Tue Apr 27, 2010 09:57 PM
Loren usa OrdScope con Filter
Indexá por número
Code (fw): Select all Collapse
*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 dos campos en el indice ya sea numero y fecha ó numero y cliente ó por último los tres y solo usas OrdScope.

Saludos

Adhemar
Saludos,



Adhemar C.
Posts: 479
Joined: Fri Feb 16, 2007 10:29 AM
Re: Optimizando filtros
Posted: Tue May 04, 2010 12:23 PM

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.

Continue the discussion