FoxyDB: Se me detiene y pide presionar una tecla

146 views
Skip to first unread message

Alejandro Garcia G.

unread,
Apr 12, 2015, 4:40:06 PM4/12/15
to publice...@googlegroups.com

Saludos.

Desde hace unos días me he dispuesto a probrar a fondo esta libreria FoxyDB, me esta funcinando bien pero cuando hago esta inustrucción, primero meda este mensaje: Source is out of date y luego me pide presionar una cualquier tecla para continuar, reviso el seteo de mi programa, y esta todo bien para evitar mensajes y preionar teclas, pero continua y no se que debo hacer, tengo la version 1.15 (la ultima) y he mirado el codigo para ver si hay algo alli, nada, lo he recompilado, nada.


ErrorFoxydb.png

Alejandro Garcia G.

unread,
Apr 12, 2015, 4:42:19 PM4/12/15
to publice...@googlegroups.com
Se me ovlido, esta son las instrucciones que doy:

*!* Cargo y creo la instancia para las rutinas MySQL
oDb = NEWOBJECT("foxydb",".\Clases\FoxyDB\foxydb115.prg")
*!* Realizo la conexión a la base de datos (MOdificar para accedar con archivo .INI)
IF oDb.CONNECTION("{MySQL ODBC 3.51 Driver}", "127.0.0.1", "USUARIO", "CONTRASEÑA", "BASE DE DATOS", "3307")
    WAIT WINDOWS "Conectado al Servidor" NOWAIT
ELSE
    WAIT WINDOWS "Error de Conexión al Servidor, Código de Error:" + STR(oDb.error_Code)
ENDIF

El error me lo da en oDb.CONNECTION

Antonio Meza

unread,
Apr 12, 2015, 5:10:32 PM4/12/15
to publice...@googlegroups.com
Hola, que versión de Mysql usas ? y te recomiendo usar el Driver 5.1.

saludos
Antonio Meza

Alejandro Garcia G.

unread,
Apr 12, 2015, 5:15:24 PM4/12/15
to publice...@googlegroups.com
Antonio gracias por tu respuesta.

Te comento, tengo instalada la ultima versión de MySQL, pero el conector que uso es la versión 3.51, es con ralación a algo de un programa que estoy ahora dando soporte, aunque he buscado y no veo que me interfiera....

¿Me recomiendas usar la 5.1, no tendre problemas con mis bases de datos? (las bases me  han funcionado bien con la versión 5.1)

Antonio Meza

unread,
Apr 12, 2015, 5:19:58 PM4/12/15
to publice...@googlegroups.com
Si estas probando FoxyDb puedes tener instalado los dos Drivers y especificas en la cadena de conexión cual vas a usar, en cuanto a tener problemas no deberías, en su momento use el 3.51 y luego cambie al 5.1 y no he tenido problemas, pero por ejemplo puedo usar transacciones de solo lectura cosa que el driver 3.51 no permite.

Prueba si te puedes conectar usado TEST() 

saludos

Alejandro Garcia G.

unread,
Apr 12, 2015, 6:08:49 PM4/12/15
to publice...@googlegroups.com

Nada, ya lo instale y reinstale, la aplicacion con Driver 3.51 funciona bien. Ahora, las pruebas que hago, con la 3.51, me funciona con los detalles arriba mencionado, pero con la 5.1 no conecta para nada, simpre me da error -1  y este:
ErrorFoxydb2.png

Alejandro Garcia G.

unread,
Apr 12, 2015, 8:05:26 PM4/12/15
to publice...@googlegroups.com
Antonio, no quice abrir otro post para esta pregunta, ya que ví que me respondiste, te inquieto con otra:

Estaba haciendo las pruebas, y en una tengo un cursor con X registros, luego hago un SCAN...ENDSCAN en donde lo que hago es recorrer el cursor y voy haciendo un INSERT INTO a la tabla que llame con FoxyDB, pero cuando le doy guardar no lo hace, ¿estoy haicendo algo mal? mira mi código:

        * Abriendo un Cursor
        oDb.USE("tblvolantes alias crsvolantes")
        * Preparándolo para edición para agregar usuarios al catalogo
        oDb.CursorEdit("crsvolantes")

        * Agregamos un valor nuevo
        SELECT volantes
        SCAN
            SELECT crsvolantes
            INSERT INTO crsvolantes (cedula, nombre, numcomp, detalle, codcon, valpag, valdesc) ;
                VALUES (volantes.cedula, volantes.nombre, volantes.numcomp, volantes.detalle, volantes.codcon, volantes.valpag, volantes.valdesc)
        ENDSCAN
       
        * Si tenemos varios cursores en lo personal haría lo siguiente
        IF oDb.CHANGES()
            * Hay cambios en algún cursor, revisar en cual o cuales
            IF oDb.CursorChanges("crsvolantes")
                * Guardar
                * Confirmar si deseamos guardar
                IF MESSAGEBOX("¿Desea Guardar los Cambios?", 4 + 16, "Hay Cambios") = 6 && SI
                    * Actualizar Cambios en el servidor
                    IF oDb.UPDATE("crsvolantes")
                        IF oDb.SAVE()
                            WAIT WINDOWS "Registros Guardados"
                        ENDIF
                    ENDIF
                ELSE
                    * Deshacer los cambios
                    oDb.UNDO()
                ENDIF
            ENDIF
        ELSE
            * No se han realizado cambios
        ENDIF

Se supone que lo guarda pues me da el mensaje que sí lo hizo pero cuando busco la tabla origina el MySQL no veo nada agregado.

Antonio Meza

unread,
Apr 12, 2015, 9:35:06 PM4/12/15
to publice...@googlegroups.com
Pero como estas especificando el driver 5.1 ? y debes instalar la versión de 32bit porque la de 64 no funciona porq VFP es de 32 bit, Es decir Mysql el servidor puede ser a 64bit, pero el driver no, por la limitación de VFP, salvo que alguien le funcione y no sea correcto lo que digo.

saludos

Antonio Meza

unread,
Apr 12, 2015, 9:37:59 PM4/12/15
to publice...@googlegroups.com
Se ve completo el codigo, si esta raro, la tabla TBLVOLANTES al ejecutar el USE() te va a traer todos los registros que tenga y todos los campos si lo requieres asi? o solo requieres la tabla vacia?

Verificaste que el cursor crsvolantes después de que termina el SCAN si se vean de forma local los registros agregados?, recuerdo que alguien tenia un problema parecido y cambio al driver 5.1 y le corrigió varios detalles, seria muy bueno que pudieras realizar la prueba.

saludos
Antonio Meza

Alejandro Garcia G.

unread,
Apr 13, 2015, 9:25:54 AM4/13/15
to publice...@googlegroups.com
Gracias Antonio por todos tus comentarios.

Te comento, basicamente lo que hago (siempre sera igual) me dan un archivo .csv con una cantidad de registros que debo agregar en mi tabla tblvolantes, hasta ahora no tengo la necesidad de buscar si existen, en teoria estos nuevos registros en el plano no deben estar en la tabla. El proceso se realiza bien, yo, importo a una tabla temporal el archivo plano, luego realizo unos calculos y posterior intento grabar en la tabla tblvolantes, luego del SCAN (en donde lo llevo al cursor editalbe por FoxyDB), veo los registros agregados correctamente. Por esta razón coloque mi inquietud.

Como te comente en una respuesta mas arriba, ya instale el conector 5.1, sin embargo, no logro hacer que me conecte, cambio los parametros y siempre me da error, no comprendo por que, es mas he creado un DSN en ODBC tanto para el usuaro como para cualquier usuario pero nada.

Cuando uso el conector 3.51, me salen los mensajes del primer post pero el continua, conecta, traigo la infomración de la tabla, pero, no me la actualiza...Sigo intentando para ver que otra cosa podra ser...

Saludos.

Carton Jeston

unread,
Apr 13, 2015, 1:01:18 PM4/13/15
to publice...@googlegroups.com
Sobre esto me ha asaltado una duda. Desde hace unas semanas tengo el compilador VFP C++ en su version de 64 bits. Me gustaria probar compilar algun prg a modo de test de modo que reproduzca este fallo. La version exe final compilada si deberia funcionar con el 5.1 64 mientras que la 5.1 32 deberia funcionar en entorno foxpro.

¿algun prg y alguna base de datos alojada en internet donde hacer esa prueba? Bueno, eso si lo veis interesante.

Antonio Meza

unread,
Apr 13, 2015, 1:20:13 PM4/13/15
to publice...@googlegroups.com
Pero la maquina que usas tiene windows a 64bit ? si lo tienes puedes instalar mariadb a 64bit y le cambias el puerto, en vez de 3306 le pones 3310, y te bajas el driver 5.1 a 64bit solo que remplazara al de 32bit

saludos

Alejandro Garcia G.

unread,
Apr 13, 2015, 3:45:08 PM4/13/15
to publice...@googlegroups.com
No entendi bien lo ultimo pero lo tratare de realizar.

Antes de dar la configuración de mi equipo estoy haciendo esto y asún así me devuelve -1 el stringconnect:

? sqlstringconnect("driver={MySQL ODBC 5.1 Driver};SERVER="+oCd._IpServer+";DATABASE=mysql;uid=lucas;pwd=kanada;PORT="+oCd._puerto+";OPTION=25")

Mi equipo (en donde hago mis pruebas): Intel Core i5, con 8Gb de memoria, disco de 1T y sistema opertavio Windows 8.1 Pro de 64bits.

Instale la de 32 bits y nada, volvi a la de 64 pero nada...

Antonio Meza

unread,
Apr 13, 2015, 4:21:02 PM4/13/15
to publice...@googlegroups.com
Una cosa es el servidor Mysql que puede ser a 32 bit o a 64 bit y otra cosa es el driver ODBC que puede ser de 32 o 64, es decir.

Si tu maquina tiene windows 8.1 a 64bit entonces le instalas el servidor Mysql a 64bit y para conectarte vas a necesitar solo el driver ODBC de 32bit

Foxydb tiene una funcion llamada TEST() ahi cambia los valores e intenta conectarte.

saludos
Antonio Meza

Alejandro Garcia G.

unread,
Apr 13, 2015, 5:10:31 PM4/13/15
to publice...@googlegroups.com
Antonio, como siempre, no me queda mas que darte gracias por tu trabajo y paciencia para darlos las guias que requerimos. Este foro el mejor en el que he estado pues con gusto veo que todos realizan comentarios positivos a pesar de que, como yo, habemos algunos que nos demoramos un poco en comprender algunas cosas.

Bueno, ya arregle el detalle que me hizo publicar una petición, lo que hice fue, mire mi versión de MySQL (5.6.23 de 64bits) y luego, instale el conector 5.1 de 32bits y listo, me dio conexión, logre hacer una consulta con buenos resultados.

Ahora, publique luego del primer post que no me esta grabando la cursora que hice con FoxyDB y a la cual le hago un insert into de varios datos mediante un SCAN, todavia no se por que no me esta refrescando la tabla como tal en mi MySQL. El código esta mas arriba.

Gracias a todos.

Antonio Meza

unread,
Apr 13, 2015, 7:46:31 PM4/13/15
to publice...@googlegroups.com
Se me olvido preguntarte, estas usando tablas InnoDb ? porque mysql tiene varios tipos como MySam, etc.

Voy a sugerirte algunos detalles independientemente si vemos donde esta el error.

La tabla que vas a actualizar al hacer el USE() se trae todos los registros, comentas que no necesitas buscar si ya existen los registros previamente, por lo tanto no es necesario que viajen por la red todos los registros de la tabla si no les vas a dar ningún uso, entonces aplica un filtro para que el cursor sea vació, si el campo ID tiene otro nombre le pones el que uses, y quedaría así

  * Abriendo un Cursor vació para agregar registros
        oDb.USE("tblvolantes alias crsvolantes","where tblvolantes.id = -1")
        * Preparándolo para edición para agregar usuarios al catalogo
        oDb.CursorEdit("crsvolantes")

        * Agregamos un valor nuevo
        SELECT volantes 
        SCAN
*            SELECT crsvolantes NO es necesario este Select

            INSERT INTO crsvolantes (cedula, nombre, numcomp, detalle, codcon, valpag, valdesc) ;
                VALUES (volantes.cedula, volantes.nombre, volantes.numcomp, volantes.detalle, volantes.codcon, volantes.valpag, volantes.valdesc)
        ENDSCAN
        
        * Mostrar los registros agregados
        select crsvolantes
        brow

        * Si tenemos varios cursores en lo personal haría lo siguiente
        IF oDb.CHANGES()
            * Hay cambios en algún cursor, revisar en cual o cuales
            IF oDb.CursorChanges("crsvolantes")
            wait windows "Si hay cambios en crsvolantes"
                * Guardar
                * Confirmar si deseamos guardar
                IF MESSAGEBOX("¿Desea Guardar los Cambios?", 4 + 16, "Hay Cambios") = 6 && SI
                    * Actualizar Cambios en el servidor
                    IF oDb.UPDATE("crsvolantes")
                        wait windows "Si actualizo crsvolantes, registros actualizados: " + str(oDb.sql_Records)

                        IF oDb.SAVE()
                            WAIT WINDOWS "Registros Guardados"
                        ENDIF
                    ENDIF
                ELSE
                    * Deshacer los cambios
                    oDb.UNDO()
                ENDIF
            ENDIF
        ELSE
            wait windows "No se han realizado cambios"
        ENDIF

Lo ejecutas, checas que los wait, el brow contengan información y comentas.

saludos
Antonio Meza

Alejandro Garcia G.

unread,
Apr 14, 2015, 1:05:18 PM4/14/15
to publice...@googlegroups.com
Antonio gracias por todas tus respuestas.

Te comento las tablas son InnoDB todas; y en cuanto a tus sugerencias las seguí pero me da error esta instruccioón: IF oDb.UPDATE("crsvolantes"), aunque no me muestra cual es el error, le hice seguimiento, le coloque debug en .T., pero nada.

Antonio Meza

unread,
Apr 14, 2015, 2:07:47 PM4/14/15
to publice...@googlegroups.com
Cualquier función de Foxydb te devuelve un numero de error en la propiedad .error_Code, y luego en el código fuente de FoxyDb en la función UPDATE checa que significa ese numero de error

Agrega las dos lineas en negro para que lo muestre

                    IF oDb.UPDATE("crsvolantes")
                        wait windows "Si actualizo crsvolantes, registros actualizados: " + str(oDb.sql_Records)

                        IF oDb.SAVE()
                            WAIT WINDOWS "Registros Guardados"
                        ENDIF
                    ELSE
                        wait windows "error en Update: " + str(oDb.error_Code)
                    ENDIF


saludos
Antonio Meza

Alejandro Garcia G.

unread,
Apr 14, 2015, 3:13:29 PM4/14/15
to publice...@googlegroups.com
Me dice error en UPDATE -1


Alejandro Garcia G.

unread,
Apr 14, 2015, 3:14:31 PM4/14/15
to publice...@googlegroups.com
El resto de transacciones me las hace bien, pero allí me da ese error, no podré seguir mirando hasta dentro de unas 4 o 5 horas, pero les comentare despues.

Antonio Meza

unread,
Apr 14, 2015, 3:36:28 PM4/14/15
to publice...@googlegroups.com
Puedes poner la estructura de la tabla para ver si noto algo diferente.

saludos

Antonio Meza

unread,
Apr 14, 2015, 3:37:52 PM4/14/15
to publice...@googlegroups.com
Te recomiendo bajes la nueva version 1.18 saludos

Alejandro Garcia G.

unread,
Apr 14, 2015, 4:03:25 PM4/14/15
to publice...@googlegroups.com
Ok, aca te envio el script de la tabla en MySQL, te comento que ya actualice la versión de la libreria.

Gracias por tu colaboración.
tblvolantes.sql

Antonio Meza

unread,
Apr 14, 2015, 4:46:21 PM4/14/15
to publice...@googlegroups.com
ahh ya!!

El problema es que no tienes un campo Autoincrementable Primary key, es necesario para que la librería trabaje al 100% y a demás es algo que se usa en buenas practicas del diseño de base de datos.

Tienes un campo Primary Key que combina dos campos Carácter, ese lo puedes dejar así, pero como un indice o indice Único, pero no como primary key, eso normalmente lo hacíamos en tablas DBF

Agrega un nuevo campo llamado "id" tipo INT(10) o (11) en su valor predeterminado le dices que sea Autoincrementable y le agregas el indice Primary, otro detalle, es que en lo personal no permito valores Null, y por default a todos los campos le pongo un valor, si es numérico que sea 0, si es carácter que sea en blanco, si es fecha que sea "0000-00-00" para mysql y mariadb.

Te paso la estructura de la tabla

CREATE TABLE `tblvolantes` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`numcomp` VARCHAR(15) NOT NULL DEFAULT '',
`detalle` VARCHAR(100) NOT NULL DEFAULT '',
`valdesc` DECIMAL(12,0) NOT NULL DEFAULT '0',
`valpag` DECIMAL(12,0) NOT NULL DEFAULT '0',
`codcon` VARCHAR(35) NOT NULL DEFAULT '',
`cedula` VARCHAR(15) NOT NULL DEFAULT '',
`nombre` VARCHAR(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE INDEX `numcomp` (`numcomp`, `cedula`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
saludos
Antonio Meza

Francisco

unread,
Apr 15, 2015, 1:36:53 PM4/15/15
to publice...@googlegroups.com
Antonio, podrías poner el ejemplo de una tabla padre, hija como haces las actualizaciones...

Saludos.

Antonio Meza

unread,
Apr 15, 2015, 4:44:11 PM4/15/15
to publice...@googlegroups.com
Si claro, suponiendo que tienes una tabla Encabezado y una tabla Detalle, y la estructura básica para que funcione debe ser la siguiente:

Encabezado
ID Int (promary key autoincrementable)
* Aquí los demás campos opcionales

Detalle
ID Int (promary key autoincrementable)
IdEncabezado int
* Aquí los demás campos opcionales

Si los campos ID de las dos tablas usas nombre diferente se tienen que especificar, en lo personal me es mas fácil usar esta estructura de nombres de campos ID y de campos relacionados, pero ya es cuestión de gustos.

Ya para actualizar seria algo así, sencillito y carismático como dicen los Argentinos jejej

El siguiente código funciona de forma general, es decir tanto para un registro nuevo o si estas editando un registro ya guardado, si cambiaste solo algo en la tabla encabezado, o solo modificaste algo de la tabla detalle, por eso es super importante usar campos ID autoincrementables en todas las tablas que vayan a administrar con FoxyDb te facilita el acceso a datos enormemente, y para prueba un botón jejej  

LOCAL _RegistroNuevo, _UltimoId

* Saber si es un registro Nuevo
_RegistroNuevo = .f.
* Ultimo ID insertado en Encabezado
_UltimoId = 0

* Revisar si hay Cambios en el formulario, todas los cursores abiertos con Query() y Use()
IF oDb.CHANGES()
   * Revisar Cambios en Tabla Encabezado
   IF oDb.CursorChanges("encabezado")
* Actualizar Cambios en el servidor, el .t. es para Obtener ultimo ID
       IF oDb.UPDATE("clientes",.t.)
        _UltimoId = oDb.id_last
        IF _UltimoId <> 0 
        _RegistroNuevo = .t.
ENDIF
ELSE
* Error al Actualizar Encabezado
RETURN .f.
ENDIF
ENDIF
* Revisar en Tabla Detalles
   IF oDb.CursorChanges("detalles")
    * Verificar si es registro nuevo y reemplazar ID de encabezado en IdEncabezado
    IF _RegistroNuevo
    replace detalles.idEncabezado WITH _UltimoId IN detalles ALL
    ENDIF
* Actualizar Cambios en el servidor, no es necesario obtener el ultimo ID
       IF oDb.UPDATE("detalles")
        * Listo cambios actualizados
       ELSE
        * Error al actualizar Detalles
RETURN .f.
ENDIF
ENDIF
        * Confirmar cambios
       IF oDb.SAVE()
           WAIT WINDOWS "Registro Guardado"
           RETURN .t.
ELSE
* Error al aplicar Commit
RETURN .f.
   ENDIF
ELSE
   * No se han realizado cambios
ENDIF
Reply all
Reply to author
Forward
0 new messages