Sql + foxpro 9 + grid

Soy nueva programando en foxpro, y tengo algunos problemitas, espero me puedas ayudar.
La situación es la siguiente: tengo un formulario compuesto por un grupo de txt y un grid, hago una conexión a una bd en sql, básicamente, en el grid muestro una parte de las columnas de la tabla y al dar click en cada registro del grid, muestra los datos restantes en los txt.
¿Qué es lo que hago? Bueno,
1. En el método load de mi formulario hago la conexión a mi bd con connhandler=sqlconnect('bd'), en el unload hago sqldisconnect('connhandler'), en el init hago mi consulta sqlexec(connhandler, "select * from tabla order by clave desc", "cursor1")
2. Tengo entendido que con esta sentencia ya se crea un cursor donde se almacena toda la información y después asigno el cursor a mi grid con thisform. Grid. Recordsource="cursor1",
3. En controlsource de cada txt asigno cada uno de los campos que quiero se muestren
4. Entonces en grid en el método afterrowcolchange utilizo un thisform. Refresh para que cada que cambie de fila se muestren todos los datos en los txt
y todo marcha bien hasta ahí.
El problema viene cuando quiero actualizar, insertar o modificar los datos y que inmediatamente de ejecutar las sentencias se reflejen los datos en el grid...
Tengo un botón para cada acción insertar, modificar y eliminar, cuando doy click a alguno de ellos ejecuto la sentencia sql correspondiente, ¿y después? Como puedo colocar el foco en el registro que acabo de insertar o modificar y mostrar las actualizaciones inmediatamente en el grid y los txt.
He utilizado refresh en el form, pero creo que tengo que hacerlo en el cursor o algo así... De hecho si me pudieras dar alguna orientación sobre como utilizar un cursor, me seria de mucha ayuda.

1 respuesta

Respuesta
1
Lo que tiene que estar pasando es que en los botones de función estas cerrando la tabla, o cambiando su alias o dejando otra seleccionada.
Para solucionarlo te sugiero que asignes el cursor de la siguiente manera:
thisform.grilla.recordsource = null
thisform.grilla.recordsource = "cursor"
thisform.grilla.column1.controlsource = "cursor.campo1"
thisform.grilla.column2.controlsource = "cursor.campo2"
* y de esa manera lo hagas para cada campo.
A su vez, en cualquier situación en la que vallas a cerrar el cursor, antes usá la sentencia:
thisform.grilla.recordsource = null
Espero se solucione, sino lo podes arreglar podrías pasarme el código a mi mail [email protected] que lo arreglo y te lo devuelvo.
Salu2 y exitos!
Ah, ya solucioné este problemita, lo que hice fue ejecutar nuevamente la consulta y reasignar el cursor al recordsource de mi grid, pero ahora lo que hace es que después de eliminar,( etc) un registro, mi grid se desconfigura, es decir la cantidad de columnas, el estilo de letra de los encabezados, etc. Entonces en la misma función que llamo para ejecutar la consulta y llenar el grid vuelvo a asignar las características del grid, y ya funciona.
¿Sabes a qué se puede deber esto? Y no sé si sea una solución muy buena la que estoy implementando... es más tal vez pudieras revisar mi código, tal vez haya una solución más práctica.
Gracias por tu atención!
Muchas gracias por tu rápida respuesta, mmm... pero no sé si se cierre la tabla, estoy trabajando con una base de datos en mysql, pero solo estoy trabajando con una tabla, así que no debería haber problemas de que cambie el alias o dejar seleccionada alguna otra.
Te he enviado mi código, porque definitivamente no tengo idea de cómo se manejen los cursores en foxpro, espero tengas tiempo para revisarlo, disculpa las molestias.
Y muchas gracias por tu ayuda!
La corrección para que no te pase más eso es muy sencilla.
En tu programa mylib. Prg agregá esto en el código:
***************************************************************
PROCEDURE LlenaGrid(othis)
othis.grid1.RecordSource=null
sqlcommand="select * from clientes order by clave desc"
lo importante es que agregando esto (othis.grid1.RecordSource=null) antes de generar el cursor la grilla se libera y conserva su formato original. Lo que te estaba pasando era que al llamar varias veces a la funcion LlenaGrid la generación del cursor1 lo borra de memoria, osea lo cierra, cuando volvés a ejecutar la consulta y eso cambiaba el formato de la grilla. No es necesario que entiendas esto, simplemente te lo aclaro para que no te pase en otros casos que uses cursores en grillas.
Salu2 y exitos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas