FoxyDb. Pasar los datos de la BD al formulario o desde el formulario a la BD

603 views
Skip to first unread message

Programador Desarrollador

unread,
Mar 19, 2015, 4:30:58 PM3/19/15
to publice...@googlegroups.com
Señores, desde hace varios dias he estado tratando de usar la libreria FoxyDb de Antonio Meza con la BD de Firebird, me conecto y consulto la BD por medio del siguiente codigo:


INICIO.PRG

*------------------------------------------------------------
CLEAR
SET DEFAULT TO "F:\VFP\FoxyDb - Librería de conexión a Servidores de Bases de Datos desde VFP (Antonio Meza)\PROBANDO"

Public oDb
oDb = NEWOBJECT("foxydb","foxydb.prg")
? oDb.Version
? oDb.test()
? oDb.Connect()
? oDb.engine_version()

? odb.sql("SET TRANSACTION READ ONLY")

?oDb.Sql("Select * from USUARIO","USUARIO")
browse

PUBLIC SW
SW=0
DO FORM PRUEBAS3.scx
*------------------------------------------------------------



Lo que no se es como pasar los datos (registro) a los cuadro de texto en el formulario o vicebersa, cuando quiera consultarlos o guardarlos en la base de datos. Este el el formulario que utilizo.


PRUEBAS3.SCX

*------------------------------------------------------------
PUBLIC ofrmpruebas

ofrmpruebas=NEWOBJECT("frmpruebas")
ofrmpruebas.Show
RETURN

    **************************************************
*-- Form:         frmpruebas (f:\vfp\foxydb - librería de conexión a servidores de bases de datos desde vfp (antonio meza)\probando\pruebas3.scx)
*-- ParentClass:  form
*-- BaseClass:    form
*-- Time Stamp:   03/19/15 03:23:14 PM
*
DEFINE CLASS frmpruebas AS form

    Height = 313
    Width = 575
    DoCreate = .T.
    AutoCenter = .T.
    Caption = "Probando FoxyDb - Librería de conexión a Servidores de Bases de Datos desde VFP (Antonio Meza)"
    Closable = .F.
    FontSize = 10
    MaxButton = .F.
    MinButton = .F.
    Name = "FrmPRUEBAS"

    ADD OBJECT txtidus AS textbox WITH ;
        Enabled = .F., ;
        Height = 23, ;
        Left = 112, ;
        TabIndex = 3, ;
        Top = 12, ;
        Width = 86, ;
        Name = "txtIDUS"

    ADD OBJECT txtnombres AS textbox WITH ;
        Enabled = .F., ;
        Format = "!A", ;
        Height = 23, ;
        InputMask = "", ;
        Left = 101, ;
        MaxLength = 30, ;
        TabIndex = 5, ;
        Top = 48, ;
        Width = 420, ;
        Name = "txtNOMBRES"

    ADD OBJECT txtapellidos AS textbox WITH ;
        Enabled = .F., ;
        Format = "!A", ;
        Height = 23, ;
        InputMask = "", ;
        Left = 109, ;
        MaxLength = 30, ;
        TabIndex = 6, ;
        Top = 92, ;
        Width = 411, ;
        Name = "txtAPELLIDOS"

    ADD OBJECT txtusuario AS textbox WITH ;
        Enabled = .F., ;
        Format = "!", ;
        Height = 23, ;
        Left = 100, ;
        MaxLength = 10, ;
        TabIndex = 7, ;
        Top = 148, ;
        Width = 100, ;
        Name = "txtUSUARIO"

    ADD OBJECT txtclave AS textbox WITH ;
        Enabled = .F., ;
        Format = "!", ;
        Height = 23, ;
        Left = 421, ;
        MaxLength = 10, ;
        TabIndex = 8, ;
        Top = 150, ;
        Width = 100, ;
        Name = "txtCLAVE"

    ADD OBJECT cmdnuevo AS commandbutton WITH ;
        Top = 210, ;
        Left = 18, ;
        Height = 27, ;
        Width = 84, ;
        Caption = "\<NUEVO", ;
        Enabled = .T., ;
        TabIndex = 9, ;
        Name = "cmdNUEVO"

    ADD OBJECT cmdconsultar AS commandbutton WITH ;
        Top = 210, ;
        Left = 106, ;
        Height = 27, ;
        Width = 84, ;
        Caption = "\<CONSULTAR", ;
        Enabled = .T., ;
        TabIndex = 10, ;
        Name = "cmdCONSULTAR"

    ADD OBJECT cmdmodificar AS commandbutton WITH ;
        Top = 210, ;
        Left = 194, ;
        Height = 27, ;
        Width = 84, ;
        Caption = "\<MODIFICAR", ;
        Enabled = .F., ;
        TabIndex = 11, ;
        Name = "cmdMODIFICAR"

    ADD OBJECT cmdeliminar AS commandbutton WITH ;
        Top = 210, ;
        Left = 282, ;
        Height = 27, ;
        Width = 84, ;
        Caption = "\<ELIMINAR", ;
        Enabled = .F., ;
        TabIndex = 12, ;
        Name = "cmdELIMINAR"

    ADD OBJECT cmdsalir AS commandbutton WITH ;
        Top = 267, ;
        Left = 245, ;
        Height = 27, ;
        Width = 84, ;
        Caption = "\<SALIR", ;
        TabIndex = 15, ;
        Name = "cmdSALIR"

    ADD OBJECT cmdguardar AS commandbutton WITH ;
        Top = 210, ;
        Left = 370, ;
        Height = 27, ;
        Width = 84, ;
        Caption = "\<GUARDAR", ;
        Enabled = .F., ;
        TabIndex = 13, ;
        Name = "cmdGUARDAR"

    ADD OBJECT cmddeshacer AS commandbutton WITH ;
        Top = 210, ;
        Left = 458, ;
        Height = 27, ;
        Width = 84, ;
        Caption = "DES\<HACER", ;
        Enabled = .F., ;
        TabIndex = 14, ;
        Name = "cmdDESHACER"

    ADD OBJECT txtcredencial AS textbox WITH ;
        Enabled = .F., ;
        Format = "K", ;
        Height = 23, ;
        Left = 398, ;
        MaxLength = 8, ;
        TabIndex = 4, ;
        Top = 12, ;
        Width = 122, ;
        ForeColor = RGB(0,0,0), ;
        Name = "txtCREDENCIAL"

    ADD OBJECT lblidus AS label WITH ;
        AutoSize = .T., ;
        BackStyle = 0, ;
        Caption = "ID USUARIO:", ;
        Enabled = .F., ;
        Height = 17, ;
        Left = 28, ;
        Top = 15, ;
        Width = 74, ;
        TabIndex = 19, ;
        Name = "lblIDUS"

    ADD OBJECT lblcredencial AS label WITH ;
        AutoSize = .T., ;
        BackStyle = 0, ;
        Caption = "CREDENCIAL:", ;
        Enabled = .F., ;
        Height = 17, ;
        Left = 305, ;
        Top = 16, ;
        Width = 83, ;
        TabIndex = 20, ;
        Name = "lblCREDENCIAL"

    ADD OBJECT lblnombres AS label WITH ;
        AutoSize = .T., ;
        BackStyle = 0, ;
        Caption = "NOMBRES:", ;
        Enabled = .F., ;
        Height = 17, ;
        Left = 28, ;
        Top = 51, ;
        Width = 65, ;
        TabIndex = 21, ;
        Name = "lblNOMBRES"

    ADD OBJECT lblapellidos AS label WITH ;
        AutoSize = .T., ;
        BackStyle = 0, ;
        Caption = "APELLIDOS:", ;
        Enabled = .F., ;
        Height = 17, ;
        Left = 28, ;
        Top = 95, ;
        Width = 71, ;
        TabIndex = 22, ;
        Name = "lblAPELLIDOS"

    ADD OBJECT lblusuario AS label WITH ;
        AutoSize = .T., ;
        BackStyle = 0, ;
        Caption = "USUARIO:", ;
        Enabled = .F., ;
        Height = 17, ;
        Left = 28, ;
        Top = 151, ;
        Width = 59, ;
        TabIndex = 23, ;
        Name = "lblUSUARIO"

    ADD OBJECT lblclave AS label WITH ;
        AutoSize = .T., ;
        BackStyle = 0, ;
        Caption = "CLAVE:", ;
        Enabled = .F., ;
        Height = 17, ;
        Left = 365, ;
        Top = 153, ;
        Width = 43, ;
        TabIndex = 24, ;
        Name = "lblCLAVE"

    ADD OBJECT line1 AS line WITH ;
        Height = 0, ;
        Left = 24, ;
        Top = 132, ;
        Width = 504, ;
        Name = "Line1"

    ADD OBJECT line2 AS line WITH ;
        Height = 0, ;
        Left = 25, ;
        Top = 184, ;
        Width = 504, ;
        Name = "Line2"

    PROCEDURE Init
        PUBLIC SW,cmdN,cmdC,cmdM,cmdE
        SW=0
        cmdN=0
        cmdC=0
        cmdM=0
        cmdE=0
    ENDPROC

    PROCEDURE cmdnuevo.Click
        IF SW=0
            cmdN=1
            THISFORM.lblCREDENCIAL.ENABLED=.T.
            THISFORM.txtCREDENCIAL.ENABLED=.T.
            THISFORM.lblNOMBRES.ENABLED=.T.
            THISFORM.txtNOMBRES.ENABLED=.T.
            THISFORM.lblAPELLIDOS.ENABLED=.T.
            THISFORM.txtAPELLIDOS.ENABLED=.T.
            THISFORM.lblUSUARIO.ENABLED=.T.
            THISFORM.txtUSUARIO.ENABLED=.T.
            THISFORM.lblCLAVE.ENABLED=.T.
            THISFORM.txtCLAVE.ENABLED=.T.
            THISFORM.cmdNUEVO.ENABLED=.F.
            THISFORM.cmdCONSULTAR.ENABLED=.F.
            THISFORM.cmdMODIFICAR.ENABLED=.F.
            THISFORM.cmdELIMINAR.ENABLED=.F.
            THISFORM.cmdGUARDAR.ENABLED=.T.
            THISFORM.cmdDESHACER.ENABLED=.T.
            THISFORM.cmdSALIR.ENABLED=.F.
            THISFORM.txtCREDENCIAL.SETFOCUS
        ENDIF
    ENDPROC

    PROCEDURE cmdconsultar.Click
        *IF SW=0
            THISFORM.lblCREDENCIAL.ENABLED=.T.
            THISFORM.txtCREDENCIAL.ENABLED=.T.
            THISFORM.lblNOMBRES.ENABLED=.F.
            THISFORM.txtNOMBRES.ENABLED=.F.
            THISFORM.lblAPELLIDOS.ENABLED=.F.
            THISFORM.txtAPELLIDOS.ENABLED=.F.
            THISFORM.lblUSUARIO.ENABLED=.F.
            THISFORM.txtUSUARIO.ENABLED=.F.
            THISFORM.lblCLAVE.ENABLED=.F.
            THISFORM.txtCLAVE.ENABLED=.F.
            THISFORM.cmdNUEVO.ENABLED=.F.
            THISFORM.cmdCONSULTAR.ENABLED=.F.
            THISFORM.cmdMODIFICAR.ENABLED=.F.
            THISFORM.cmdELIMINAR.ENABLED=.F.
            THISFORM.cmdGUARDAR.ENABLED=.F.
            THISFORM.cmdDESHACER.ENABLED=.T.
            THISFORM.cmdSALIR.ENABLED=.F.
            THISFORM.txtCREDENCIAL.SETFOCUS
            cmdC=1
        *ENDIF
    ENDPROC

    PROCEDURE cmdmodificar.Click
        cmdM=1
        cmdC=0
        *IF cmdC=1
        *    THISFORM.lblCREDENCIAL.ENABLED=.T.
        *    THISFORM.txtCREDENCIAL.ENABLED=.T.
            THISFORM.lblNOMBRES.ENABLED=.T.
            THISFORM.txtNOMBRES.ENABLED=.T.
        *    THISFORM.txtNOMBRES.DisabledBackColor=RGB(255,255,255)
            THISFORM.lblAPELLIDOS.ENABLED=.T.
            THISFORM.txtAPELLIDOS.ENABLED=.T.
        *    THISFORM.txtAPELLIDOS.DisabledBackColor=RGB(255,255,255)
            THISFORM.lblUSUARIO.ENABLED=.T.
            THISFORM.txtUSUARIO.ENABLED=.T.
        *    THISFORM.txtUSUARIO.DisabledBackColor=RGB(255,255,255)
            THISFORM.lblCLAVE.ENABLED=.T.
            THISFORM.txtCLAVE.ENABLED=.T.
        *    THISFORM.txtCLAVE.DisabledBackColor=RGB(255,255,255)
        *    THISFORM.cmdNUEVO.ENABLED=.F.
        *    THISFORM.cmdCONSULTAR.ENABLED=.F.
            THISFORM.cmdMODIFICAR.ENABLED=.F.
            THISFORM.cmdELIMINAR.ENABLED=.F.
            THISFORM.cmdGUARDAR.ENABLED=.T.
        *    THISFORM.cmdDESHACER.ENABLED=.T.
        *    THISFORM.cmdSALIR.ENABLED=.F.
            THISFORM.txtCREDENCIAL.SETFOCUS
        *ENDIF
    ENDPROC

    PROCEDURE cmdeliminar.Click
        cmdE=1
        THISFORM.cmdMODIFICAR.ENABLED=.F.
        THISFORM.cmdELIMINAR.ENABLED=.F.
        THISFORM.cmdGUARDAR.ENABLED=.T.
        nRespMens=MESSAGEBOX("Está seguro que desea eliminar este registro",4+32+256,"Advertencia")
        IF nRespMens=6
        *    THISFORM.verificar
        ELSE
            THISFORM.cmdDESHACERR.Click
        ENDIF
    ENDPROC

    PROCEDURE cmdsalir.Click
        * Salir del programa
        Thisform.Release
    ENDPROC

    PROCEDURE cmdguardar.Click
        *THISFORM.verificar
    ENDPROC

    PROCEDURE cmddeshacer.Click
        * Habilitar y deshabilitar botones y cuadros de texto
        THISFORM.cmdDESHACER.ENABLED=.F.
        THISFORM.lblCREDENCIAL.ENABLED=.F.
        THISFORM.txtCREDENCIAL.VALUE=" "
        THISFORM.txtCREDENCIAL.ENABLED=.F.
        THISFORM.lblNOMBRES.ENABLED=.F.
        THISFORM.txtNOMBRES.VALUE=" "
        THISFORM.txtNOMBRES.ENABLED=.F.
        THISFORM.lblAPELLIDOS.ENABLED=.F.
        THISFORM.txtAPELLIDOS.VALUE=" "
        THISFORM.txtAPELLIDOS.ENABLED=.F.
        THISFORM.lblUSUARIO.ENABLED=.F.
        THISFORM.txtUSUARIO.VALUE=" "
        THISFORM.txtUSUARIO.ENABLED=.F.
        THISFORM.lblCLAVE.ENABLED=.F.
        THISFORM.txtCLAVE.VALUE=" "
        THISFORM.txtCLAVE.ENABLED=.F.
        THISFORM.cmdNUEVO.ENABLED=.T.
        THISFORM.cmdCONSULTAR.ENABLED=.T.
        THISFORM.cmdMODIFICAR.ENABLED=.F.
        THISFORM.cmdELIMINAR.ENABLED=.F.
        THISFORM.cmdGUARDAR.ENABLED=.F.
        THISFORM.cmdDESHACER.ENABLED=.F.
        **THISFORM.cmdSALIR.ENABLED=.T.
        **THISFORM.cmdSALIR.SETFOCUS
        THISFORM.cmdCONSULTAR.SETFOCUS
        *IF cmdC=1
        *    THISFORM.lblCREDENCIAL.ENABLED=.T.
        *    THISFORM.txtCREDENCIAL.ENABLED=.T.
        *    THISFORM.lblNOMBRES.ENABLED=.T.
        *    THISFORM.txtNOMBRES.ENABLED=.F.
            THISFORM.txtNOMBRES.DisabledBackColor=RGB(224,223,227)
        *    THISFORM.lblAPELLIDOS.ENABLED=.T.
        *    THISFORM.txtAPELLIDOS.ENABLED=.F.
            THISFORM.txtAPELLIDOS.DisabledBackColor=RGB(224,223,227)
        *    THISFORM.lblUSUARIO.ENABLED=.T.
        *    THISFORM.txtUSUARIO.ENABLED=.F.
            THISFORM.txtUSUARIO.DisabledBackColor=RGB(224,223,227)
        *    THISFORM.lblCLAVE.ENABLED=.T.
        *    THISFORM.txtCLAVE.ENABLED=.F.
            THISFORM.txtCLAVE.DisabledBackColor=RGB(224,223,227)
        *    THISFORM.cmdNUEVO.ENABLED=.F.
        *    THISFORM.cmdCONSULTAR.ENABLED=.F.
        *    THISFORM.cmdMODIFICAR.ENABLED=.T.
        *    THISFORM.cmdELIMINAR.ENABLED=.T.
        *    THISFORM.cmdGUARDAR.ENABLED=.F.
        *    THISFORM.cmdDESHACER.ENABLED=.F.
        *    THISFORM.cmdSALIR.ENABLED=.F.
        *    THISFORM.txtCREDENCIAL.SETFOCUS
        *ENDIF
        SW=0
        cmdN=0
        cmdC=0
        cmdM=0
        cmdE=0
    ENDPROC

    PROCEDURE txtcredencial.LostFocus
        THIS.VALUE = TRANSFORM(THIS.VALUE)
        THIS.FORMAT = "KR"
        THIS.INPUTMASK = "99.999.999"
        THIS.INPUTMASK = RIGHT(THIS.INPUTMASK, LEN(THIS.VALUE) + ICASE(LEN(THIS.VALUE) > 6, 2, LEN(THIS.VALUE) > 3, 1, 0))
        THIS.REFRESH()

        IF cmdN=1 OR cmdC=1
            IF THISFORM.txtCREDENCIAL.VALUE=" " OR THISFORM.txtCREDENCIAL.VALUE="0"
                THISFORM.txtCREDENCIAL.VALUE=" "
        *    ENDIF
            ELSE
                IF cmdC=1
        *            THISFORM.btnDesconectar.Enabled=.F.
        *            THISFORM.lblCREDENCIAL.ENABLED=.T.
        *            THISFORM.txtCREDENCIAL.ENABLED=.T.
                    THISFORM.lblNOMBRES.ENABLED=.T.
                    THISFORM.txtNOMBRES.ENABLED=.F.
                    THISFORM.txtNOMBRES.DisabledBackColor=RGB(255,255,255)
                    THISFORM.lblAPELLIDOS.ENABLED=.T.
                    THISFORM.txtAPELLIDOS.ENABLED=.F.
                    THISFORM.txtAPELLIDOS.DisabledBackColor=RGB(255,255,255)
                    THISFORM.lblUSUARIO.ENABLED=.T.
                    THISFORM.txtUSUARIO.ENABLED=.F.
                    THISFORM.txtUSUARIO.DisabledBackColor=RGB(255,255,255)
                    THISFORM.lblCLAVE.ENABLED=.T.
                    THISFORM.txtCLAVE.ENABLED=.F.
                    THISFORM.txtCLAVE.DisabledBackColor=RGB(255,255,255)
        *            THISFORM.cmdNUEVO.ENABLED=.F.
        *            THISFORM.cmdCONSULTAR.ENABLED=.F.
                    THISFORM.cmdMODIFICAR.ENABLED=.T.
                    THISFORM.cmdELIMINAR.ENABLED=.T.
        *            THISFORM.cmdGUARDAR.ENABLED=.F.
        *            THISFORM.cmdDESHACER.ENABLED=.T.
        *            THISFORM.cmdSALIR.ENABLED=.F.
                    THISFORM.cmdDESHACER.SETFOCUS
                ENDIF
            ENDIF
        ENDIF
    ENDPROC

    PROCEDURE txtcredencial.GotFocus
        THIS.VALUE = VAL(THIS.VALUE)
        THIS.INPUTMASK = "99,999,999"
    ENDPROC
ENDDEFINE
*
*-- EndDefine: frmpruebas
**************************************************


Agradesco la ayuda y/o tips que me puedan dar para desplegar los datos (registro) de la BD a los cuadro de texto en el formulario, o cuando quiera guardarlos en la base de datos.

Gracias

Antonio Meza

unread,
Mar 19, 2015, 6:06:01 PM3/19/15
to publice...@googlegroups.com
Hola, tienes que leer los ejemplos, estas activando una transacción que Foxydb hace en automático, esta de mas esta linea

? odb.sql("SET TRANSACTION READ ONLY")

Luego usa mejor Query y no SQL

?oDb.Query("Select * from USUARIO","USUARIO")
browse

Y esto te devuelve una tabla llamada usuarios, solo tienes que a un textbox por ejemplo asignarle el campo

thisform.textbox1.controlsource = "usuarios.nombre"

Pero es importante que leas los ejemplos para que te sea mas facil.

saludos
Antonio Meza

Programador Desarrollador

unread,
Mar 27, 2015, 1:17:06 PM3/27/15
to publice...@googlegroups.com
Antonio gracias por responderme. Estube hojeando y lee que lee el manual varias veces probando pero con la mala costumbre de muchos años trabajando con DBF que no he podido saber como asignar lo correspondiente a los botones para cuando quiera crear un registro NUEVO, CONSULTAR, MODIFICAR, ELIMINAR, GUARDAR, DESHACER, SALIR

Agradesco si pueden echarme una mano por favor.

Nota: es mi primera experincia con SGBD

Antonio Meza

unread,
Mar 27, 2015, 4:46:50 PM3/27/15
to publice...@googlegroups.com
Hola!!

Estoy trabajando en mis ratos libres en un formulario de ejemplo, espero terminarlo el fin de semana y publicarlo

saludos
Antonio Meza

Programador Desarrollador

unread,
Mar 30, 2015, 10:16:50 AM3/30/15
to publice...@googlegroups.com
Buenas Antonio, okey gracias señor espero su publicacion del formulario de ejemplo, gracias.

José Luis

unread,
Mar 31, 2015, 6:36:08 AM3/31/15
to publice...@googlegroups.com
Me sumo al tambien.


>Antonio Meza
27 de mar.
>Hola!!

>Estoy trabajando en mis ratos libres en un formulario de ejemplo, espero terminarlo el fin de semana y publicarlo

>saludos
>Antonio Meza

José Luis

unread,
Apr 5, 2015, 6:32:09 AM4/5/15
to publice...@googlegroups.com
Buenos días a todos. Alguien sabe si el Sr. Antonio Meza habra publicado el Formulario de Ejemplo de VFP y FoxyDB para la BD de Firebird.


>Estoy trabajando en mis ratos libres en un formulario de ejemplo, espero terminarlo el fin de semana y publicarlo

Saludos

Programador Desarrollador

unread,
Apr 6, 2015, 12:06:57 PM4/6/15
to publice...@googlegroups.com
Antonio nuevamente le doy las gracias por su respuesta y colaboracion, quedo a la espera del formulario ejemplo para asi por fin aprender a trabajar con SGBD FireBird






El jueves, 19 de marzo de 2015, 16:00:58 (UTC-4:30), Programador Desarrollador escribió:

Francisco

unread,
Apr 9, 2015, 12:25:08 PM4/9/15
to publice...@googlegroups.com
Lo que realmente no aprecio bien es cuando establecer y desconectar del servidor. Me refiero ha si conecto en el load del formulario me traigo los cursores y luego cierro la conexion para cuando tenga que hacer update volver a conectar o simplemente lo dejo sin hacer disconnect y cuando cierro el form lo hago... ahí es donde tengo las dudas de cual es la mejor forma utilizando esta herramienta. Espero tengas el ejemplo terminado a ver si puedo ver o aclarar un poco la info.

Antonio Meza

unread,
Apr 9, 2015, 12:51:31 PM4/9/15
to publice...@googlegroups.com
Hola!!

Eh estado muy atorado de tiempo y no pude terminar el formulario, le voy a invertir tiempo en la noche y espero tenerlo listo para mañana temprano.

saludos
Antonio Meza

Francisco

unread,
Apr 9, 2015, 1:06:51 PM4/9/15
to publice...@googlegroups.com
Muchísimas gracias por tu trabajo, estoy aplicando poco a poco a mi aplicación esta rutina y creo que tiene muy buena pinta. Espero ver el ejemplo para plantearte unas dudas sobre metodos de actualización en red y conflictos que puedan existir así como la gestión de los mismos por parte de la rutina. Aparte de esas pequeñas cosas estoy en MariaDb y MySQL y todo funciona muy bien y rápido.

Saludos.

Antonio Meza

unread,
Apr 9, 2015, 1:09:14 PM4/9/15
to publice...@googlegroups.com
Hola Francisco!!

Te comento que el tema de conexión y desconexión no esta muy bien depurado o mas bien probado puede tener sus detalles ya que actualmente no lo uso, solo hice pequeñas pruebas pero como el servidor esta en la red local no lo uso, pero si alguien lo usa y detecta un problema me dice para corregirlo.

Las mejores practicas dicen que al servidor de base de datos te debes conectar solo cuando tengas la necesidad de realizar algo en el y no estar siempre conectado, es algo difícil de aceptar para mucho pero eso es lo mejor.

En lo personal cuando abren un formulario no me conecto al servidor hasta que el usuario realiza una acción, esto me permite que el formulario abre rápido, a veces los usuarios entran por error y ya se solicito al servidor un montón de información y el usuario da cerrar al formulario y de nada sirvió, por eso en mi caso lo abro y ya si va a dar un cliente nuevo, o buscar entonces solicito los datos al servidor.

La ventaja de FoxyDb es que todo esta separado, y une lo mejor de dos mundos jajaj es decir los CURSORES de VFP con el acceso a un servidor de base de datos y esta relación permite obtener cursores que se administran desde VFP y luego generar las sentencias o comandos SQL para enviar al servidor y por lo tanto no es necesario estar siempre conectado.

Los pasos serian mas o menos así para un formulario de catalogo de Clientes

* Conectarse al servidor
* Obtener cursores de datos como: Catálogos (Provincias, Países), cursor de clientes vació
* Desconectarse del servidor
* El usuario va agregar un cliente nuevo (ya trabaja sobre los cursores no necesita nada del servidor)
* Agregas un registro nuevo al cursor Clientes, etc.
* El usuario va a guardar
* Te conectas al servidor
* Guardas la informacion
* Te desconectas del servidor.

El proceso de conexión y desconexion son automáticos usando las propiedades de FoxyDb, es decir no tienes que estar manualmente llamando a Connect() y Disconnect().

saludos
Antonio Meza

Programador Desarrollador

unread,
Apr 13, 2015, 5:19:43 PM4/13/15
to publice...@googlegroups.com
Uffff; hasta los actuales momentos no he podido saber usar ni comprender correctamente el FoxyDb de Antonio Meza con la BD de Firebird desde el Formulario antes expuesto. Motivo a la costumbre con los codigos para las BD y Tablas nativas del VFP.

Si alguien me pudiese ayudar a saber que codigos coloco en los respectivos botones del formulario:

NUEVO
CONSULTAR
MODIFICAR
ELIMINAR
GUARDAR
DESHACER
SALIR




El jueves, 19 de marzo de 2015, 16:00:58 (UTC-4:30), Programador Desarrollador escribió:

Antonio Meza

unread,
Apr 13, 2015, 5:56:16 PM4/13/15
to publice...@googlegroups.com
ya casi termino el ejemplo, en la noche lo subo.

saludos

Antonio Meza

unread,
Apr 13, 2015, 7:13:40 PM4/13/15
to publice...@googlegroups.com
Te adelanto algo, las funciones que debes utilizar según el botón, para una tabla llamada CLIENTES en el servidor..Pero es importante que empieces hacer tus pruebas y donde no puedas mandas el mensaje y lo revisamos.
 
NUEVO

    Tienes que hacer una consulta a la tabla CLIENTES que te devuelva un cursor vació, puedes usar dos funciones USE() o QUERY(), lo puedes hacer de otra forma (Nota: para ejemplo siempre use el Select *, pero nunca debes usar el asterisco debes especificar todos los campos)

oDb.Use("Clientes","where id = -1")
oDb.Query("Select * from clientes where id = -1")

Con esto ya tienes un cursor en memoria llamado CLIENTES al cual le puedes agregar un registro o varios según tu necesidad, si es un catalogo de clientes lo normal es solo agregar un registro y ya usas comandos de VFP, por ejemplo Append Blank o Insert Into y luego usar replace, etc.

 
CONSULTAR
Para realizar consultas pueden ser de muchas formas, todo depende para que sea la consulta, suponiendo que es para consultar un cliente registrado, lo normal es traer un cursor con la lista de los clientes, y luego obtener otro cursor solo con el cliente que vas a consultar, esto por si vas a dar la opción de buscar por nombre o clave, entonces seria algo así

odb.Sql("Select id,cliente_nombre from clientes","listado_clientes")

Como solo vamos a obtener un cursor en el cual nos servirá de consulta no necesitamos administrarlo, es decir no le vamos a agregar o eliminar o modificar algún registro por eso se usa SQL()

Para obtener el cursor ya con los datos completos podemos usar USE() o QUERY() ya es al gusto de cada quien, en lo personal uso QUERY(), ya que estas dos funciones nos permiten administrar el cursor devuelto por si deseamos modificarlo, eliminarlo, etc.

oDb.USE("clientes","where id = ?listado_clientes.id")
oDb.Query("Select * from clientes where id = ?listado_clientes.id")
 
MODIFICAR

Cuando ya tienes el cursor devuelto en el ejemplo de arriba, solo hay que decirle que sera un cursor de edición, con la siguiente función

oDb.CursorEdit("clientes")

Esto lo que hace internamente aplica un Buffering 5 al cursor
 
ELIMINAR

Para eliminar un registro de una tabla hay muchas formas, lo mas sencillo es que si ya tenes el registro localizado o mostrando en pantalla como lo obtuvimos den el boton de CONSULTA, pues solo tienes que eliminarlo y seria asi
Select clientes
delete 

Otra forma seria
Select clientes
delete for clientes.id = listado_clientes,id

 
GUARDAR

Para guardar los cambios primero se tienen que enviar a actualizar los registros al servidor y luego confirmar si todo salio bien, en lo personal primero verifico si hay cambios en algún cursor, y luego verifico por cursor para saber en cual hubo cambios y enviar a actualizarlo, ya que todos mis cursores fueron actualizados y no hubo ningún error, entonces confirmo, si algo salio mal entonces cancelo.

 * 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("clientes")
                    * Actualizar Cambios en el servidor
                    IF oDb.UPDATE("clientes")
                        * Confirmar cambios
                        IF oDb.SAVE()
                            WAIT WINDOWS "Registro Guardado"
                        ENDIF
                    ENDIF
            ENDIF
        ELSE
            * No se han realizado cambios
        ENDIF
 
DESHACER

Pues si quiere verificar si hay cambios o directamente deshacer todo
     oDb.UNDO()
 
SALIR

Normalmente verifico que si no hay cambios para avisarle al usuario que esta intentando salir y no a guardado, o cerrar los cursores abiertos (mucho cuidado) y según sea el caso también podría ver si esta conectado al servidor y desconectarlo, 

IF oDb.Changes() 
   * hay cambios pendientes
ENDIF

* Desconectar
oDb.Discconect() 

* Cerrar los cursores 
oDb.Close()

* tambien esta esta función para cerrar todo.
oDb.End() 

saludos
Antonio Meza
 

Carton Jeston

unread,
Apr 14, 2015, 4:36:49 AM4/14/15
to publice...@googlegroups.com
ATENCION: Es "otra" idea o concepto no un codigo operativo (no quiero marear al personal)


Yo crearia una funcion de nivel superior incluyendo todo esto .... UPDATECHANGES()

        IF oDb.CHANGES()
           
* Hay cambios en algún cursor, revisar en cual o cuales
////// bucle del cursor interno dbcursor,comprueba todos nuestros cursores con cambios abiertos y ////los guarda
            IF oDb
.CursorChanges(dbcursor.cursor)
                   
* Actualizar Cambios en el servidor
                    IF oDb
.UPDATE(dbcursor.cursor)

                       
* Confirmar cambios
                        IF oDb
.SAVE()

                        ENDIF
                    ENDIF
            ENDIF
//////////fin bucle

        ELSE
           
* No se han realizado cambios
        ENDIF

//////// añadiria un retorno .t./.f. si se ha efectuado y tal vez una gestion de posibles errores.

Creo que se simplificaria en la mayoria de los casos ¿que opinas?

En ningun caso hay que modificar las funciones actuales porque en ocasiones es interesante tener todo el control del proceso.

Antonio Meza

unread,
Apr 14, 2015, 2:20:01 PM4/14/15
to publice...@googlegroups.com
Hola Carton, esa función no podría funcionar en muchos casos

1.- Imagina que tienes un catalogo de clientes al cual tiene un campo Clave (folio) el cual al agregar un nuevo cliente se le asigna un consecutivo único, en tu función no podrías saber que cursor sera el que necesites hacer esto y a demás primero debes obtener el Folio y después actualizar el cursor.

2.- En el clásico Cabecera y Detalle pasaría lo mismo, en la Cabecera al guardar obtienes el Ultimo ID insertado el cual debes reemplazar en la tabla de Detalles para posteriormente hacer la relación entre tablas, con esta función no podrías saber que tabla es la que obtienes el ID y a cual remplazarlo.

saludos
Antonio Meza

Antonio Meza

unread,
Apr 15, 2015, 4:08:22 PM4/15/15
to publice...@googlegroups.com


El lunes, 13 de abril de 2015, 16:19:43 (UTC-5), Programador Desarrollador escribió:

Mario Escudero

unread,
Apr 22, 2016, 11:48:21 PM4/22/16
to Comunidad de Visual Foxpro en Español
Antonio:

En mi botón Eliminar he puesto lo siguiente.
No sé si estará bien así, o falta o está sobrando algo....
Gracias

*******************************************************************************************

resp = MESSAGEBOX("Está seguro de eliminar el registro?",4+32+256,"Eliminación de Registro")
IF resp = 6
IF NOT thisform.m_Editando()
* Verificar si está abierto el cursor Clientes
IF thisform.oDb.CursorOpen("fam_articulos")
* Verificar que se está mostrando un registro
SELECT fam_articulos
IF RECCOUNT() = 1
* Hacer un cursor Editable (Aplicar Buffering 5)
thisform.m_Editar()
DELETE 
* Guardar Registro (No importa si es nuevo o se editó)
IF thisform.p_editar
IF thisform.oDb.CursorChanges("fam_articulos")
* Actualizar Cursor en el Servidor
IF thisform.oDb.Update("fam_articulos",.t.) && .t. es para obtener el ultimo ID insertado
MESSAGEBOX("Tabla Familia de Artículos Actualizada Correctamente", 0+64, "Valor devuelto por Update(): " + ALLTRIM(STR(thisform.oDb.error_Code)))
* Guardar cambios en el servidor (Commit)
IF thisform.oDb.Commit()
MESSAGEBOX("Cambios Guardados en la Tabla Familia de Artículos Correctamente",0+64,"Valor devuelto por Commit(): " + ALLTRIM(STR(thisform.oDb.error_Code)))
* No editar registro
thisform.p_editar = .f.
thisform.cargar_listado
thisform.mostrar_datos
ELSE
* Como Hubo un error es necesario cancelar la transacción que se activo y después 
* Mandar el mensaje, NUNCA enviar el mensaje y después cancelar la transacción.
thisform.oDb.Rollback()
MESSAGEBOX("Mensaje Personalizado: No se puedo Guardar los cambios de la Tabla Familia de Artículos",0+16,"Código de Error devuelto por Save(): " + ALLTRIM(STR(thisform.oDb.error_Code)))
ENDIF
ELSE
MESSAGEBOX("Mensaje Personalizado: No se puedo Actualizar la Tabla Familia de Artículos",0+16,"Codigo de Error devuelto por Update(): " + ALLTRIM(STR(thisform.oDb.error_Code)))
ENDIF
ELSE
MESSAGEBOX("No ha realizado cambios",0+64,"Sin Cambios!")
ENDIF
ELSE
MESSAGEBOX("No hay registro para Guardar",0+64,"Sin Cambios!")
ENDIF
ELSE
MESSAGEBOX("Debe Seleccionar un Registro para Eliminar",0+64,"Aviso!")
ENDIF
ELSE
MESSAGEBOX("No se eliminó ningún registro.",0+64+0,"Eliminación de Registro")
ENDIF
ENDIF
MESSAGEBOX("El registro se eliminó correctamente.",0+64+0,"Eliminación de Registro")
ELSE
MESSAGEBOX("No se eliminó ningún registro.",0+64+0,"Eliminación de Registro")
ENDIF
Reply all
Reply to author
Forward
0 new messages