FoxPro/Visual FoxPro - Ayuda con busqueda

 
Vista:

Ayuda con busqueda

Publicado por Many (1 intervención) el 23/09/2012 17:30:18
Saludo todos,

Retomando un problema que ya tenía avanzado espero el mismo apoyo de siempre.

En un formulario de facturación debo hacer búsquedas constantes a medida que el usuario va facturando, estoy en foxpro 9 pero en foxpro 2.6 DOS lo hacia con un browse, brow for alltrim(nombre) = alltrim(m.nombre) o con un select.

Aquí en visual foxpro 9 de esta forma funciona pero no se ve muy elegante esto quiero hacerlo en un grid. Cuando lo hice en grid filtrando con SET FILTER TO alltrim (nombre) = alltrim(m.nombre) lo hacia muy bien pero lo descarte ya que descubri que estos filtros con el sistema en red lo hacen muy lento y estoy buscando otra solucion.

Nuestro amigo saul ha intentado ayudarme asignando un SELECT a un grid pero yo no he podido salir a camino ya que estuve un poco ocupado en otras cosas.

Tengo:

Codigo Nombre Cantidad Valor

1-. Siempre el cursor esta en el codigo.
2.-Cuando entro al nombre me activa un grid que tengo oculto para el resultado de la busqueda.
3.-Escribo el texto que quiero buscar para que se muestre en el grid que se activò.
4.- Y comienzo a subir y bajar en este grid con los articulos resultantes y pulso enter en el que quiera elegir para ser facturado.

Ya esto lo he hecho varias veces pero usando browse y filtro, espero puedan ayudar, estoy detenido no debo escribir un solo código mas sin esta solución ya sin esto se cae este proyecto por lo menos en VISUAL FOXPRO.

Gracias con esperanza de solución.
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 con busqueda

Publicado por Fidel (657 intervenciones) el 24/09/2012 01:17:43
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
*|* Suponiendo que lo que estás buscando son productos con sus precios.
*	Hay dos formas prácticas de hacer eso:
**********************************************************
*	1) Si la tabla de productos está indexada por nombre
***********************************************************
*	En este caso, el grid puede apuntar a la tabla de productos: (que aquí llamo "PRODUC"
*	En Thisform.Grid1 tiene que estar el método de captura de datos
Thisform.Grid.RecordSource="PRODUC"
 
*	Suponiendo que la etiqueta de índice es INDEX ON NOMBRE TAG DESPROD
 
*	En el Textbox que genera la búsqueda iría:
 
* Valid
this.value=alltrim(this.value)
if !empty(this.value)
	IF !INDEXSEEK(this.Value,.F.,"PRODUC","DESPROD")
		MESSAGEBOX("No hay un nombre como el ingresado")
		RETURN 0	&& devuelve el foco al Textbox
	ENDIF
ENDIF
* LostFocus
* Si superó el Valid y no está en blanco
this.Value=ALLTRIM(this.Value)
IF !EMPTY(this.Value)
	SELECT produc
	SET ORDER TO DESPROD
	indexseek(this.value,.T.,"PRODUC","DESPROD")
	WITH Thisform.Grid1
		.Refresh
		.Visible=.t.
		.SetFocus
	ENDWITH
endif
 
 
 
*************************************************
*	2) En cualquier caso (aún cuando esté indexada)
*      Si hay un índice sobre el nombre, probablemente se
*      ejecute con mayor velocidad
****************************************************
* Valid
this.value=alltrim(this.value)
if !empty(this.value)
	lcNombre=this.value
	IF USED("MICURSOR")
		SELECT MICURSOR
		USE
	ENDIF
	SELECT * FROM PRODUC ;
		INTO CURSOR MICURSOR ;
		WHERE NOMBRE LIKE "%&lcNombre%"
 
	* En la cláusula Where, podés poner:
	* a) Exacta: WHERE ALLTRIM(NOMBRE)==lcNombre
	* b) Relativa: WHERE NOMBRE LIKE "%&LcNombre%" (en cualquier lugar del nombre)
	* c) Inicial Relativa: WHERE NOMBRE LIKE "&LcNombre%"
 
	SELECT micursor
	IF RECCOUNT()=0
		MESSAGEBOX("Nada parecido se encontró")
		this.Value=""
		RETURN 0
	ENDIF
endif
 
* LostFocus
* Si superó el Valid y no está en blanco
this.Value=ALLTRIM(this.Value)
IF !EMPTY(this.Value)
	WITH Thisform.Grid1
		.RecordSource='MiCursor'	&& se reasigna la propiedad
									&& en cada consulta generada.
		.refresh
		.Visible=.t.
		.SetFocus
	ENDWITH
ENDIF
 
*	La diferencia entre ambos métodos:
*	a) Si no hay una etiqueta de índice sobre nombre no se puede realizar el primero
*	b) El segundo método muestra solamente las coincidencias, el primer
*	   método muestra todo, pero apuntando a las coincidencias.
*	c) El segundo método tiene la ventaja de poder ubicar una cadena
*      en cualquier lugar del nombre. Por ejemplo, podría ser
*	   lcnombre="205"
	SELECT * FROM PRODUC ;
		INTO CURSOR MICURSOR ;
		WHERE NOMBRE LIKE "%&lcNombre%" && mostrará cualquier
		* producto que contenga "205"



Para setear el tipo de búsqueda puedes poner una Casilla de verificación y leer el estado
1
2
3
4
5
6
if Thisform.Check1.Value
	cLike="&LcNombre%"
else
	cLike="%&LcNombre%"
endif
SELECT * FROM PRODUC INTO CURSOR MICURSOR WHERE NOMBRE LIKE &cLike
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 con busqueda

Publicado por many (332 intervenciones) el 24/09/2012 02:26:17
Saludo a todos,

Con esta ultima ayuda ya estoy viendo resultado en el grid, ahora voy a seguir tirando códigos gracias a ustedes.
De todos los códigos que envió Fidel tome y sobraron fueron suficientes.
Lo hice así:

En el lostfocus del descrip donde escribo lo quiero buscar puse esto

IF LASTKEY() = 13
thisform.grid2.Visible = .T.

SELECT Articulo.descrip, Articulo.venta1, Articulo.ep1, Articulo.venta2, Articulo.ep2, Articulo.codigo FROM articulo WHERE ALLTRIM(articulo.descrip) = ALLTRIM(thisform.descrip.value) ORDER BY descrip into cursor micursor

thisform.grid2.RecordSource = 'MiCursor'
thisform.grid2.Refresh
thisform.grid2.SetFocus
RETURN
ENDIF

Hasta pronto amigos del foro.
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: 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 con busqueda

Publicado por Fidel (657 intervenciones) el 24/09/2012 15:50:37
1) Fijate que el Inkey()=13 (/Enter) puede ocurrir con el TextBox Vacío.
De acuerdo a la cláusula Where que pones, esto te traerá todo el archivo Articulo.
1
2
3
4
LostFocus:
If !empty(this.value) .and. Inkey()=13
       Select ....
endif


Alternativamente, te puede ser util trabajar en lugar del if Inkey() en LostFocus
con GotFocus, KeyPress, Valid y LostFocus. Este mecanismo permite detectar la falta de coincidencias para el string ingresado en el TextBox. Y también si es un String vacío.

Para ello podemos definir una propiedad de bandera en el 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
33
34
35
thisform.AddProperty("Lflag",.f.)
 
TextBox
 
Evento GotFocus
THISFORM.LFlag=.F.
thisform.grid1.Visible=.f.
 
Evento KeyPress
thisform.lflag=IIF(!EMPTY(this.Value).and.nKeyCode=13,.t.,.f.)
 
Evento Valid
IF thisform.LFlag
	lcValor=UPPER(ALLTRIM(this.Value))
	SELECT * FROM ARTICULO ....  INTO CURSOR micursor (tu clausula)
	THISFORM.LFlag=.F.
	SELECT micursor
	IF RECCOUNT()=0               && si no hay coincidencias, vuelve al TextBox
                USE
		MESSAGEBOX("Nada")
 
		this.Value=""
		RETURN 0
	endif
	thisform.Grid1.RecordSource='micursor'
ENDIF
 
Evento LostFocus
IF thisform.lFlag.and.!EMPTY(this.Value)
	WITH thisform.Grid1
		.refresh
		.Visible=.t.
		.SetFocus
	endwith
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 con busqueda

Publicado por DANIEL (4 intervenciones) el 15/11/2012 21:14:31
YO HE PUESTO ASI EN UN BOTON DE COMANDO PROCEDIMIENTO CLIC Y NO SALE NADA

lcNombre=alltrim(thisformset.form1.text1.value)
SELECT * FROM PRODUCTOS ;
INTO CURSOR MICURSOR ;
WHERE DESPRO LIKE "%&lcNombre%"
Thisformset.form4.GrId1.RecordSource='micursor'
THISFORM.refresh

EN PROPIEDADES DEL GRID LE HE PUESTO RECORDSOURCETYPE = 4 ME PUEDEN AYUDAR PARA VER CUAL HA SIDO MI ERROR GRACIAS.....
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