Page 1 of 1
ayuda filtros y mas filtros ...
Posted: Mon Sep 03, 2007 5:19 pm
by Francisco Horta
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
Posted: Mon Sep 03, 2007 7:23 pm
by Carlos Mora
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.
Posted: Mon Sep 03, 2007 10:25 pm
by Armando
Paco:
Todo depende de lo que quieras obtener, vamos a ver un pequeño ejemplo, supongamos que tenemos esta DBF con _ 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
Posted: Tue Sep 04, 2007 2:43 pm
by Francisco Horta
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