Page 1 of 1

SCOPE + SET FILTER

PostPosted: Mon Feb 23, 2015 8:30 pm
by Andrés González
Estoy realizando pruebas y no logro dar con la rapidez que necesito. Cuando aplico SCOPE la base de datos se limita muy rápido y si luego aplico un SET FILTER en algunas me lo hace rápido y en otras funciona muy lento. Alguien sabe si cuando hago un SET FILTER encima de un SCOPE, lo hace sobre la Base de Datos limitada por el SCOPE o sobre toda la Base de Datos como si no estuviese limitada. El resultado siempre es correcto y lo realizo sobre bases de datos DBF (NTX).

A modo de ejemplo limito con SCOPE a los registros entre dos fechas y luego le pido con SET FILTER que me muestre solo los datos de un usuario. Este ultimo SET FILTER lo hace sobre los datos que se muestran en pantalla (limitados entre fechas) o vuelve a tratar toda la base de datos? En las pruebas va bien pero en ocasiones tarda mucho y en otras va muy rápido. El SCOPE lo aplico cuando cargo la base de datos, por ejemplo dependiendo de un registro de partida de otra base de datos y el filtro lo aplico desde un botón que me coge los datos que escribo con un get y hace el SET FILTER de todos los campos que están filtrados (almenos eso creo). Es cierto o estoy equivocado?

Re: SCOPE + SET FILTER

PostPosted: Mon Feb 23, 2015 11:48 pm
by xmanuel
Primero se procesa el scope sobre el orden activo y luego se evalúa el filtro que se hará sobre cualquier expresión válida. Dependiendo de la complegidad de esa expresión se determinará la velocidad.

Si pudieras pober un ejemplo sería más fácil ayudarte :roll:

Tu vecino...
Manu Expósito

Re: SCOPE + SET FILTER

PostPosted: Tue Feb 24, 2015 1:24 pm
by karinha
Andrés, el mejor és usar INDICE TEMPORAL Super rápido para filtros.

Code: Select all  Expand view

   INDEX ON CAMPO TAG CAMPO TO TMP MEMORY // ADDITIVE
   OrdSetFocus( 1 )
   GO TOP
 


Saludos.


Re: SCOPE + SET FILTER

PostPosted: Tue Feb 24, 2015 5:13 pm
by Andrés González
Gracias Manu, no puedo poner un ejemplo ya que es difícil de entender ya que todo este proceso lo hago con ficheros externos al programa, del tipo:

Code: Select all  Expand view
[BASE]
10;50
entrada.dbf
n:
"ENTRADAS"
21;0;23;60
3;0;20;60
[INDEX]
ENFECEN;FECHA;efecen;date()-365;date();
ENTRADA;AÑO.NUM.;STR(EANOEN,4) + STR(ENUMEN,7)
ENREFEX;REF. EXT.;erefex
ENCODEX;COD.EXTER.;ecodex
ENRFOR;REF.ORD.;STR(ENRFOA,2) + STR(ENRFOR,4)
ENSOLIC;ENSOLIC;ESOLIC
[RELA]
ore;orecod;ecodex;.\dat\
asu;asufcd;ecodex + ecodas;.\dat\


El SCOPE me coge el primer y el ultimo registro que quiero ;date()-365;date() si lo pongo en el indice. En los indices que no tienen el cuarto o quito valor no realiza el SCOPE. En este caso limito los valores al ultimo año, o sea, 365 días menos. Luego aplico el filtro y va rapido pero algunas veces se queda pensando "????". Por eso era la pregunta, pero si se aplica sobre 9000 registros mas o menos que es filtrado del SCOPE eso no deberia pasar por muy compleja que sea el FILTER.

Karinha, es una muy buena idea eso de utilizar indices temporales ya que lo que si hace bien HARBOUR es abrir y cerrar ficheros rápido. Me pongo con ello a ver si mejoro. Gracias

Re: SCOPE + SET FILTER

PostPosted: Tue Feb 24, 2015 9:16 pm
by postinelli
y por que no crear un indice de fechas + usuario ?
y luego crear el scope entre fechas y usuario