FoxPro/Visual FoxPro - Ayuda Set Filter & Grid

 
Vista:
Imágen de perfil de Marco

Ayuda Set Filter & Grid

Publicado por Marco (1 intervención) el 27/05/2015 22:55:51
Estoy haciendo unas prácticas y debo hacer una forma donde pueda buscar los libros que ya tengo registrados. Me recomendaron utilizar en nKeyCode con Set Filter pero no sé muy bien cómo utilizar estos dos.
Mis variables son autor - nombrel - genero - exi

Mi forma es así:

1

Y el código que tengo dentro del text1 es así:

2

No sé qué hacer a partir de ahí, por favor ayúdenme.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Ayuda Set Filter & Grid

Publicado por Fidel José (558 intervenciones) el 28/05/2015 00:08:13
El keypress para esa finalidad es un poco complicado, aunque se puede usar.
Lo que normalmente se utiliza es el Evento InteractiveChange, de donde no necesitas construir una cadena de búsqueda porque tomas la que se escribió.
Por otra parte, te conviene utilizar una propiedad del formulario para evitar que el SET FILTER se te vaya de alcance y te aparezca un error de variable indefinida. La propiedad la puedes agregar en el diseñador de formularios. También por código, por ejemplo, Addproperty(thisform,"miFiltro","")
*<InteractiveChange Event>
thisform.miFiltro=alltrim(this.value)
SELECT TablaLibros
IF EMPTY(THISFORM.FILTRO)
SET FILTER TO
ELSE
SET FILTER TO NOMBREL=THISFORM.FILTRO
ENDIF
GO TOP
THISFORM.GRID1.REFRESH

De todos modos te comento que eso es solo para tu práctica.

Si quieres o necesitas aprender Visual Fox, lo mejor es olvidarse de SET FILTER (que solamente resulta utilizable en tablas locales y cursores) y aprender SELECT SQL.
Por ejemplo, qué tal si el cliente no recuerda el nombre completo de un libro. Te dice, por ejemplo, "busco un libro, no sé bién el título, algo de Venas Abiertas". Entonces el SET FILTER no te servirá de nada. En cambio, en la instrucción LIKE del comando SELECT SQL en la cláusula WHERE puedes poner que busque "Venas" en donde fuere dentro del campo.

1
2
3
4
5
6
7
8
lcBusca = "Venas"
lcString =Chr(37)+lcBusca+Chr(37)
SELECT * FROM LIBROS WHERE nombrel LIKE lcString INTO CURSOR CURBUSCA
IF _TALLY > 0
         BROWSE
ELSE
        Messagebox("Nada parecido")
ENDIF
Este modo de trabajar, te obligará a replantear la asociacion de un cursor al grid. Lo que hacemos, normalmente, es crear un cursor en el LOAD del form con la estructura que se terminará mostrando.
*<LOAD>
&& esto crea un cursor vacío con la estructura de la tabla "LIBROS"
SELECT * FROM LIBROS WHERE .F. INTO CURSOR curGeneral READWRITE

*<INIT> && o mejor, en un método que se ejecute en el Init del form.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
WITH thisform.grilla
	.REcordSource="curGeneral"
	.columncount=4
	.deletemark=.f.
	.ScrollBars=2
	.Setall("Readonly",.t.,"Column")
	.Setall("Fontsize",8,"Column")
	.Setall("Fontsize",8,"Header")
	.Setall("FontBold",.t.,"Header")
	WITH .Columns(1)
		.Header1.Caption="Autor"
		.ControlSource="curGeneral.autor"
		.width = 200
	ENDWITH
	WITH .columns(2)
		.header1.caption="Nombre del Libro"
		.ControlSource="curGeneral.nombrel"
		.width = 300
	ENDWITH
	WITH .columns(3)
		.header1.Caption="Género"
		.controlSource="curGeneral.genero"
		.width = 100
	ENDWITH
	WITH .columns(4)
		.header1.Caption="Existencia"
		.controlSource="curGeneral.exi"
		.InputMask="999,999"
		.Format="Z"
		.WIDTH = 80
	ENDWITH
ENDWITH

En el textbox de búsqueda, evento InteractiveChange
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT curGeneral
ZAP
thisform.grilla.refresh
 
lcBusca = alltrim(this.value)
lcString =Chr(37)+lcBusca+Chr(37)
SELECT * FROM LIBROS WHERE nombrel LIKE lcString INTO CURSOR CURBUSCA
IF _TALLY > 0
       select curGeneral
       APPEND FROM DBF("curBusca")
       go top
      Thisform.Grilla.Refresh
      Thisform.grilla.SetFocus
ELSE
        Messagebox("Nada parecido")
ENDIF
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Set Filter & Grid

Publicado por Gabriel Benitez Villaverde (1 intervención) el 03/11/2017 01:21:12
Quieres que el el grid vaya modificandose conforme digites caracteres?, prueba lo siguiente

1
2
3
4
5
6
7
8
9
10
11
12
x=alltrim(thisform.text7.Value)
x=UPPER(x)
X1=UPPER(x)
Thisform.Refresh
select tutabla
if empty(X1)
	SET FILTER TO
else
	SET FILTER TO X1$tutabla.campo
endif
go top
Thisform.Grid1.Refresh
puede que sobre una variable, lo acabo de terminar, ojala te sirva
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 313
Bronce
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Ayuda Set Filter & Grid

Publicado por Jose Francisco (166 intervenciones) el 11/09/2018 15:01:59
Hola estimados, estuve probando éste último ejemplo , lo único que cuando termina de filtrar y bajo el mouse, me da el siguiente error :
No existe la variable x1. (el código está en el texto8 en interactivechange.

Adjunto código y foto con el error:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
x=alltrim(thisform.texto8.Value)
x=UPPER(x)
x1=UPPER(x)
Thisform.Refresh
select XPELU
if empty(x1)
 
	SET FILTER TO
ELSE
 
	SET FILTER TO x1$xpelu.intervin
 
ENDIF
 
go top
Thisform.Grid5.Refresh
Thisform.Grid6.Refresh
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar