Problemas con pasar datos de grid a texbox
hola experto revenn
veras lo que sucede es que cuando ejecuto el formulario y lleno el grid, normal a los registros que le hago clic en el grid normal los pasa a los textbox, pero cuando hago una búsqueda en el grid, y filtra nombres y todos los demás datos. Ya no me funciona más el grid y le hago clic en los registros filtrados y ya no me pasa los datos a los textbox, te agradecería muchísimo si me ayudas nuevamente
1 Respuesta
¿Ya no funciona mas tu grid? ¿Qué comportamiento tiene? ¿Se queda en blanco? ¿No filtra nada? ¿Se descompone su estructura visual? Pásame el código que usas para filtrar para ver el problema.
hola eperto
gracias por responder
*2 el grid debe estar en modo sql stalment
*en el evento int de mi form
thisform.grid1.RecordSource='Select * FROM personas INTO CURSOR temp1'
thisform.Refresh
*con eso lleno mi grid
*en txtbusqueda del evento interactivechange tengo esto
THISFORM.Grid1.Recordsource=''
búsqueda=alltrim(this.Value)
thisform.grid1.RecordSource="Select * FROM personas where código =búsqueda INTO CURSOR temp1"
*THISFORM.Grid1.Recordsource = "temp1"
THISFORM.Grid1.Refresh
*e el evento click del grid tengo esto
thisform.txtCodigo.Value = temp1.código
thisform.txtNombre.Value = temp1.nombre
thisform.txtNombre2.Value = temp1.nombre2
thisform.txtApellido.Value = temp1.apellido
thisform.txtApellido2.Value = temp1.apellido2
thisform.Refresh
pero ala hora que quiero actualizar y borrar no puedo me dise que si lo modifica
pero en el grid no aparecen las modificaciones ni en la tabla
gracias no se si platie bien mi problema
A ver... para cargar el grid lo mas recomendable es usar un método personalizado..! Es decir... no cargarlo directamente en init y menos en LOad del form. Crea mejor un método personalizado y ahí carga el grid. ¿Por qué? Fácil... si necesitas recargar el grid o refrescar la vista del grid... solo volvés a generar la consulta y listo. Yo por ejemplo, creo un método llamado "cargardatos" PARA CARGAR todos los datos del cursor primero... ahí coloco así:
**--Liberamos grid para mantener integridad visual
THISFORM.Grid1.RecordSource = " "
**--Hacemos la consulta
SELECT * FROM tabla INTO CURSOR temp1
**--Cargamos el grid
THISFORM.grid1.RecordSource = 'temp1'
**--Controlamos cada columna para evitar desbordamiento
THISFORM.Grid1.Column1.ControlSource = 'temp1.campo1'
THISFORM.Grid1.Column2.ControlSource = 'temp1.campo2'
**--Acá el resto. Enlaza cada columna con cada campo. Da mayor estabilidad.
**--
THISFORM.Grid1.Refresh
**--//
Luego, en el INIT DEL FORM, solo llamo al método así:
**--Cargamos grid
THISFORM.cargardatos
**--//
Y listo :)
AHORA... para hacer la búsqueda esta bien si la haces en el interactivechange del text. Así como la cargada de datos.. solo que estableces la clausula WHERE para filtrar algún dato, como en tu caso el código. Pero acá debes tener el cuidado y asegurarte que el tipo de datos del control text es igual al tipo de datos del campo. Por ejemplo.. veo que consultas y filtras para el campo código... pero el valor que buscas, cargado en el text, es así:
búsqueda=alltrim(this.Value)
Lo que me sugiere que es un tipo de datos tipo carácter (ALLTRIM()). ¿El tipo de datos de la tabla es carácter también? Ahí puede estar la razón del porque el filtro falla. Si el tipo de datos del campo es numeric y el valor buscado es carácter... la consulta falla. Asegurate que los tipos de datos son iguales. Si es numeric... podes usar la función VAL() para transformar el tipo de datos del text a un tipo numérico.
Bien.. proba lo que te planteo y espero tus comentarios. Un saludo!
Desde Managua, Nicaragua!
Ravenn :D :D :D
hola experto gracias por tu ayuda
en efecto hice lo que me dijiste y si funciona
el problema es a la hora de actualizar el cursor tem1
no me deja y ya le escribí al final readwrite perono
me dice que el cursor solo es de lectura
gracias
Espero andes bien. Lo que pasa es que el cursor temp1 se genera por medio de una consulta SQL. Al inicio se cargan todos los datos y luego vos generas una búsqueda pero volvés a cargar el cursor.
La lógica que te propuse se basa en generar las consultas n numero de veces... tan igual como actualices tu tabla física. Después que haces una actualización a tu tabla física... vos debes volver a re generar la consulta... ahí el nuevo dato ya debe aparecer.
Para ser mas explicativo: suponte que mostrás todos los datos, así como te mostré al inicio. Luego yo agrego un nuevo registro a la tabla. Cuando yo hago un UPDATE o INSERT a la tabla... ya luego actualizo el dato. En ese momento... yo vuelvo a llamar al método que diseñe para cargardatos.
THISFORM. Cargardatos
Así al guardar el registro, vos guardas e inmediantemente mostrás los nuevos datos porque volvés a generar el cursor temporal temp1 ya con una tabla actualizada. ¿Me explico?
Usar ReadWrite... es bueno! Pero readwrite lo que te permite es que tu cursor temporal sea de escritura...! ¿Pero y la tabla donde guardas que? Lo mas conveniente es actualizar tu tabla física .dbf y de ahí extraer los datos de forma temporal si lo que necesitas es solo consulta. Para que hacer un cursor temporal de consulta lectura-¿Escritura? Eso te puede gastar mas recurso!
En los casos en que usas los cursores de lectura escritura mas que todo es cuando vos debes cargar datos que están tentativos a ser o no ser actualizados. POr ejemplo: para un form de facturación... vos cargas los productos en un cursor temporal... imagina que el cliente te pide facturar zapatos, carteras, gorras... vos tenes abierto tu form de factura y vas cargando... pero luego el cliente dice "ya no llevare las gorras".. . entonces vos solamente lo borras del cursor... luego cuando ya estas 100% seguro guardas el cursor en la tabla física. Y listo. Asegurastes con esto la integridad de los datos y validastes muy bien los datos antes de guardarlos. Algunos cometen el error en esos casos... de abrir un registro en blanco en la tabla física con APPEND BLANK y luego si el dato o registro ya no va... aplican delete. Eso es una practica pesimaaaa! La base de datos, las tablas físicas... deben "tocarse" lo menos posible y deben quedar unicamente disponibles para: CONSULTAS, INSERCCIONES, MODIFICACIONES Y ELIMINACIONES QUE ESTÉN 100% VALIDADAS Y ASEGURADAS.
Vos solamente volvé a generar la consulta una vez actualizada tu tabla... y debe tomar los nuevos datos. Recordá que una de las virtudes de VFP es el poderoso manejo de cursores... así que no te preocupes. Foxpro va a tomar el dato ya actualizado en el cursor.
La regeneración de cursores de consulta con SELECT tanto para mostrar de inicio todos los datos como para hacer filtros de búsqueda (como el que vos tenes con la clausula WHERE) son las mejores opciones para las consultas de datos. Foxpro jamas perderá la integridad de la consulta y para posteriores usos, como la generación de reportes, son mejores opciones. Trata de evitar lo mas posible SET FILTER. Este comando limita el filtro solo al modulo o form de donde se genera. Si intentas generar un reporte sobre una tabla o cursor temporal... te enviara un error que la referencia del filtro no existe.
Bien.. proba lo que te dije y si el problema persiste, avisame para ayudarte.
Un abrazo!
Desde Managua, NICARAGUA!
Ravenn :D :D :D
saludos :gracias por seguir mi caso que tengo
ok entendí perfectamente
y yo también pienso igual que no hay que andar abriendo "append blank" si no estamos seguros que se va a insertar en la tabla por eso lo hago a través de comando sql (pero tu sabes "el jefe manda")
y toda la reprogramacion la quiere orientada a objetos
y siguiendo con mi problema
para actualizar mi grid solo tengo que llamar el método creado en este caso THISFORM.cargardatos y con eso estoy actualizando mi grid con los nuevos registros ingresado eso fue lo que te entendi
1)para guardar registros lo hago con esto
obviamente contó las validaciones que hay que hacer
INSERT INTO personas(código,nombre,nombre2,apellido,apellido2) VALUES (A,b,c,d,e)
THISFORM.cargardatos
messagebox("Sea guardado Satisfactoriamente")
GO top
2)en entonces para actualizar los datos que tengo en el grid le hago click al que yo quiero y lo paso a los texbox
SET EXCLUSIVE On
SELECT personas
REPLACE nombre WITH thisform.txtNombre.Value
REPLACE nombre2 WITH thisform.txtNombre2.Value
REPLACE apellido WITH Thisform.txtApellido.Value
REPLACE apellido2 WITH Thisform.txtApellido2.Value
messagebox("Sea Modificado satisfactoriamente")
THISFORM.cargardatos
thisform.Refresh
nota:
el problema es que no me lo actualiza
por que ?
Proba así:
Para insertar un nuevo registro:
La cargada de datos dejala hasta el final. Que sea la ultima linea de código.
**--Guardamos los datos
SELECT personas
INSERT INTO personas(código,nombre,nombre2,apellido,apellido2) VALUES (A,b,c,d,e)
TABLEUPDATE(.F.)
messagebox("Sea guardado Satisfactoriamente")
SELECT personas
GO top
**--Actualizamos consulta general
THISFORM.cargardatos
**--//
Ahora... para modificar con replace, probá así:
**--Modificamos registro
SET EXCLUSIVE On
SELECT personas
TABLEREVERT(.F.)
**--Modificamos
REPLACE nombre WITH thisform.txtNombre.Value
REPLACE nombre2 WITH thisform.txtNombre2.Value
REPLACE apellido WITH Thisform.txtApellido.Value
REPLACE apellido2 WITH Thisform.txtApellido2.Value
TABLEUPDATE(.f.)
Messagebox("Sea Modificado satisfactoriamente")
THISFORM. Cargardatos
**--//
Proba y avisame! :)
si a ahora si actualiza
pero me en ves de coger lo que tengo en mis texbox
el actualiza el primer registro que tengo en el grid
ya lo provee varias veces pero siempre me sigue actualizando el primer registro
por que?
Ahhh lo que pasa es que vos debes orientarle al comando REPLACE que registro es el que vas a modificar. Por ejemplo.. quiero cambiar el campo nombre del código de cliente 15. Lo que voy a cambiar es el nombre pero la forma de saber que registro es por medio del campo código... entonces va así:
select tabla1
tablerevert(.f.)
REPLACE nombre WITH ALLTRIM(THISFORM.Text2.Value) FOR tabla1.código = 15
**--Acá el resto de campos siempre con señalando que registro, con la clausula FOR.
Ves! :) Así es la forma de proceder.
Proba y me avisas1
- Compartir respuesta