FOXYDB 3.0 error: El buffer de tabla para alias... contiene cambios no confirmados

185 views
Skip to first unread message

Fernando Mauricio Romero Jones

unread,
Mar 28, 2020, 2:45:50 PM3/28/20
to Comunidad de Visual Foxpro en Español
Hola. Creo que es una consulta para A. Meza, pero si alguien más me puede ayudar, desde ya muy agradecido. 
Estoy utilizando la librería FOXYDB 3.0 y cuando actualizo 1 campo de la tabla me da el error El buffer de tabla para alias... contiene cambios no confirmados.
Hice varias pruebas tratando de encontrar el error, les comento que la actualalización en la tabla MariaDB la registra correctamente y cuando quiero volver a ejecutar la instrucción obd.sql me da ese error.
Lo raro es lo siguiente, dentro del programa foxydb que transcribo:
PROCEDURE Sql
LPARAMETERS __commandSql as Character, __cursorName as Variant, __notErrorODBC as Boolean
LOCAL __lockModeErrorCommit, __lockModeErrorTransaction, __commandSqlNotFinished, __commandSqlEmpty, ;
**** --------------------------------------------------------------------------------------------
******** elimine algunas lineas para q no sea tan pesada la lectura, pero en el original obviamente están
* Validar Parámetros
...
* Verificar Conexión a la Base de Datos
...
* Preparar Transacción Automática de Solo Lectura si no hay una transacción abierta
IF __connected = true
IF NOT this.handle_Transaction > __transactionNotStarted
IF this.Begin(__transactionReadOnly)
__transactionReadOnlyAutomatic = true
ELSE
__transaction = false
__errorCode = __lockModeErrorTransaction
ENDIF
ENDIF
IF __transaction = true
* Ultima Instrucción SQL enviada
this.sql_Send = __commandSql
* Ejecutar Consulta SQL en el Servidor de Base de Datos
IF __commandSqlSequence
__commandSqlResult = SQLEXEC(this.handle,__commandSql)
ELSE
***************** AQUI ESTA LO RARO
BROWSE TIMEOUT 0.01 &&& si saco esa línea (que no está en el original) da el error que les comento
****************** CON EL AGREGADO DE ESA LÍNEA NO ME DA NINGUN ERROR
__commandSqlResult = SQLEXEC(this.handle,__commandSql,__cursorName,__sqlRecordsArray)
* Registros devueltos o afectados
this.sql_Records = __sqlRecordsArray(2)
ENDIF
*****  De aqui en más continúa la rutina que la elimine de la transcripcion...
this.error_Code = __errorCode
RETURN __return
ENDPROC
**** --------------------------------------------------------------------------------------------
RUTINA DE ENVIO DE ACTUALIZACION (sencilla y funciona)
SELECT queconsultorio
REPLACE presente WITH THISFORM.Grid1.cpresente.Check1.Value 
*for codigo=queconsultorio.codigo
IF this.Value=0
REPLACE atendido WITH 0 
THISFORM.Grid1.catendido.Check1.Value=0
endif
    IF odb.CursorChanges("queconsultorio")
    IF odb.update("queconsultorio","codigo",.t.)
WAIT WINDOW "...comienzo de guardado..." nowait
                        IF  odb.Commit()
                             =MessageBox("Perfecto!!, Datos Guardados",4096,"Proceso Guardado",100)
thisform.dia.refresh
                      ELSE 
                              odb.RollBack()
                              MessageBox("No se pudieron guardar los datos")
               ELSE
                       odb.RollBack()
                       MessageBox("No se pudieron guardar los datos")
             ENDIF 
ENDIF
*--------
Y EN DIA.REFRESH (Devuelve el cursor editable queconsultorio bien)
_sql="SELECT turnos.hora,  NVL(pacientes.nombre,'') AS nombre, turnos.visita1, "
_sql=_sql+" turnos.presente, turnos.atendido, NVL(obrsoc2.descripcio,'') as nomobr, "
_sql=_sql+" NVL(pacientes.tele,'') AS TELE, turnos.codigo as orden, "
_sql=_sql+" TRIM(turnos.observ) as observ, turnos.codigo, DATE_FORMAT(fecha,'%Y-%m-%d') AS fecha, "
_sql=_sql+" NVL(pacientes.grupo,0) AS grupo,   turnos.medico, NVL(obrsoc,'') AS OBRSOC "
_sql=_sql+" FROM turnos LEFT JOIN PACIENTES ON pacientes.grupo=turnos.grupo "
_sql=_sql+" LEFT JOIN obrsoc2 ON obrsoc2.codigo=turnos.obrsoc "
IF xCodigo>0
_sql=_sql+" WHERE turnos.codigo=?xCodigo "
ELSE 
IF xCodigo=0
_sql=_sql+ " WHERE turnos.codigo>0 "
ELSE
_sql=_sql+ " WHERE turnos.codigo<0 "
ENDIF 
ENDIF 
IF NOT EMPTY(ALLTRIM(xPresta))
_sql=_sql+" AND turnos.medico= ?xPresta "
ENDIF 
IF NOT EMPTY(xFecha)
_sql=_sql+" AND fecha=DATE_FORMAT(?xFecha,'%Y-%m-%d')  "
ENDIF
_sql=_sql+" order by fecha, hora  "
odb.Query(_sql, "queconsultorio","turnos")
odb.CursorEdit("queconsultorio") && PREPARAMOS PARA EDICION



Desde ya muchisimas gracias Si alguien puede ayudarme a aclarar el error.

Fernando Mauricio Romero
Santa Fe - Argentina

Antonio Meza

unread,
Mar 29, 2020, 1:04:16 PM3/29/20
to Comunidad de Visual Foxpro en Español
Hola!!! antes de ver si es un error de la librería me gustaría ver tu código que usas para modificar el cursor y versión del servidor y si esta en windows o linux, y el driver odbc su versión.


saludos
Antonio Meza

Fernando Mauricio Romero Jones

unread,
Mar 29, 2020, 1:40:23 PM3/29/20
to Comunidad de Visual Foxpro en Español
Gracias por tu respuesta.... la verdad estoy re perdido hace varios días y no puedo avanzar. 
Utilizo WINDOWS 10 64bits
Mariadb version 10.2
ODBC: MariaDB ODBC 3.1 Driver

te transcribo el proceso para actualizar el cursor
RUTINA DE ENVIO DE ACTUALIZACION (sencilla y funciona)
SELECT queconsultorio
REPLACE presente WITH THISFORM.Grid1.cpresente.Check1.Value 
   IF this.Value=0
      REPLACE atendido WITH 0 
      THISFORM.Grid1.catendido.Check1.Value=0
   endif
    IF odb.CursorChanges("queconsultorio")
       IF odb.update("queconsultorio","codigo",.t.)
                        IF  odb.Commit()
                             =MessageBox("Perfecto!!, Datos Guardados",4096,"Proceso Guardado",100)
                             thisform.dia.refresh &&& aca llama al proceso de consultar nuevamente el cursor descripto más abajo
                      ELSE 
                              odb.RollBack()
                              MessageBox("No se pudieron guardar los datos")
               ELSE
                       odb.RollBack()
                       MessageBox("No se pudieron guardar los datos")
             ENDIF 
ENDIF
*--------
***********************************
*************************************
Y EN DIA.REFRESH (Devuelve el cursor editable queconsultorio bien)
*************************************************************************

 
Fernando Mauricio Romero
Santa Fe - Argentina

Antonio Meza

unread,
Mar 29, 2020, 3:12:11 PM3/29/20
to Comunidad de Visual Foxpro en Español
De entrada te recomiendo por lo menos el driver 5.1, el 3.1 esta ya muy obsoleto para las nuevas versiones de MariaDb y Mysql

Por otro lado necesito ver el código como obtienes el cursor.

saludos

Germán Fabricio Valdez

unread,
Mar 29, 2020, 7:28:51 PM3/29/20
to Comunidad de Visual Foxpro en Español
Puede ser el tema de las fechas nulas y las fechas vacias

Fernando Mauricio Romero Jones

unread,
Mar 29, 2020, 7:56:14 PM3/29/20
to Comunidad de Visual Foxpro en Español
Antonio. Utilizo el driver MariaDB 3.1 porque es el que está como estable en la página oficial de MARIADB, vos me recomendas que lo cambie a driver de mySql cuya versión en 8.0??? Si es asi lo hago. Pensé q era mejor tener el driver de mariaDB para el motor de mariaDB.

Germán. Gracias por tu interés. No son las fechas. Ya había tenido ese inconveniente asi q estaba atento a que no fuera ese error.

Transcribo como obtengo el cursor
GRACIAS A TODOS POR SU AYUDA!!!

Germán Fabricio Valdez

unread,
Mar 29, 2020, 10:04:06 PM3/29/20
to Comunidad de Visual Foxpro en Español

Cambiar el modo de buffer de la tabla

Hemos dicho, al inicio de la última sesión, que puede utilizar siempre CursorSetProp() para establecer o cambiar el modo de buffer de una tabla. Esto es cierto; pero si la tabla ya ha tenido asignado un modo buffer, puede no ser tan sencillo porque al cambiar el estado de buffer forzaría a Visual FoxPro a verificar el estado de cualquier buffer existente.

Si la tabla tiene buffer de filas, y tiene cambios no confirmados, Visual FoxPro los envía y permite cambiar el modo. Si el destino tiene buffer de tablas, y trata de cambiar su modo de buffer mientras existen cambios no confirmados, Visual FoxPro se queja y manda el error 1545 ("El búfer de tablas para el alias "nombre" contiene cambios no confirmados"). Esto es un problema porque no puede indexar una tabla, o hacerla libre una tabla o cursor transactable, los que mientras la tabla tiene buffer, por tanto es la única vía de hacer estas cosas, temporalmente, a buffer de filas. Por supuesto, la solución es siempre suficiente - asegúrese sólo de que no hay cambios pendientes antes de que intente cambiar el modo de buffer.


https://comunidadvfp.blogspot.com/2015/11/buffer-y-bloqueos-en-visual-foxpro.html



El sábado, 28 de marzo de 2020, 15:45:50 (UTC-3), Fernando Mauricio Romero Jones escribió:

Antonio Meza

unread,
Mar 30, 2020, 10:55:16 AM3/30/20
to Comunidad de Visual Foxpro en Español
Si no me muestras el código de como obtienes el o los cursores me va hacer imposible poder ayudarte!!!

No he usado los driver de MariaDb, pero el error que tienes no es por el driver es por algo que hace falta en VFP.

saludos
Antonio Meza

Fernando Mauricio Romero Jones

unread,
Mar 30, 2020, 11:06:59 AM3/30/20
to publice...@googlegroups.com
Antonio. te transcribo la forma de obtener el cursor (no se si a este código te refieres???). Perdón si estoy entendiendo mal. Gracias por tu interés
*********************************
Transcribo como obtengo el cursor
*********************************
******************************************************
TRANSCRIBO DONDE GUARDO LOS DATOS DEL CURSOR
*******************************************************
SELECT queconsultorio
REPLACE presente WITH THISFORM.Grid1.cpresente.Check1.Value 
*for codigo=queconsultorio.codigo
IF this.Value=0
REPLACE atendido WITH 0 
THISFORM.Grid1.catendido.Check1.Value=0
endif
    IF odb.CursorChanges("queconsultorio")
    IF odb.update("queconsultorio","codigo",.t.)
WAIT WINDOW "...comienzo de guardado..." nowait
                        IF  odb.Commit()
                             =MessageBox("Perfecto!!, Datos Guardados",4096,"Proceso Guardado",100)
thisform.dia.refresh (en este evento llamo a OBTENER EL CURSOR NUEVAMENTE, que es la rutina copiada más arriba)
                      ELSE 
                              odb.RollBack()
                              MessageBox("No se pudieron guardar los datos")
               ELSE
                       odb.RollBack()
                       MessageBox("No se pudieron guardar los datos")
             ENDIF 
ENDIF

--
Visita el 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/1cde6bb7-fad4-4a5f-b99a-84f61caaadb5%40googlegroups.com.

Antonio Meza

unread,
Mar 30, 2020, 11:26:25 AM3/30/20
to Comunidad de Visual Foxpro en Español
Un duda porque mencionas que cuando quieres ejecutar de nuevo obd.Sql ?? o solo fue error de dedo y quisiste decir odb.Query(). Será que estas modificando otro cursor que obtienes con odb.Sql() ???

NOTA: Del driver odbc no leí bien y pensé que te referías al 3.1 de Mysql, por lo tanto esta bien que uses ese driver de MariaDb, yo no lo he usado!!!

Te recomiendo usar Text / EndText hace mas legible tu código y mas fácil de depurar.

TEXT TO _sql  TEXTMERGE PRETEXT 7 NOSHOW
     SELECT turnos.hora,  NVL(pacientes.nombre,'') AS nombre, turnos.visita1,
        turnos.presente, turnos.atendido, NVL(obrsoc2.descripcio,'') as nomobr,
        NVL(pacientes.tele,'') AS TELE, turnos.codigo as orden,
        TRIM(turnos.observ) as observ, turnos.codigo, DATE_FORMAT(fecha,'%Y-%m-%d') AS fecha,
        NVL(pacientes.grupo,0) AS grupo,   turnos.medico, NVL(obrsoc,'') AS OBRSOC
     FROM turnos 
        LEFT JOIN PACIENTES 
          ON pacientes.grupo=turnos.grupo
        LEFT JOIN obrsoc2 
          ON obrsoc2.codigo=turnos.obrsoc
ENDTEXT
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.

Fernando Mauricio Romero Jones

unread,
Mar 30, 2020, 1:01:07 PM3/30/20
to publice...@googlegroups.com
1.Gracias por la sugerencia de usar TEXT, la voy a implementar. Tengo 50 años de edad y a veces me cuesta cambiar la forma en q lo venía haciendo desde mucho tiempo atras.
2. Por error de redacción nombre odb.sql(). Siempre use el odb.query(), quizás me traicionó lo que ultimamente intenté cambiando uno por el otro, incluso utilicé el odb.refresh. Pero el original q estoy usando en con odb.query()

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/32ac5e8d-2237-477f-845f-2da17faaedd4%40googlegroups.com.

Antonio Meza

unread,
Mar 30, 2020, 1:23:15 PM3/30/20
to Comunidad de Visual Foxpro en Español
Estas usando ahorita el odb.Refresh ? si es SI, no lo uses para ver si eso es, pero realmente pasaste todo el codigo de la función que crea el cursor??

Te pregunto porque pareciera que estas modificando el cursor después de que lo actualizas con Update y Commit y por eso el error del buffering.

saludos

Fernando Mauricio Romero Jones

unread,
Apr 1, 2020, 11:46:30 AM4/1/20
to publice...@googlegroups.com
Hola. Antonio.
Te comento que solucioné en inconveniente. Siguiendo tu consejo "....pareciera que estas modificando el cursor después de que lo actualizas con Update y Commit..." rearmé la función en la que genero el cursor de la siguiente manera.
1. Pregunto si esta abierto el cursor, si es asi lo guardo.
2. con odb.query genero nuevamente el cursor, es un cursor que se genera muchisimas veces porque es la pantalla principal en donde se cambia de profesional y sobre todo de día continuamente para ver los detalles de los turnos.

Sinceramente antes lo hacia de la misma manera pero en distintos eventos, en el dia.refresh guardaba y sin ninguna instrucción de por medio llamaba a regenerar el cursor (evidentemente habia algo intermedio q nunca supe que es), lo importante es que así funcionó. 
Gracias por tu ayuda, mil gracias.

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/af6d96e4-9b1f-4633-b876-c43eeaa02f1e%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages