Problema con grid creado en viasual foxpro

Buenas días amigos,
soy nuevo en el manejo de visual foxpro, aunque siempre he programado con foxpro 2.6 DOS, me encuentro en la fase de cambiar mis sistemas a visual foxpro.
El problema que se me presenta es que diseñé un formulario para consultar las deudas de los propietarios de un condominio utilizando un grid el cual lo alimento por medio de un cursor. Todo va bien, pero lo que pasa es que antes de mostrarme los registros de la consulta en el respectivo grid, me lanza la pantalla de consulta (browser) de dichos registros y luego que cierro dicha pantalla, aparece la información en el grid. Anexo la imagen para que tengan idea del problema. Agradezco de antemano su valiosa colaboración.

Procedo a escribirles los códigos que he escrito en el formulario:

- En el objeto: form (frmedocta) procedimiento: INIT coloque el siguiente código:
Thisform.GrdEdoCta.recordsource = ""
CREATE CURSOR MiCursor (numero c(6),fecha d,monto n(10,2),intereses n(8,2),saldo n(10,2),;
montoc n(10,2),fchcanc f,deposito c(6),relacio c(4))
THISFORM.grdEdoCta.RecordSource = "MiCursor"
THISFORM.grdEdoCta.Refresh
- en el botón "estado de cuenta" procedimiento: CLICK coloque el siguiente código:

(este botón llama la consulta del estado de cuenta) 
LOCAL lnTotal
lnTotal = 0.00
SELECT deudas
SUM ALL saldo TO lntotal FOR apto = thisform.txtApto.Value
THISFORM.GrdEdoCta.RecordSource = ""
MiCursor = "SELECT Deudas.numero, Deudas.fecha, Deudas.monto, Deudas.interes,;
Deudas.saldo, Deudas.fchcanc, Deudas.montoc, Deudas.deposito, Deudas.relacion;
FROM condominio!deudas;
WHERE Deudas.apto = ALLTRIM(thisform.txtapto.value) ORDER BY Deudas.numero"
THISFORM.GrdEdoCta.RecordSource = MiCursor
THISFORM.txt_SdoAct.Value = lnTotal
THISFORM.cmdHistorico.Visible = .F.
THISFORM.cmdRegresar.Visible = .F.
THISFORM.cmdEdoCta.Visible = .F.
THISFORM.cmdAtras.Visible = .T.
THISFORM. CmdAtras. SetFocus
THISFORM. GrdEdoCta. Refresh
Agradeciendo su oprtuna y desinteresada colaboración. Un gran saludo.

Respuesta
1

A como veo, en el INIT del form, creas el cursor editable MiCursor (sin agregarle ningún registro) y lo asocias al grid. Ahora en la consulta (al hacer click al botón) de los estados de cuenta, generas un SELECT a la tabla DEUDAS para levantar los datos según tu condición (ALLTRIM(thisform.txtapto.value) pero no asocias ninguna consulta de datos al cursor creado antes con CREATE CURSOR. Esta de más crear el cursor lectura-escritura al iniciar tu form, dado que no se asocia a ninguna transacción de inserción, edición o eliminación de registros (temporales) durante la operación. Basta generar un cursor con una consulta SELECT y asociarlo al grid directamente y con el comando readwrite al final lo conviertes en editable. A como el amigo SysgGen te indica, dirigí la consulta mejor con INTO CURSOR miCursor ReadWrite y no trates de guardarlo en variables, sino, carga la consulta primero y después liga el cursor al grid. En ese caso, unicamente en el INIT del form desliga la fuente del grid y al generar la consulta en tu botón, liga el cursor miCursor al grid, y si es posible, asocia también cada columna del grid a un campo del cursor... para así tener más dominio de dirección de cada campo. Así:

THISFORM.GrdEdoCta.RecordSource = "MiCursor"
**--
THISFORM.GrdEdoCta.Column1.ControlSource = "Micursor.numero"
THISFORM.GrdEdoCta.Column2.ControlSource = "Micursor.fecha"
THISFORM.GrdEdoCta.Column3.ControlSource = "Micursor.monto"
**Aca el resto de columnas

Hola amigos, gracias a todos por su valiosa ayuda, ya no me presenta ningún error pero igual no me muestra la información en el grid, cuando le doy a Ver en la barra de visual foxpro, me aparece el cursor miCursor y tiene toda la informacion de la consulta, pero no la pasa al grid.
nuevamente les dejo el código a ver que puede estar pasando. Disculpen las molestias ocasionadas. gracias
- en el objeto: form (frmedocta) procedimiento: INIT coloque el siguiente código:
Thisform.GrdEdoCta.recordsource = ""
SELECT 0
CREATE CURSOR miCursor (numero c(6),fecha d,monto n(10,2),interes n(8,2),saldo n(10,2),;
montoc n(10,2),fchcanc f,deposito c(6),relacion c(4))
THISFORM.grdEdoCta.RecordSource = "miCursor"
THISFORM.grdEdoCta.Refresh
- en el botón "estado de cuenta" procedimiento: CLICK coloque el siguiente código:

LOCAL lnTotal
lnTotal = 0.00
SELECT deudas
SUM ALL saldo TO lntotal FOR apto = ALLTRIM(thisform.txtApto.Value)
THISFORM.GrdEdoCta.RecordSource = ""
If Used("miCursor")
Select miCursor
Use
ENDIF

SELECT Deudas.numero, Deudas.fecha, Deudas.monto, Deudas.interes,;
Deudas.saldo, Deudas.fchcanc, Deudas.montoc, Deudas.deposito, Deudas.relacion;
FROM condominio!deudas;
WHERE Deudas.apto = ALLTRIM(thisform.txtapto.value) ORDER BY Deudas.numero ;
INTO CURSOR "miCursor" READWRITE
THISFORM.GrdEdoCta.RecordSource = "miCursor"
THISFORM.GrdEdoCta.Col_Recibo.ControlSource = "miCursor.numero"
THISFORM.GrdEdoCta.Col_FchEmis.ControlSource = "miCursor.fecha"
THISFORM.GrdEdoCta.Col_MtoRec.ControlSource = "miCursor.monto"
THISFORM.GrdEdoCta.Col_Interes.ControlSource = "miCursor.interes"
THISFORM.GrdEdoCta.Col_Saldo.ControlSource = "miCursor.saldo"
THISFORM.GrdEdoCta.Col_MtoCanc.ControlSource = "miCursor.montoc"
THISFORM.GrdEdoCta.Col_FchCanc.ControlSource = "miCursor.fchcanc"
THISFORM.GrdEdoCta.Col_Deposito.ControlSource = "miCursor.deposito"
THISFORM.GrdEdoCta.Col_Relacion.ControlSource = "miCursor.relacion"

THISFORM.txt_SdoAct.Value = lnTotal
THISFORM.cmdHistorico.Visible = .F.
THISFORM.cmdRegresar.Visible = .F.
THISFORM.cmdEdoCta.Visible = .F.
THISFORM.cmdAtras.Visible = .T.
THISFORM.cmdAtras.SetFocus
THISFORM.grdEdoCta.Refresh

Espero estés bien.

Que raro... aparentemente todo esta bien. Proba así: en esta parte del código, marca como comentario con *** la línea donde desligas el grid antes de hacer la consulta... así:

SUM ALL saldo TO lntotal FOR apto = ALLTRIM(thisform.txtApto.Value)
***THISFORM.GrdEdoCta.RecordSource = ""
If Used("miCursor")
Select miCursor
Use

Y al final de todo el código, refresca el form completo, así

THISFORM. Refresh()

Proba y me avisas... sino, lo trabajamos todo y veo acá el código completo...! :)

2 respuestas más de otros expertos

Respuesta
2

prueba cambiar esto...

THISFORM.GrdEdoCta.RecordSource = ""
SELECT Deudas.numero, Deudas.fecha, Deudas.monto, Deudas.interes,;
Deudas.saldo, Deudas.fchcanc, Deudas.montoc, Deudas.deposito, Deudas.relacion;
FROM condominio!deudas;
WHERE Deudas.apto = ALLTRIM(thisform.txtapto.value) ORDER BY Deudas.numero;
Into cursor Micursor
THISFORM.GrdEdoCta.RecordSource = "MiCursor"

Gracias amigo SysGen Argentina, realice una prueba utilizando tu consejo y ahora me muestra el siguiente error: No se encuentra la variable 'MICURSOR'. Anexo imagen de la pantalla.

De la forma en que está escrito Micursor no es una variable sino una tabla tipo cursor. ¿Seguro está escrito el comando como el ejemplo?. ¿Puedes habert tipeado mal el nombre de la tabla en el Select SQL?

De otro modo puede que al estar abierto una tabla cursor con el mismo nombre eso sea lo que da problemas; prueba cerrarla primero antes de volver a mostrarla.. ah!, se me pasó decirte que debes crear la tabla cursor agregando además Readwrite para poder modificarla... entonces quedaría así...

THISFORM.GrdEdoCta.RecordSource = ""
If Used("Micursor")
   Select Micursor
   Use
endif
** Crear la nueva tabla cursor según criterios...
select 0
SELECT Deudas.numero, Deudas.fecha, Deudas.monto, Deudas.interes,;
Deudas.saldo, Deudas.fchcanc, Deudas.montoc, Deudas.deposito, Deudas.relacion;
FROM condominio!deudas;
WHERE Deudas.apto = ALLTRIM(thisform.txtapto.value) ;
ORDER BY Deudas.numero;
Into cursor Micursor Readwrite
THISFORM.GrdEdoCta.RecordSource = "MiCursor"

Poco cambia el codigo con respecto a lo anterior solo cerrar tu cursor "Micursor" creado en el evento INIT y agregar el ReadWrite al final del Select - SQL.

Respuesta
1

Ya pude resolverlo agregándole al botón estado de cuenta la instrucción

THISFORM.GrdEdoCta.RecordSourceType = 1.

Muchísimas gracias a todos por su generosa colaboración, les estaré siempre agradecido.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas