Problemas implementando CURSORADAPTER en tablas nativas

134 views
Skip to first unread message

Claudio Rivadera

unread,
Aug 12, 2022, 8:17:09 PM8/12/22
to Comunidad de Visual Foxpro en Español
Hola estoy intentando implementar el uso de CURSORADAPTER a un sistema en desarrollo usando tablas nativas. Tengo un formulario donde voy a actualizar ordenes de pago, las que tienen un detalle de conceptos. Por lo tanto tengo las tablas ORDENPAGO y ORDENPAGO_CONCEPTOS
En primera instancia modifiqué un código que está disponible en la web con la idea que de que me construya un CA de acuerdo a cada tabla según los parámetros que le envíe.
El código es este

PROCEDURE CrearCursorActualizable
PARAMETERS lcTabla, lcCursor, lcClave, lcFiltro
lcCA='ca_'+lcTabla
PUBLIC &lcCA as CursorAdapter
LOCAL ARRAY laError(1), laEstructura(1)
&lcCA=CREATEOBJECT('cursoradapter')
Store "" To m.lcCampos, m.lcCamposUp
For m.i = 1 To Afields(m.laEstructura, m.lcTabla)
    m.lcCampos = m.lcCampos + m.laEstructura(m.i, 1) + ","
    m.lcCamposUp = m.lcCamposUp + m.laEstructura(m.i, 1) + " " +;
        m.lcTabla + "." + m.laEstructura(m.i, 1) + ","
Endfor
m.lcCampos = Left(m.lcCampos, Len(m.lcCampos) - 1)
m.lcCamposUp = Left(m.lcCamposUp, Len(m.lcCamposUp) - 1)
WITH &lcCA
    .alias=lcCursor        
    .Allowdelete = .T.
    .Allowinsert = .T.
    .Allowupdate = .T.
    .BufferModeOverride=5
    .datasourcetype='Native'
    .keyfieldlist=lcClave
    .selectcmd=[select * from &lcTabla &lcFiltro]
    .sendupdates=.t.
    .tables=lcTabla
    .updatablefieldlist=m.lcCampos
    .updatenamelist=m.lcCamposUP
    .updatetype=1
    .usetransactions=.t.
    IF !.cursorfill()
        AERROR(laError)
        MESSAGEBOX(laError(2),16,'Error')
    ENDIF
ENDWITH
 
En mi formulario principal llamo este procedimiento desde un método de la siguiente forma
lnparametro=VAL(LEFT(thisform.cmbperi.Value,4))        && Obtengo el año/ejercicio a consultar
=CrearCursorActualizable('ordenpago', 'curOrdenpago', 'id', 'where nEjercicio=lnParametro')

Luego despliego los datos obtenidos en el cursor CURORDENPAGO en un grid. Hasta ahí todo bien.
Para actualizar datos llamo a otro formulario que trabaja sobre el cursor CURORDENPAGO agregando un registro, cargando la información y almacenando en el cursor con el comando TABLEUPDATE(.f.,.t.,'curordenpago')

Al volver al formulario principal, llamo de nuevo al método que crea de nuevo el cursor desde la tabla.
Pero el problema es que no muestra el nuevo registro en caso de haberlo agregado.
Sólo al cerrar el formulario principal y lo llamo nuevamente se despliegan los datos actualizados con el nuevo registro.

En qué le estaré errando?
Desde ya muchas gracias por su ayuda!

HernanCano

unread,
Aug 12, 2022, 10:56:06 PM8/12/22
to Comunidad de Visual Foxpro en Español
Todo lo que comentas es un proceso largo... así que el escenario es complejo....

Pero debieras revisar si cambiando la sgte instrucción se mejora algo....
=CrearCursorActualizable('ordenpago', 'curOrdenpago', 'id', 'where nEjercicio=?lnParametro')

Explicación: Utilizar la interrogación justo después del igual y antes de lnParametro (sin espacios).

Aunq también pudieras hacer:

=CrearCursorActualizable('ordenpago', 'curOrdenpago', 'id', 'where nEjercicio='+transform(lnParametro) )

que me gusta más, por que debieras usar LPARAMETERS en vez de PARAMETERS.

-----------------------------------------------------------------
Tip que probablemente solucione tu impasse:
Ejecutar una especie de refrescamiento del cursor luego de ejecutar el INSERT (o TABLEUPDATE?):  es decir tratando de utilizar tu escenario: volver a ejecutar 

=CrearCursorActualizable('ordenpago', 'curOrdenpago', 'id', 'where nEjercicio='+transform(lnParametro)

luego de tu INSERT (o TABLEUPDATE?).


martin bonansea

unread,
Aug 18, 2022, 9:31:25 AM8/18/22
to publice...@googlegroups.com
Hola Claudio Rivadera, mirate la ayuda de REQUERY() que solo funciona para cursor adapter, quizas luego de hacer el insert o update tendrias que ejecutar REQUERY() para que te refresque el cursor.
Si funciona y es la solución nos avisas por favor ?
Saludos cordiales!

--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/76f6c50e-309b-4a37-a18a-b11d0aafa1fan%40googlegroups.com.

Germán Fabricio Valdez

unread,
Nov 30, 2022, 1:10:46 AM11/30/22
to Comunidad de Visual Foxpro en Español
te recomiendo mi clase sqldata o sqldata2 para dbfs.  usan cursor adapter.   pero no funciona como dice el manual.
Reply all
Reply to author
Forward
0 new messages