filtros con scopes..

filtros con scopes..

Postby Francisco Horta » Sat Oct 21, 2006 3:42 pm

tengo una dbf con mas de 300,000 registros y quiero hacer filtros por muchos campos, probe el setfilter pero es muy lento, he hecho scopes con el campo como llave y va muy bien, mi pregunta es:
es necesario tener el indice por el scope que se necesita para hacer el filtro? o que me recomiendan para hacer multi-filtros rapidos?
salu2
gracias
Paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby R.F. » Sat Oct 21, 2006 6:04 pm

Hay 2 formas la primera es aplicar el SCOPE y luego un filtro sobre el scope, lo cual resulta mucho mas rapido porque hay que filtrar menos datos, pero de entrada, siempre es necesario que exista un indice para poder "scopear".

Lo que yo hago, es hacer multiples indices con multiples llaves para hacer "multi-filtros" como tu los llamas, ya que capacidad de un CDX es de hasta 50 indices por archivo, tengo DBFs que tiene mas de 35 ordenes en cada CDX, basado en combiancines de campos y clauslas restrictivias (INDEX ON campo+otrocampo+ campo TAG nombre FOR condicion)y funcionan bastante bien. Eso cuando tengo que trabajar con CDX puros y duros.

Cuando trabajas con ADS puedes utilizar Queries de SQL que funcionan alucinamente bien, o bien los famoso AOF (Advantage Optimized Filters) que son filtros sumamente eficientes y super rapidos basados en la funcion DBSETFILTER
Saludos
R.F.
R.F.
 
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Postby Francisco Horta » Sat Oct 21, 2006 11:36 pm

bien explicado rene, a trabajar con muchos indices...
salu2
paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby Biel EA6DD » Sun Oct 22, 2006 9:14 am

Yo hago algo parecido, monto unos cuantos indices. Cuando voy a filtrar, segun los datos que me han introducido elijo el filtro que creo que me va a devolver menor numero de registros despues de hacer un scope.( si tengo indice por fecha e indice por cliente, si quieren filtrar por cliente y fecha, cojo scope de cliente que casi seguro es mas pequeno que por fecha), y sobre el resultado si me quedan campos para filtrar, creo un indice custom. Con el indice custom siempre sera mas rapido para manipular el resultado(browse, listados,...) que no con un filtro. Un filtro evalua el codeblock de filtro por cada registro, con el indice custom, solo una vez al crearlo.
Cada inidice adicional, hace que sea mas lento los procesos de acutlizacion de la tabla, aunque CDX es muy rapido, lo importante es encontrar un buen equilibrio(como todo en la vida).
Esa es la opinion de un novato(cada dia intento aprender mas, pero todavia me queda mucho).
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Postby Armando » Mon Oct 23, 2006 12:21 am

Paco:

Por no dejar podrías probar sin tener que hacer ningun SCOPE ni FILTER, por ejemplo si quiero leer el detalle de una factura cuyo índice esta formado por dos campos DET_FAC + DET_PRO (Número de factura y código del producto facturado) hago lo siguiente:

(cDetFac)->(DBSEEK((cHdrFac)HDR_FAC))
// El puntero se coloca en el primer registro del detalle de la factura
DO WHILE (cDetFac)->(! EOF()) .AND.;
(cDetFac)->DET_FAC == (cHdrFac)->HDR_FAC
.....
..... // Resto del código para listar el detalle
.....
(cDetFac)->(DBSKIP())
ENDDO

Evidentemente esto no te libera de tener los TAG necesarios, pero como bien explicó el Master René, eso no es mayor problema.

Un Abrazo, Armando
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: 3184
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 42 guests