Usar los formularios directamente con tablas en SQL Server

896 views
Skip to first unread message

integral

unread,
Dec 14, 2022, 6:22:43 PM12/14/22
to Comunidad de Visual Foxpro en Español
Estimados Amigos

Muy Buenas Tardes

Les hago la siguiente consulta en base a sus experiencias con VFP y SQL Server 

Estoy migrando un pequeño sistema que trabajaba con tablas DBF y Buffering de Datos a SQL Server.

Todas las Tablas ya las migre a SQL Server ( BDCONSUMO, a su vez contiene alrededor de 15 tablas )

He creado un nuevo proyecto con un programa principal en donde establezco la Conexion con SQL Server.

Como me aconsejan o creen que sea la forma mas practica de enlazar un Formulario a la tabla BDCONSUMO.dbo.Consumo alojado en SQLServer.

Agradezco sus comentarios y sugerencias.

Atte.,

Integral
  
Servidor SQL Server.jpg
formulario de Consumo.jpg

HernanCano

unread,
Dec 14, 2022, 8:40:07 PM12/14/22
to Comunidad de Visual Foxpro en Español
Claro que sí !!!
Buenísima recomendación, se nota que están con alguien que les aporta adecuadamente.

Eso es lo que se hace --en VFP, y tal vez en varios otros lenguajes de programación/IDEs-- con las vistas remotas, y los cursor adapter.

"Te traes los datos desde el motor (cualq motor, no sólo SQL Server) y --al tener los datos como un cursor-- en tu aplicación la administras con comandos normales de VFP.... Y luego con TABLEUPDATE() --en lo q a cursor adapter respecta, y tal vez vistas remotas también-- el mismo VFP se encarga de enviar los datos (INSERT o UPDATE o DELETE) al motor.... minimizando los comandos q tengas q escribir (para enviar los datos)"

Edwin Duran

unread,
Dec 15, 2022, 6:55:21 AM12/15/22
to Comunidad de Visual Foxpro en Español
Saludos Integral, me imagino que estas corto de tiempo, hay dos clases aquí en el Grupo SQLDATA, y FoxyDB, que te facilita todo el proceso para migrar a varios motores SQL, en mi caso uso SQLDATA

Saludos

integral

unread,
Dec 15, 2022, 7:40:43 AM12/15/22
to Comunidad de Visual Foxpro en Español
Que tal Amigos

Agradezco sus comentarios. Retomar la programación después de varios años me esta costando un poco volver a tener el mismo ritmo de antes y mas aun con los años uno se olvida de la codificación.

Amigo Hernán Canon. Me indicas lo siguiente...

Eso es lo que se hace --en VFP, y tal vez en varios otros lenguajes de programación/IDEs-- con las vistas remotas, y los cursor adapter

Tendrás algún ejemplo de como realizar la codificación desde un formulario con una Base de Datos en SQLServer...

Gracias por la atención.

Saludos,

Integral

HernanCano

unread,
Dec 15, 2022, 9:43:52 AM12/15/22
to Comunidad de Visual Foxpro en Español
Sí, claro.
Hay muchísimos.....

borrable1.png

Cristian Novoa

unread,
Dec 15, 2022, 10:32:49 AM12/15/22
to Comunidad de Visual Foxpro en Español
Con lo siguiente lo haces todo de manera simple y directa:

*------------------------------------------------------------------------------------------------------
*-- Ejemplo sin mostrar mensajes: ejecuta_bd(lcSQL, "cAlertasSolBod", "", "", .F.)
*------------------------------------------------------------------------------------------------------
FUNCTION ejecuta_bd(tcSQL, tcAlias, tcMensaje, tcError, tlMostrarMensajes)

LOCAL lnNumConexion, llResult

tcAlias=IIF(PCOUNT()<2, NULL, tcAlias)
tcMensaje=IIF(PCOUNT()<3, "", tcMensaje)
tlMostrarMensajes=IIF(PCOUNT()<5, .T., tlMostrarMensajes)



pone_espere(tcMensaje)



*------------------- CONEXION
lcErrorAudit = ""
lnNumConexion = conecta_bd(tlMostrarMensajes, @lcErrorAudit)
IF lnNumConexion < 0
    saca_espere(tcMensaje)
   
    *------------------- AUDITORIA
    *auditoria_sql_crea_registro(tcSQL, tcAlias, lcErrorAudit)
   
    RETURN .F.
ENDIF


*------------------- EJECUCION
IF ! ISNULL(tcAlias)
    llResult = ejecuta_sql(lnNumConexion, tcSQL, tcAlias, "", @tcError, tlMostrarMensajes)
ELSE
    llResult = ejecuta_sql(lnNumConexion, tcSQL, NULL, "", @tcError, tlMostrarMensajes)
ENDIF


*------------------- DESCONEXION
desconecta_bd(lnNumConexion, tlMostrarMensajes)



saca_espere(tcMensaje)

RETURN llResult

*------------------------------------------------------------------------------------------------------
*------------------------------------------------------------------------------------------------------
FUNCTION conecta_bd(tlMostrarMensajes, tcErrorAudit)

LOCAL lnConexion


IF ! SQLSETPROP(0,"DispLogin",3) > 0
    IF tlMostrarMensajes
        mensaje("Hubo un problema al conectarse a la base de datos.")
    ENDIF
    RETURN -1
ENDIF



lnConexion = SQLSTRINGCONNECT(gcCon)

IF lnConexion < 0
    Local Array Errores[1]
    AError(Errores)
    lcMensajeError = "Hubo un problema al conectarse a la base de datos."+CRLF+CRLF+Errores[2]+':'+Transform(Errores[5])

    IF tlMostrarMensajes
        mensaje(lcMensajeError)
    ENDIF
   
    tcErrorAudit = lcMensajeError
ENDIF


*-- al parecer esto no serviria de mucho
*!*    IF TYPE("_screen.otmrProcesosEspera") = "O"
*!*        _screen.otmrProcesosEspera.Enabled = ! (lnConexion < 0)
*!*    ENDIF

RETURN lnConexion

*------------------------------------------------------------------------------------------------------
*------------------------------------------------------------------------------------------------------
FUNCTION ejecuta_sql(tnNumConexion, tcSQL, tcAlias, tcMensaje, tcError, tlMostrarMensajes)

LOCAL lnResult, lcSQL, lnIDError


tcAlias=IIF(PCOUNT()<3, NULL, tcAlias)
tcMensaje=IIF(PCOUNT()<4, "", tcMensaje)




pone_espere(tcMensaje)


CURSORSETPROP('MapBinary', .T., 0)

IF ! ISNULL(tcAlias)
    lnResult = SQLEXEC(tnNumConexion, tcSQL, tcAlias)
ELSE
    lnResult = SQLEXEC(tnNumConexion, tcSQL)
ENDIF



IF lnResult <= 0
    *-- Para quitar cualquier mensaje pendiente, que se supone ya no corre
    *-- Deberia crear algo que quite todos los mensajes espere pendientes?
    saca_espere()
    *--


    Local Array Errores[1]
    AError(Errores)
   
    *---------------------
    loDatosError = CREATEOBJECT("EMPTY")
    ADDPROPERTY(loDatosError, "tFechaHora", DATETIME())
    ADDPROPERTY(loDatosError, "nError", errores(1))
    ADDPROPERTY(loDatosError, "cMensaje", errores(2))
    ADDPROPERTY(loDatosError, "cMetodo", errores(3))
    ADDPROPERTY(loDatosError, "cCodigoFuente", MESSAGE(1))
    ADDPROPERTY(loDatosError, "nLinea", LINENO())
    ADDPROPERTY(loDatosError, "cMetodo1", PROGRAM(1))
    ADDPROPERTY(loDatosError, "nLinea1", LINENO(1))
    ADDPROPERTY(loDatosError, "cScript", tcSQL)
    ADDPROPERTY(loDatosError, "cAlias", tcAlias)

    lnIDError = GrabaError(loDatosError)
   
   
    *-------------------------------------------------------------------------------
    *-- ATENCIÓN: Me fijé que al mandar el error con RAISERROR, por ejemplo:
    *-- errores(3) solo devolvía 511 caracteres, o sea, no devolvía el </msje>,
    *-- y por lo tanto, STREXTRACT devolvía al programa un mensaje vacío!!!
    *-------------------------------------------------------------------------------
*!*        Mens 50000, Nivel 16, Estado 1, Procedimiento usp_RethrowError, Línea 65
*!*        Error <50000>, Nivel 16, Estado 1, Procedimiento usp_pub_ValidarExistenciaCodigos, Línea 78, Mensaje: <msje>DETALLE ÓRDENES DE COMPRA

*!*        Los siguientes código(s), no han sido encontrado(s),
*!*        en el maestro de productos.

*!*        99464932         503 (línea 1)
*!*        11503020         503 (línea 2)
*!*        3228376R1        503 (línea 3)
*!*        3228376R91       503 (línea 4)
*!*        4785110          503 (línea 5)
*!*        C5NE6303K        503 (línea 6)
*!*        E1ADDN6303F      (hasta aqui devuelve)503 (línea 7)
*!*        FONN6300MA       503 (línea 8)
*!*        K210100          503 (línea 9)
*!*        ZZ90119          503 (línea 10)
*!*        C5NN6303M        503 (línea 11)
*!*        4679788          503 (línea 12)
*!*        </msje>
    *-------------------------------------------------------------------------------
    *-- Solución a lo anterior:
    IF "<msje>" $ errores(3) AND NOT "</msje>" $ errores(3)
        errores(3) = errores(3) + "...</msje>"
    ENDIF
   
    *-------------------------------------------------------------------------------
   


    *------------------- AUDITORIA
    *-- 20170929 ahora grabamos el script y alias en GrabaError() para tener la info de inmediato ocurrido el error
    *auditoria_sql_crea_registro(tcSQL, tcAlias, errores(3))


    *---------------------
    *-- Antes en este trozo de código se utilizaba errores(3), pero a veces me devolvía el mensaje cortado.
    *-- Entonces noté que errores(3) devolvía lo mismo completo.
    *IF glCompilado
        IF TYPE("tcError")!="C"        && el error no se devuelve pasado por referencia
            IF tlMostrarMensajes
                MESSAGEBOX(msje_error_usuario_bd(errores(3), lnIDError), 48, "")
            ENDIF
        ELSE
            tcError = msje_error_usuario_bd(errores(3), lnIDError)
        ENDIF
    *ENDIF
   
    IF ! glCompilado AND .f.
        IF AT("[SQL Server]", errores(3)) != 0    && no entiendo por que decia IF AT("[SQL Server]", tcMensaje) != 0
            tcError = SUBSTR(errores(3), AT("[SQL Server]", errores(3)) + 12)
        ELSE
            tcError = errores(3)
        ENDIF

        _CLIPTEXT = tcSQL
        IF MESSAGEBOX(tcError+CHR(13)+"********* SQL COPIADO EN EL PORTAPAPELES. ¿SUSPEND? ***********."+CHR(13)+tcSQL, 4+32+256) = 6    && SI
            SUSPEND
        ENDIF
    ENDIF


    *------------------- AUDITORIA
*    auditoria_sql_crea_registro(tcSQL, tcAlias, errores(3))

    RETURN .F.
*!*    ELSE
*!*        IF ! glCompilado
*!*            _CLIPTEXT = tcSQL
*!*        ENDIF
ENDIF




*------------------- AUDITORIA
*auditoria_sql_crea_registro(tcSQL, tcAlias, "")        && esto no tiene efecto, no estamos grabando todos los sql



saca_espere(tcMensaje)

RETURN .T.

*------------------------------------------------------------------------------------------------------
*------------------------------------------------------------------------------------------------------
FUNCTION desconecta_bd(tnNumConexion, tlMostrarMensajes)

LOCAL lnResult


lnResult = SQLDISCONNECT(tnNumConexion)
IF lnResult < 0
    IF tlMostrarMensajes
        mensaje("Advertencia: hubo un problema al desconectarse.")
    ENDIF
ENDIF

RETURN

*------------------------------------------------------------------------------------------------------
*------------------------------------------------------------------------------------------------------
FUNCTION msje_error_usuario_bd(tcMensaje, tnIDError)

* ¿ Estan las marcas "<" y ">" puestas por mi en usp_RethrowError en el mensaje de error sql server ?
lnPosDelim1 = AT("<", tcMensaje)
lnPosDelim2 = AT(">", tcMensaje)


IF lnPosDelim1 != 0 AND lnPosDelim2 != 0
    lcNumErrorSQLServer = VAL(SUBSTR(tcMensaje, lnPosDelim1+1, lnPosDelim2-lnPosDelim1-1))
   
    DO CASE
    CASE lcNumErrorSQLServer = 2627 OR lcNumErrorSQLServer = 2601    && Violation of UNIQUE KEY constraint 'UQ_articulo_codigo'. Cannot insert duplicate key in object 'dbo.articulo'
        lcMensajeUsuario = ""    && por si acaso no pasara por ningún IF (error mio de código)
        DO CASE
        CASE LOWER("UQ_tbl_producto_correl") $ LOWER(tcMensaje)
            lcMensajeUsuario = "No puede haber dos productos, con el mismo correlativo."
        CASE LOWER("UQ_tbl_categoria_descripcion") $ LOWER(tcMensaje)
            lcMensajeUsuario = "La descripción de la categoría no puede repetirse."
        CASE LOWER("UQ_tbl_compra_grupo") $ LOWER(tcMensaje)
            lcMensajeUsuario = "La descripción del grupo de compra no puede repetirse."
        CASE LOWER("UQ_tbl_flujo_evento_tipo_descrip") $ LOWER(tcMensaje)
            lcMensajeUsuario = "No pueden haber dos eventos con la misma descripción y tipo."
        CASE LOWER("PK_tbl_sol_desp") $ LOWER(tcMensaje)
            lcMensajeUsuario = "El número de solicitud indicado ya fue utilizado."
        CASE LOWER("PK_tbl_guia") $ LOWER(tcMensaje)
            lcMensajeUsuario = "El número de guía indicado o correlativo se repite en otra guía."
        CASE LOWER("PK_tbl_toma_inv") $ LOWER(tcMensaje)
            lcMensajeUsuario = "El número de toma de inventario indicado no es único."
        CASE LOWER("PK_tbl_inventario") $ LOWER(tcMensaje)
            lcMensajeUsuario = "El correlativo de los inventarios ya fue utilizado."
        CASE LOWER("PK_tbl_ajuste_stock") $ LOWER(tcMensaje)
            lcMensajeUsuario = "El número de ajuste de stock indicado no es único."
        CASE LOWER("PK_tbl_detalle") $ LOWER(tcMensaje)
            lcMensajeUsuario = "El nombre del detalle indicado no es único."
        CASE LOWER("UQ_tbl_ch_vta_doc") $ LOWER(tcMensaje)
            lcMensajeUsuario = "El número de doc. de venta, ha sido indicado anteriormente."
        CASE LOWER("UQ_tbl_cartola") $ LOWER(tcMensaje)
            lcMensajeUsuario = "El número de cartola se repite en el año indicado."
        CASE LOWER("UQ_tbl_cargo_num_cheque") $ LOWER(tcMensaje)
            lcMensajeUsuario = "El número de cheque ya fue utilizado."
        CASE LOWER("UQ_tbl_normaliz_pmp_det") $ LOWER(tcMensaje)
            lcMensajeUsuario = "Un producto solo puede tener una normalización de PMP."
        CASE LOWER("UQ_tbl_con_comp_numero") $ LOWER(tcMensaje)
            lcMensajeUsuario = "No puede haber dos comprobantes contables con el mimso número."
        OTHERWISE
            lcMensajeUsuario = "El número o código ya fue utilizado, especifique otro valor."
        ENDCASE

    CASE lcNumErrorSQLServer = 547
        *-- Instrucción UPDATE en conflicto con la restricción CHECK "CK_tbl_ajuste_stock_total".
        *-- El conflicto ha aparecido en la base de datos "hibrido_desa", tabla "dbo.tbl_ajuste_stock", column 'total'.</msje>
        IF "CHECK" $ tcMensaje
            DO CASE
            CASE LOWER("CK_tbl_ajuste_stock_total") $ LOWER(tcMensaje)
                lcMensajeUsuario = "El total del ajuste de stock debe ser mayor a cero."    && no debiera darse
            CASE LOWER("CK_tbl_articulo_codigo") $ LOWER(tcMensaje)
                lcMensajeUsuario = "El código del producto no debe estar vacío."
            CASE LOWER("CK_tbl_guia_det_cantidad") $ LOWER(tcMensaje)
                lcMensajeUsuario = "La cantidad debe ser mayor a cero."
            OTHERWISE    && habría que tratar que no entre aqui, definiendo antes todos los CK
                lcMensajeUsuario = "Hay un dato no permitido, como por ejemplo, un número fuera de rango."
            ENDCASE
        ELSE
            IF "DELETE" $ tcMensaje
                *-- The DELETE statement conflicted with the REFERENCE constraint "FK_venta_detalle_articulo". The conflict occurred in database "gestiona", table "dbo.venta_detalle", column 'id_articulo'
                lcMensajeUsuario = "Los datos no pueden ser eliminados, porque son utilizados en otro(s) archivo(s)."
            ELSE
                *-- Instrucción UPDATE en conflicto con la restricción FOREIGN KEY "FK_tbl_compra_proy_det_tbl_provee". El conflicto ha aparecido en la base de datos "hibrido_desa", tabla "dbo.tbl_provee".
                lcMensajeUsuario = "Los datos no pueden ser insertados o modificados, porque no existen en los archivos relacionados."
            ENDIF
        ENDIF

    CASE lcNumErrorSQLServer = 50000    && error en un trigger (en general los provocados por RAISERROR)
        *lcMensajeUsuario = SUBSTR(tcMensaje, AT("Mensaje: ", tcMensaje) + 9)
        lcMensajeUsuario = STREXTRACT(tcMensaje, "<msje>", "</msje>")
       
    OTHERWISE
        && no deberia pasar por aca (rectifico, si hay casos que no controlan el error en el sp de la misma forma)
        lcMensajeUsuario = mensaje_error_estandar(tnIDError)
       
    ENDCASE

ELSE    && cuando usp_RethrowError no está de por medio

    *-- Manera poco precisa de determinar el error ocurrido (por los sql enviados directamente desde el programa)
    DO CASE
    CASE "UNIQUE KEY" $ tcMensaje
        lcMensajeUsuario = "El número o código ya fue utilizado, especifique otro valor."

    CASE "DELETE" $ tcMensaje AND "REFERENCE" $ tcMensaje        && supuestamente error 547
        lcMensajeUsuario = "Los datos no pueden ser eliminados, porque son utilizados en otro(s) archivo(s)."

    CASE "FOREIGN KEY" $ tcMensaje
        lcMensajeUsuario = "Los datos no pueden ser insertados o modificados, porque no existen en los archivos relacionados."
   
    OTHERWISE
        lcMensajeUsuario = mensaje_error_estandar(tnIDError)
       
    ENDCASE
   
*!*        IF AT("[SQL Server]", tcMensaje) != 0
*!*            lcMensajeUsuario = "Error: "+SUBSTR(tcMensaje, AT("[SQL Server]", tcMensaje) + 12)
*!*        ELSE
*!*            lcMensajeUsuario = "Error: "+tcMensaje
*!*        ENDIF

ENDIF

RETURN lcMensajeUsuario

*------------------------------------------------------------------------------------------------------
*- Llamado desde GrabaError y desde aca en msje_error_usuario_bd
FUNCTION mensaje_error_estandar(tnIDError)

RETURN "Se produjo una incidencia. Contáctese con soporte técnico si persiste."+CHR(13)+CHR(13)+;
       "De todas formas, se ha enviado el reporte nº "+ALLTRIM(STR(tnIDError))+" con los detalles."

Víctor Hugo Espínola Domínguez

unread,
Dec 16, 2022, 8:33:10 PM12/16/22
to publice...@googlegroups.com
> Como me aconsejan o creen que sea la forma mas practica de enlazar un Formulario a la tabla BDCONSUMO.dbo.Consumo alojado en SQLServer.

Usando un motor SQL no se puede enlazar una tabla a un formulario y usando tablas nativas (.dbf) no se debe!

Cada control del formulario debe estar enlazado a un campo de un cursor o a una propiedad de un objeto o una variable, descarga un ejemplo desde https://www.mediafire.com/file/j3mh2gubxzp3jzq/ABM3KpasMultiBD.zip/file

Saludos,
Víctor.
Lambaré - Paraguay.



--
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/aeb63ae2-2e8b-40e0-a853-455931bd4e13n%40googlegroups.com.

Luis suescún

unread,
Dec 17, 2022, 7:16:38 AM12/17/22
to publice...@googlegroups.com
Yo tengo una clase de la autoría de Less Pinter que te ayuda enormemente en ese proceso, te la puedo facilitar y te la explico con un formulario para que le entiendas la mecánica, de ahí en adelante ya eres capaz de sortear todo lo que necesites...

Soy anti vistas remotas, pasé por ese método pero es muyyyy lento.
si quieres me contactas por acá, o por RinconFox o por comunidad Visual Foxpro grupos de WhatsApp.

La clase es una clase de capa de datos y es gratis.


--
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.

Germán Fabricio Valdez

unread,
Dec 18, 2022, 10:09:29 PM12/18/22
to Comunidad de Visual Foxpro en Español
hola integral,  te recomiendo mi clase sqldata o sqldata2 que funciona ya hace tiempo con servidores locales y remotos.
no es cara. contactame personalmente,   tiene soporte y capacitacion si necesitas.
Son varias cosas a tener en cuenta que es larga de explicar. y mi clase ya te resuleve el problema y migras con uno de
los mejores metodos que hay.

Message has been deleted
Message has been deleted

integral

unread,
Dec 22, 2022, 4:52:55 PM12/22/22
to Comunidad de Visual Foxpro en Español
Buenas Tardes Amigos del Foro.

Luego de Leer e investigar sobre el tema. Al final opte por la opción mas simple para enlazar VFP a SQL Server 2008R2. Y si que funciono y no tuve que escribir tantas lineas de codigo

Amigo Valdez buscando en mis archivos encontré una carpeta llamada SQLDATA antes de ejecutarlo cambie las variables de conexion y aun asi no pude conectarme. Adjunto imagen del error y el archivo comprimido SQLDATA no me permite adjuntarlo.

Sigo avanzando en mi proyecto de migración autodidacta.

Saludos,

Integral

ERROR_SQLDATA.jpg
MIGRO_CONSUMO.jpg

Cristian Novoa

unread,
Dec 22, 2022, 7:10:51 PM12/22/22
to Comunidad de Visual Foxpro en Español
Te di la rutina que se conecta directo con 3 sentencias de fox.

Esto lo he usado por años.

HernanCano

unread,
Dec 23, 2022, 12:28:11 AM12/23/22
to Comunidad de Visual Foxpro en Español
¿Cuáles eran las "tantas líneas de código" con las q no puedes convivir?

En el doc que nos comparte Luis M. Guayán, en la pág 6 se vé la forma de conectarse a un motor.

¿Cuáles habías visto tú?

borrable1.png

Germán Fabricio Valdez

unread,
Dec 23, 2022, 12:35:07 AM12/23/22
to Comunidad de Visual Foxpro en Español
hola integral.  tenes que contactarte privadamente conmigo por whatsapp +54 9  2236748636
sqldata y sqldata2 ya no son mas gratuitas ni tienen versiones gratuitas.
son comerciales y con soporte y enseñanza. y no es cara.

integral

unread,
Dec 23, 2022, 12:12:32 PM12/23/22
to Comunidad de Visual Foxpro en Español
Que tal Amigos del Foro :

Respondiendo a las preguntas que me hicieron algunos colegas que recién empiezan a aprender a trabajar en VFP 9.0 SP2 y SQL Server

Les doy algunos alcances según mi corta experiencia aprendida de forma autodidacta...

1) Para poder entender mejor como se trabaja  tanto en la migración, así como también en el enlace de VFP y SQL Server (En mi caso SQL Server 2008R2)
    Bien dicen que la practica va de la mano con la teoría. 

    Aquí  les recomiendo a ver en Youtube el siguiente video que explica paso a paso la temática.  
 
2) Si tienen dudas y desean ayuda en sus procedimientos este Foro es el indicado, aquí recibirán de forma desinteresada la ayuda de expertos colegas que en la medida 
    de su tiempo disponible te orientaran con ejemplos simples o bien elaborados que en algunos casos resultan en una excelente clase.

Nuevamente gracias a todos los colegas activos participantes del foro...
Que hacen que existe y NO muera nuestra querido Zorrito...

Saludos,

INTEGRAL
(Lima-Perú)

PD : Amigo Hernán también le había dado un vistazo al excelente articulo del maestro LMG. Hoy temprano instale el Kit de Instalación de Foxpro para DOS 2.6 y ayer leí que también se puede enlazar a SQL SERVER...?
GERANDO EXE EN FPD26.jpg
Acceso a Datos Remotos desde Visual Foxpro.jpg

Germán Fabricio Valdez

unread,
Dec 23, 2022, 10:55:54 PM12/23/22
to Comunidad de Visual Foxpro en Español
integral, tenes pocas experiencia y ya das consejos.
yo tengo 20 años de experiencia con motores..y mi clase es de paga debido a que requiere actualizaciones y le doy mantenimiento y cursor de capacitacion.   lo que estas aconsejando es simplemente escribir a mano, lo que mi clase lo hace automatico.  pero hay muchos metodos de hacer lo este tema de la programacion de vfp con motores, pero una muy compleja y otra muy sencilla con mi clase.
hay otras clases gratuitas como foxydb, pero no funciona si te queres conectar a un servidor por internet .
Hay muchas cosas integral, ademas ese video solo muestra como se instala sql server. si elegis el metodo dificil o vas  a tener que estudiar
mucho y lograr que  te enseñen desintersadamente bastante.

HernanCano

unread,
Dec 23, 2022, 11:35:58 PM12/23/22
to Comunidad de Visual Foxpro en Español
Claro, Integral.
Gracias por mostrar ésto que son buenas prácticas para los q están iniciándose.

Y decir que puede buscar ayuda en este foro, sí: es redundante, pero es verdad: para éso estamos.

Siempre será agradable aportarle a alguien que mete la mano y consulta por las dificultades que se le presentan.

Gerardo Cagnola

unread,
Dec 24, 2022, 8:34:16 AM12/24/22
to publice...@googlegroups.com
buena respuesta...

--
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.

integral

unread,
Dec 24, 2022, 12:05:08 PM12/24/22
to Comunidad de Visual Foxpro en Español
Estimado German Valdez

Te diré que nadie nace sabiendo y no es un pecado aconsejar a los demás cuando te lo piden. 

No tendré 20 años de experiencia en Programación. Pero no por ello dejo de hacer lo que me gusta Programar en VFP.

En la vida he realizado de todo un poco y ello me ha permitido sobrevivir...  

Ahora bien las Empresas buscan un buen Sistema  que sea rápido y que cumplan  sus necesidades y si tiene una buena presentación mejor aun.

Cada uno es libre de escoger las herramientas que le sean útiles y que estén a su alcance.

Las veces que he recurrido a este y otros foros con mis dudas y consultas, siempre he tenido la respuesta de algún colega experimentado.

Por ello estaré eternamente agradecido. 

PD : El video es el principio de mas de 15 videos.

Atte.,

INTEGRAL  
Almacen Guia de Remision.jpg

José Antonio Peña Martínez

unread,
Dec 24, 2022, 12:37:26 PM12/24/22
to publice...@googlegroups.com
Buena respuesta?, yo no vengo a este foro a comprar soluciones sino porque quiero aprender ... en su caso el consejo de Integral aplica para mi y el de German no porque yo no quiero todo resuelto vengo a APRENDER ... No podemos descalificar la poco o mucha ayuda de las personas que con buena voluntad ofrecen parte de su mucho o poco conocimiento...

Es mi opinión, espero que no me respondan con "tenes pocas experiencia y ya das consejos. "

Saludos!





--
Desarrollo de Sistemas TecnoPro
José Antonio Peña

Saludos!

Germán Fabricio Valdez

unread,
Dec 24, 2022, 9:10:26 PM12/24/22
to Comunidad de Visual Foxpro en Español
jose, no es todo resuelto, solo de pasar a de muy dificil a muy facil.  el codigo de la clase es abierto, asi que te podes fijar que es lo que hace, si queres aprender.   pero la clase es un puente.  para entrar de una buena manera, despues vas a despegar las alas.   ya que hay muchos metodo de programacion, que si comenzas de esa forma, no te va a funcionar el acceso por internet, entre bloqueos y otros problemas y dificultades que vas a tener.   yo lo que quiero es ayudarte, solo cobro un monto, debido a que hay que mantenerla actualizarla y enseñar a usarla.  y son arios ya que la usan.  yo solo me dedico a crearla, y el ing javier cortez a enseñar desde todos los niveles basico medio avanzado.
Si hasta el dia de hoy no has podido migrar a un motor, si no usas mi clase, es mucho lo que tenes que estudiar, asi que te recomiendo mi clase, y si queres ver como funciona te fijas en el codigo y listo.

Antonio Meza

unread,
Jan 3, 2023, 11:30:54 AM1/3/23
to Comunidad de Visual Foxpro en Español
FoxyDB la uso todos los días y tengo servidores MariaDB en VPS, con 2 proveedores como IONOS y CONTABO, por lo tanto el acceso a las bases de datos es por internet y funciona sin problemas, mas bien FoxyDb no esta totalmente optimizado para Internet solo en el proceso de Update cuando tienes que migrar una tabla con miles de registros o realizar un proceso sobre cientos o miles de registros en local y luego actualizar el servidor, pero muy diferente a que no funcione.

Si requieres migrar una base de datos es un proceso de una sola vez, si tarda unos minutos mas o unos minutos menos será una sola vez, pero si tienes procesos grandes muy continuos, algo esta mal planeado, y no tiene nada que ver con FoxyDB mas bien un mal diseño de base de datos, un mal diseño de proceso de información, mala aplicación de indices, mala consulta SQL, pero solo se puede determinar validando caso por caso porque no se puede aplicar una misma receta para todos.

Otro gran problema es que muchos programadores quieren seguir usando los servidores de bases de datos como si fueran DBFs es decir traer todos los registros de la tabla lo cual es un completo error y desconocimiento, o en el peor de los casos usar el DataEnvieronmet de los formularios para que VFP controle la apertura y cierre de tablas.

En mi caso cuando abro un formulario no muestra nada de información, solo si el usuario quiere buscar algo me conecto al servidor, esto hace que el programa abra muy rápido, un error común es que primero recargan todo el formulario con los datos del servidor y tarde en abrir la pantalla, y resulta que el usuario la abrió por error y ahora tiene que esperar a que cargue, errores como esos no tienen nada que ver con el servidor VPS, el servidor de base de datos, la librería como FoxyDb que usen para el acceso a datos.

Las malas practicas abundan por internet, por eso muchos no usan FoxyDb porque te obligo a usar buenas practicas!!! y como en internet hay mas librerías o códigos llenos de malas practicas listos para copiar y pegar pues es muy fácil decir que FoxyDb no sirve 

Y en cuanto a Integral felicidades porque echando a perder se aprende, pero si hay una o varias librerías para resolver tu problema la verdad es mejor probarlas que inventar el hilo negro!!

saludos
Antonio Meza

Germán Fabricio Valdez

unread,
Jan 14, 2023, 3:19:25 AM1/14/23
to Comunidad de Visual Foxpro en Español
antonio el principal problema es el envio de comandos update insert y delete  al servidor remoto en internet, deben ser enviadas por lotes , es mas
los drivers odbc agregaron esa opcion por esta razon.  la diferencia de velocidad es lo que tarda 1 update, lo hace con 100 update.  y se precisa para el cotidiano desempeño de un sistema, no solamente para una insercion o actualizacion masiva.  sino necesitas un gran ancho de banda. que no se obtiene en servidores economicos.  el cliente tiene que invertir en una internet especial.

integral

unread,
Feb 10, 2023, 3:04:13 PM2/10/23
to Comunidad de Visual Foxpro en Español
 Que tal Amigos .

Muy Buenas Tardes :

Anoche buscando informacion encontre unos comentarios muy interesantes como respuestas acerca de  VFP con Base de Datos MS-SQL Server

Comparto con ustedes el link...


Saludos,

Integral
(Lima-Perú)

integral

unread,
Feb 11, 2023, 4:08:59 PM2/11/23
to Comunidad de Visual Foxpro en Español
Que tal amigos...

Aqui otro link que nos indica los puntos a tener en cuenta al trabajar con una Base de Datos


Atte.,

Integral

Hernán Medina

unread,
Feb 13, 2023, 3:51:13 PM2/13/23
to publice...@googlegroups.com
Hola a todos. He leído con detenimiento los comentarios de los participantes y no queda duda que estos espacios realmente son educativos, quiero felicitarlos por la participación y aportes que todos hacen. Soy un absoluto novato en el ambiente de programación de visual fox pro 9, no así en la programación. El poco tiempo que he dedicado a esta maravillosa herramienta he desarrollado interfaces donde ya no uso los menú tradicionales, ni laterales, etc.  Les comento ésto porque desde el principio he usado como Base de datos a MariaDb y no he tenido la oportunidad de probarla vía internet, es decir en un verdadero servidor remoto. Hoy he aprendido muchas cosas en este hilo y no necesariamente relacionadas a la programación. Es interesante conocer las diferentes opciones para el acceso a los datos en servidores que están en internet, creo que el tema no se trata de si es o no gratuito, creo que en ambos casos se han invertido dinero, conocimiento y tiempo, todos estas características debemos honrarla, admiro y respeto ambos mundos. Probaré las librerías y clases aquí recomendadas y haré las consultas necesarias. Gracias especialmente Sr. Antonio Meza y al Sr. Germán Fabricio Valdez por su tiempo en desarrollar tan importante trabajo, espero continúen con esa pasión que los mueve al programar.

--
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.

Ricardo Soldini

unread,
Feb 14, 2023, 5:49:12 PM2/14/23
to Comunidad de Visual Foxpro en Español
Que tal Amigos(as) leyendo los comentarios veo que German dice que Foxydb no sirve en Internet, no obstante yo tengo la Base de Datos Sql Server en un hosting  Provisto por Smarterasp.net y hago la carga de datos desde equipos portatiles que se conectan con una bam movil y no se nota retardo con respecto a los pc que se conectan mediante internet fija
(debe ser porque aplique las sugerencias de Antonio y cargo solo aquellos datos que el usuario solicita, es decir a pesar de que es una aplicacion de escritorio, se penso como una aplicacion web y al lanzar el form el usuario debe indicar ciertos parametros y con eso traemos los datos a ser modificados o actualizados)  
Y se conectan desde 4 locaciones distintas incluyendo un portatil con internet movil

Reply all
Reply to author
Forward
0 new messages