Problema con set filter como campos caracter VFP 9

1,461 views
Skip to first unread message

CRBV

unread,
Oct 2, 2012, 9:06:15 AM10/2/12
to publice...@googlegroups.com
Buenos dias, tengo un problema raro en una tabla tengo un campo caracter por el cual quiero
filtar registros, algo super sencillo y no lo puedo hacer funcionar, esto es lo que realizo
 
en un formulario tengo dos text definidos como caracter ingreso los valores
en el boton aceptar tengo este codigo
 
select minutas
index on m_fecha to mfecha
set filter to m_periodo >= ThisForm.text1.value and m_periodo <= ThisForm.text2.value
 
el objetivo es filtrar movimientos por periodos contables, pero hay algo que me termina
por desconsertar, si yo busco un solo periodo digamos 012012 al 012012 funciona bien
pero si por ejemplo 012012 al 082012 muestra todos los registro de la tabla.
 
Esto esta en VFP 9.0 SP2 con tabla y BD nativas.
 
Desde ya muchas gracias por sus comentarios.
 
Carlos Veron
 

Luis Maria Guayan

unread,
Oct 2, 2012, 9:27:18 AM10/2/12
to publice...@googlegroups.com
Tienes varios errores conceptuales.

1) Generas el índice cada vez que ejecutas el filtro. El índice ya debe existir en tu tabla.

2) Cuando trabajes con fechas siempre es mejor que el campo sea tipo DATE o DATETIME

3) Cuando conviertas fechas en texto, para no tener problemas con el ordenamiento el formato debe ser AAAAMM (Año+Mes) ó AAAAMMDD (Año+Mes+Dia). 

 
Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________



 

--
 
 
 

Guillermo Gimenez

unread,
Oct 2, 2012, 9:32:30 AM10/2/12
to publice...@googlegroups.com
Buen día, de seguro te van a llover comentarios como: "NOOOOO, no uses Set Filter!!... usa sentencias SQL, son mas rapidas, son mas faciles de controlar, etc etc" y sabes que? tienen razón...
Solo que yo veo un error en el concepto de Períodos... por ejemplo: 012009 (ene 2009) es mayor que 122008 (dic 2008) viéndolo como meses, pero viéndolo como numero (o caracteres) 012009 es menor que 122008, por lo que te recomiendo que guardes primero el año y luego el mes en la cadena periodo... con eso se solucionar lo del filtro... peeeeeeeero... no es recomendable el uso de Set Filter... Saludos


Guille 

--- El mar 2-oct-12, CRBV <carlos...@arnet.com.ar> escribió:
--
 
 
 

Fox Learner

unread,
Oct 2, 2012, 9:55:42 AM10/2/12
to publice...@googlegroups.com
La otra recomendación que escucharás muchas veces por aquí será que dejes de usar SET FILTER y en su lugar utilizar las clausulas SELECT.

Y También no olvides que después de usar un filtro, al final tienes que volver el filtro a su condición original con SET FILTER TO.

En mi caso, para ese tipo de cosas prefiero usar la función BETWEEN(), la cual establece un rango entre 2 fechas. Ejemplo con una condición adicional al rango de fechas:

Evento Load()
CLOSE DATA
USE Minutas IN  0. (El indice se abre automáticamente al poner en uso la tabla)

Evento Init()
THISFORM.GRID1.VISIBLE=.F.
THISFORM.TXTFECHADESDE.VALUE={} (Los corchetes inicializan el dato como tipo fecha)
THISFORM.TXTFECHAHASTA.VALUE{}

* Fox controlará fechas inválidas de forma automáticas como un 30 de febrero.

Evento KeyPress()


SELECT Minutas
Set order to mfecha  (Activas la etiqueta de orden del índice)

A=THISFORM.TXTFECHADESDE.VALUE (Metemos las referencias a una variable privada para mejorar la legibilidad del código)
B=THISFORM.TXTFECHAHASTA.VALUE
XCondicion=ALLTRIM(THISFORM.combodato.VALUE)


IF LASTKEY()=13
NODEFAULT  (Para que no se escriba en la pantalla un caracter extraño)
*THIS.SetFocus()

IF A<=B


SET FILTER TO BETWEEN(CampoFecha,A,B) AND ALLTRIM(CampoX) = ALLTRIM(XCondicion)
GO TOP

IF EOF() (El grid estaba vacío porque no hay datos que mostrar)
WAIT WINDOW 'NO SE LOCALIZO NINGUN DATO EN LAS FECHAS INDICADAS' AT 14,60 TIMEOUT 2

THISFORM.GRID1.VISIBLE=.F.
THISFORM.cmdagregar.SetFocus()

ELSE

THISFORM.GRID1.VISIBLE=.T.
Thisform.GRID1.click()
THISFORM.GRID1.SETFOCUS()
THISFORM.GRID1.column1.text1.SETFOCUS()

ENDIF


ELSE
WAIT 'EL PERIODO NO ES CORRECTO' WINDOW AT 14,60 TIMEOUT 2
THIS.Value={}
Thisform.txtFechaDesde.SetFocus()


ENDIF

ENDIF

Saludos!

CRBV

unread,
Oct 2, 2012, 10:02:50 AM10/2/12
to publice...@googlegroups.com
Si realmente para este caso meti la pata en varias cosas. 
   Bueno desde ya muchas gracias por sus comentarios y ayuda.
 
   Saludos
 

Walter R. Ojeda Valiente

unread,
Oct 2, 2012, 5:14:19 PM10/2/12
to publice...@googlegroups.com
Primero, usar SET FILTER no es conveniente, es preferible usar SELECT en su lugar.

Segundo, las fechas puedes ordenarlas con la función DTOS() para asegurarte que los resultados sean los correctos. Te quedaría así:

SELECT MINUTAS
INDEX ON DTOS(M_FECHA) TO MFECHA
SET FILTER TO DTOS(M_PERIODO) >= DTOS(THISFORM.TEXT1.VALUE) AND DTOS(M_PERIODO) <= DTOS(THISFORM.TEXT2.VALUE)

Saludos.

Walter.




Date: Tue, 2 Oct 2012 06:06:15 -0700
From: carlos...@arnet.com.ar
To: publice...@googlegroups.com
Subject: [vfp] Problema con set filter como campos caracter VFP 9
--
 
 
 

acmc

unread,
Oct 3, 2012, 12:02:35 AM10/3/12
to publice...@googlegroups.com
Pues yo en lo personal no suelo usar set filter.. mas bien creo indices utilizo set near on para posicionarme en el registro mas cercano al periodo inicial y a partir de ahí empiezo a leer con un do while mientras el campo fecha se menor al periodo final

Salu2!!

Walter R. Ojeda Valiente

unread,
Oct 3, 2012, 12:27:09 AM10/3/12
to publice...@googlegroups.com
Esa es una mejor alternativa cuando las tablas son grandes, en tablas pequeñas  (menos de unos 50.000 registros) se puede usar SET FILTER sin una caída notoria en la performance pero SET FILTER tiene otros problemas, por lo cual no se recomienda utilizarlo.

Saludos.

Walter.





Date: Tue, 2 Oct 2012 21:02:35 -0700
From: impre...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Re: Problema con set filter como campos caracter VFP 9
--
 
 
 

Jairo Miranda

unread,
Oct 3, 2012, 9:17:24 AM10/3/12
to publice...@googlegroups.com

Es mejor utilizar las sentencias de SELECT SQL

TE envio unos ejemplos

 

Ejemplos

Los siguientes ejemplos ilustran la utilización de las funciones definidas por el usuario con SELECT - SQL:

Ejemplo 1

En el ejemplo 1 se muestran los nombres de todas las compañías en customer (un campo de una tabla).

CLOSE ALL

CLOSE DATABASES

OPEN DATABASE (HOME(2) + 'data\testdata')

SELECT customer.company ;

   FROM customer

Ejemplo 2

El ejemplo 2 muestra el contenido de tres campos de dos tablas y combina las dos tablas basándose en el campo cust_id. Utiliza alias locales para ambas tablas.

CLOSE ALL

CLOSE DATABASES

OPEN DATABASE (HOME(2) + 'data\testdata')

SELECT x.company, y.order_date, y.shipped_on ;

   FROM customer x, orders y ;

   WHERE x.cust_id = y.cust_id

Ejemplo 3

El ejemplo 3 muestra únicamente registros con datos únicos en los campos especificados.

CLOSE ALL

CLOSE DATABASES

OPEN DATABASE (HOME(2) + 'data\testdata')

SELECT DISTINCT x.company, y.order_date, y.shipped_on ;

   FROM customer x, orders y ;

   WHERE  x.cust_id = y.cust_id

Ejemplo 4

El ejemplo 4 muestra los campos country, postalcode y company en orden ascendente.

CLOSE ALL

CLOSE DATABASES

OPEN DATABASE (HOME(2) + 'data\testdata')

SELECT country, postalcode, company ;

   FROM customer ;

   ORDER BY country, postalcode, company

Ejemplo 5

El ejemplo 5 almacena el contenido de los campos de dos tablas en una tercera tabla.

CLOSE ALL

CLOSE DATABASES

OPEN DATABASE (HOME(2) + 'data\testdata')

SELECT x.company, y.order_date, y.shipped_on ;

   FROM customer x, orders y ;

   WHERE x.cust_id = y.cust_id ;

   INTO TABLE custship.dbf

BROWSE

 

JM

--
 
 
 

Jose Mario

unread,
Oct 4, 2012, 1:19:16 PM10/4/12
to publice...@googlegroups.com
hace lo que dice don walter y don luis, por eso son los expertos

fe1=thisform.txtfechai.value
fe1=thisform.txtfechaf.value

SELECT SUM(comisim) as comi;
FROM movinota;
WHERE fecha between fe1 AND fe2 AND ! DELETED();
INTO CURSOR tmp

set filter no funciona, yo pase 3 dias buscando un error
lo que paso es que no volvi a dejar la tabla como tal 
y se quedo con el filter que necesitaba
set filter to a=b, y asi quedo y tenia que volverlo a estado natural
set filter to
Reply all
Reply to author
Forward
0 new messages