FoxPro/Visual FoxPro - Actualizacion de registros, No actualiza el grid, ayuda!!

 
Vista:
Imágen de perfil de jose

Actualizacion de registros, No actualiza el grid, ayuda!!

Publicado por jose (4 intervenciones) el 10/11/2017 23:15:07
Hola, les agradecería que me ayuden por favor, les comento mi problema:

tengo un formulario con un textbox y un grid, el cual permite buscar un registro especifico.

mi consulta es que al momento de realizar la busqueda de un producto x el grid lo filtra, y al hacerle click en el registro buscado que se encuentra en el grid, sus datos de dicho registro lo muestra en unas casillas de texto, hasta alli todo bien.
mi probleme es que al momento de actualizar dicho registro desde las casillas de texto le hago click en actualizar pero si vuelvo hacer la busqueda de algun registro el grid no me filtra nada, y si lo hace tengo que cerrar todo el programa de visual luego abrirlo y me aparecen los registros..

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
//--esto va en mi casilla de busqueda (interactive change)--//
if len(alltrim(thisform.txtsbn.value)) = 0
 Go top
 Thisform.text2.value=""
Thisform.text3.value=""
Thisform.text4.value=""
Thisform.text5.value=""
Thisform.text6.value=""
Thisform.text7.value=""
Thisform.text8.value=""
Thisform.text9.value=""
Thisform.text10.value=""
thisform.Refresh
else
select bienes
set filter to
        set order to sbn
 
        set filter to alltrim(bienes.sbn)=alltrim(thisform.txtsbn.value)
Thisform. Refresh()
endif
 
 
//--boton actualizar registros--//
Set exact on
Select bienes
 
replace idbienes with Thisform.text2.value
replace sbn with Thisform.text3.value
replace descripcion with Thisform.text4.value
replace marca with Thisform.text5.value
replace modelo with Thisform.text6.value
replace colores with Thisform.text7.value
replace serie with Thisform.text8.value
replace estado with Thisform.text9.value
replace observacion with Thisform.text10.value
 
Thisform.refresh
 
thisform.cmdactualizar.Enabled= .F.
thisform.cmdcancelar.Enabled= .F.
thisform.Txtsbn.SetFocus
 
 
 
//--esto va en el grid (aftter row colchange)--//
thisform.cmdactualizar.Enabled= .T.
 
Thisform.Text2.Value=bienes.idbienes
Thisform.text3.Value=bienes.sbn
Thisform.text4.Value=bienes.descripcion
Thisform.text5.Value=bienes.marca
Thisform.text6.Value=bienes.modelo
Thisform.text7.Value=bienes.colores
Thisform.text8.Value=bienes.serie
Thisform.text9.Value=bienes.estado
Thisform.text10.Value=bienes.observacion


Por favor si pueden ayudarme con mi problema seria excelente.. gracias..!!
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

Actualizacion de registros, No actualiza el grid, ayuda!!

Publicado por Fidel José (657 intervenciones) el 11/11/2017 13:31:39
Problemas varios:
1) No recomiendo utilizar SET FILTER, salvo en situaciones muy determinadas y con cursores o tablas temporales locales. Menos todavía sobre el valor de un cuadro de texto que se puede cambiar por el usuario.
2) No pongas thisform.refresh por todas partes sin que exista ninguna necesidad de hacerlo. En general debe evitarse, sobre todo si lo lanzas desde un event de un cuadro de control. El refresh para tu caso no se necesita salvo para el control grid.
3) No tengo idea de qué hace SET EXACT ON ahí. Los comparadores de cadenas texto se pueden usar con "=" o con "==". Siempre la comparación es desde la izquierda a la derecha. Con el comparador "==" se necesita que la cantidad de caracteres de ambas cadenas sea igual. Con el comparador "=" la cadena mencionada a la derecha del comparador, puede tener menor o igual cantidad de caracteres.
4) Utiliza un solo comando REPLACE
1
2
3
4
5
6
7
8
9
10
Select bienes
replace idbienes with Thisform.text2.value ,;
	sbn with Thisform.text3.value,;
	descripcion with Thisform.text4.value,;
	marca with Thisform.text5.value,;
	modelo with Thisform.text6.value,;
	colores with Thisform.text7.value,;
	serie with Thisform.text8.value,;
	estado with Thisform.text9.value,;
	observacion with Thisform.text10.value
El comando replace efectúa una serie de controles (que la tabla no se haya abierto en solo lectura, disponibiilidad de registro, estado de bloqueo o condición de buffering, etc.). Esto produce una demora innecesaria cuando se actualiza un solo registro.

5) Si estás en un evento de un control, la referencia a la propiedad Value de ese control no debe ser Thisform.control.value, sino simplemente This.Value.


Para tu planteo:
Si tienes un índice con etiqueta "SBN" y estás tus índices se crean con la sentencia INDEX ON (campo) TAG (etiqueta), o sea, utilizas un índice estructural compuesto, para buscar un registro no tienes más que utilizar ese índice.

En el adjunto tienes un ejemplo de cómo se puede hacer algo así. No es para resolver tu problema sino para que veas una técnica de resolución y si te gusta, la adaptas a tu caso. Te envío también la versión Foxbin2prg para que puedas ver el código con un editor de textos.
Fijate especialmente en el uso de SCATTER NAME / GATHER NAME en conjunto con ControlSource y el trabajo que hace la propiedad Obj_text que tiene un procedure assign asociado (obj_text_assign).
Podés ensayar con el mismo formulario ajustando los valores correspondientes para que funcione en base a alguna tabla tuya.
Fijate que el cursor no termina haciendo nada, solamente se cierra al cerrar el form por lo que todos los cambios se perderán.
En un caso real se puede trabajar de varias maneras. La más fácil sería con Buffering, y aceptando los cambios en algun lugar (TableUpdate()).
También podés crear un cursor que pueda actualizar los valores de la tabla fuente, en un Método del formulario.
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