ayuda filtros y mas filtros ...

ayuda filtros y mas filtros ...

Postby Francisco Horta » Mon Sep 03, 2007 5:19 pm

Hola foro,
por aqui tengo varias dudas que me asaltan:

1. Tengo una dbf con indice "fecha", filtro esa dbf con rango de fechas usando ORDSCOPE(), ej:
miDbf->(ordscope(0,dtos(fecha1)))
miDbf->(ordscope(1,dtos(fecha2)))
bueno pero aqui viene la duda, puedo meter otro ordscope() para subfiltrar aunque por el campo que lo quiero filtrar no sea indice?

2. Tengo una dbf temporal con 2000 registros, quiero hacer una opcion donde pueda elegir: los 10 mas vendidos, los 20 mas vedidos, los 50 mas vendidos, los 100 mas vendidos y "todos" y unicamente mostrar lo opcion seleccionada, como hacerlo? esto para saber de mi catalogo cuales son los que mas vendo...

gracias
salu2
paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby Carlos Mora » Mon Sep 03, 2007 7:23 pm

Paco,

No, no se puede. El scope actua cambiando los límites de las claves del índice. En lugar de usar la primera del índice usa la que tu pusiste como top, y lo mismo para el bottom.

Combinarlo no es posible. Aun así, la perfomance del filtro depende si el primer scope ya filtró lo suficiente.
Un punto: segun escribes el indice es fecha, es decir del tipo 'D', pero en el scope usas DtoS, que es del tipo 'C'. Ojo con eso. Cual es la clave del indice? Por ahí si la clave es del tipo char (DTOS) no importaría agregar otro campo más. Por ejemplo, si fuese un diario de una contabilidad, lo tienes indexado por cuenta seguro. Pero no lastima que en lugar de tener un indice solo por cuenta lo indexes por cuenta + dtos(fecha), ya que te sigue sirviendo para hacer seeks de cuentas y ademas te sirve para hacer los mayores, por ejemplo.

Un saludo,

Carlos.
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby Armando » Mon Sep 03, 2007 10:25 pm

Paco:

Todo depende de lo que quieras obtener, vamos a ver un pequeño ejemplo, supongamos que tenemos esta DBF con dos campos cuyo
índice es el campo MODELO

MODELO DESCRIPCION
5499 BABY DOLL
5500 BABY
5504 BABY DOLL
5505 BABY
5670 BABU DOLL

Ahora bien, como tu sabes la función ORDSCOPE() trabaja sobre el índice así que si metemos el siguiente código:

(cModelo)->(ORDSCOPE(0,"5500 "))
(cModelo)->(ORDSCOPE(1,"5505 "))
(cModelo)->(DBGOTOP())

Nos esta limitando la vista a solo los tres modelos intermedios, 5500, 5504 y 5505, los modelos 5499 y 5670 quedan fuera.

Ahora si despues del scope metemos un filtro como el siguiente

(cModelo)->(DBSETFILTER( { | | LEFT((cModelo)->MOD_DES,9) == "BABY DOLL"},;
"LEFT((cModelo)->MOD_DES,9) == 'BABY DOLL'" ) )

Que crees que pase ?, pues que solo veremos el modelo 5504 y no se incluyen los modelos 5499 y 5670 que tambien cumplen con el filtor, por qué ?, pues porque el ORDSCOPE sigue siendo válido.

En cuanto a la segunda pregunta, creo que te conviene crearle un índice descendente a la DBF temporal y despues solo listas los registros solicitados.

Saludos
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

Postby Francisco Horta » Tue Sep 04, 2007 2:43 pm

Carlos, perfectamente entendido, si mi campo fecha la convierto en el indice a dtos, hare algunas pruebas.
Armando, si habia pensado en algo asi, aqui la cuestion seria la lentitud que pudiera tener el dbsetfiler al tener muchooooos registros, no se tal vez 500,000, pero lo probare.
Me salta otra duda, como puedo filtrar de una dbf cierta cantidad de registros? o sea que sea por el no. de registro en la dbf, no por campo.
salu2
paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 12 guests