O.T Necesito migrar aplicacion monstruosa de VFP a otra herramienta, o bien pasarlo de DBF a MariaBd en tiempo record

579 views
Skip to first unread message

Oscar Quiros Coto

unread,
Dec 1, 2015, 4:46:30 PM12/1/15
to Comunidad de Visual Foxpro en Español
Buenas tardes.
Necesito migrar en tiempo record una aplicación grande de VFP con tablas nativas a VFP con motor de base de datos, o bien migrar la a otra herramienta.
Yo lo hago en forma "manual", es decir creando la conexion, y cambiando el codigo, si se puede hacer, pero es lento... , no se si me pueden dar ideas y/o herramientas para hacer esto.
El tema de foxincloud nunca le he entendido, no se si esta herramienta pueda hacer lo que necesito, alguno de ustedes ha hecho algo asi.

Saludos.

Antonio Meza

unread,
Dec 1, 2015, 5:06:46 PM12/1/15
to Comunidad de Visual Foxpro en Español
Con FoxyDb puede ser que sea mas rápido!!


saludos
Antonio Meza

Allan Raúl Acuña

unread,
Dec 1, 2015, 5:42:22 PM12/1/15
to publice...@googlegroups.com
Amigo, debes igual programar,

Sinembargo como ya lo tienes en Foxpro, lo que debes hacer es trabajarlo algunas librerias como dice nuestro colega Antonio Meza,

En mi caso yo me prepare mis rutinas para trabajar y por ejemplo, trabajo normal todo y luego solo utilizo codigo que ayudan a agilizar, como por ejemplo:

*--------------------------------------------------------------------------------
* Guardar en el Servidor
*--------------------------------------------------------------------------------
lcTabla = [clientes]
lcCampoID = [idcli]

Select (lcTabla)
=TableUpdate(.T.)
Scatter Memvar Memo && Enviamos las variables de los campos 
If lNuevo
m.idcli = SQLNextID(lcTabla,  lcCampoID) && Nuevo ID a insertar
lcSQLCon = SQLCreateInsert(lcTabla) &&   INSERT INTO MiTabla ( campo1, campo2...) VALUES (?m.campo1, ?m.campo2)
=SQLInsert(lcTabla, lcSQLCon)
Else
=SQLUpdate(lcTabla, lcCampoID,  m.idcli)
Endif
*-------------------------------------------------------------------------------- 

Las rutinas las tengo para> MySQL, PostGreSQL, SQL SERVER, Oracle, SQLite, AnyWhere, aun no he tenido la oportunidad de probarlas con MariaDB.

Si quieres te las paso.

Saludos cordiales.

Lic. Allan Raúl Acuña
Analista Programador
msn= allan...@hotmail.com
skype= NicEasySoft
            +(505) 8 999 8950
Managua, Nicaragua
Centroamérica



Date: Tue, 1 Dec 2015 14:06:46 -0800
From: solv...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Re: O.T Necesito migrar aplicacion monstruosa de VFP a otra herramienta, o bien pasarlo de DBF a MariaBd en tiempo record

Oscar Quiros Coto

unread,
Dec 1, 2015, 5:47:31 PM12/1/15
to publice...@googlegroups.com
Ok, si quieres las pasas para ver que código puedo utilizar.
Entonces este foxincloud no funciona para eso?, crei que era para hacer este tipo de migraciones, que dicha que no gaste tiempo investigándolo.

Saludos.
-- 
___________________________________________________
Soporte y Sistemas OQC, S.A.
Partner Autorizado de ESET en Costa Rica
Cel:(506) 87 11 00 11   (506) 62 00 18 76
Email:os...@ssoqc.com - oscarqu...@hotmail.com
Skype: oscar.quiros.coto
GTalk: os...@ssoqc.com

narcizo norzagaray

unread,
Dec 1, 2015, 5:52:34 PM12/1/15
to publice...@googlegroups.com
je je je.. compartelas ....

Narcizo Norzagaray S.
Desarrollo De Sistemas Computacionales.
www.facebook.com/nzysoft
Cel 622 118 1324

Interak

unread,
Dec 1, 2015, 5:56:56 PM12/1/15
to Comunidad de Visual Foxpro en Español
Hola Allan, este fin de año al igual que Oscar estoy decidido por fin a realizar el cambio de tablas libres a MySql y estoy interesado en las rutinas que explicas. Te agradecería si las envías. Se ve realmente interesante y ágil. 

Antonio Meza

unread,
Dec 1, 2015, 6:18:14 PM12/1/15
to Comunidad de Visual Foxpro en Español
Espero y no lo tome a mal Allan!!! pero con foxyDb en el modo casi VFP puedes hacer lo siguiente!!

* Cargas la librería a cualquier nombre que queiras, para ejemplo usare oDb.
oDb = NewObject("foxydb","foxydb.prg")
* Como en todo servidor configurar la conexión, usamos Test() para pruebas
oDb.Test()
* Te conectas al servidor
oDb.Connect()

* Abrir tabla del servidor
odb.Use("clientes")

* realizas los cambios al cursor como agregar un registro, eliminar, modificar uno o varios campos

* Botón Guardar
* verificas si realizaste cambios, es opcional pero para que enviar algo al servidor si no cambiaste nada :-)
if odb.CursorChanges("clientes")
     * Guardas
     if odb.Update("clientes",.t.)    && el .t. es para solicitar el ultimo ID si es un registro nuevo
          if oDb.id_last > 0
               wait windows "Registro Nuevo, ID: " + str(oDb.id_last)
         endif
          * Confirmar la transacción
          odb.Commit()
     else
          * Hubo un error
         odb.Rollback()
     endif
else
     wait windows "no se han realizado cambios para guardar"
endif

saludos
Antonio Meza

Allan Raúl Acuña

unread,
Dec 1, 2015, 6:33:16 PM12/1/15
to publice...@googlegroups.com

Tranquilo Antonio, la clase esta muy buena !


Saludos cordiales.

Lic. Allan Raúl Acuña
Analista Programador
msn= allan...@hotmail.com
skype= NicEasySoft
            +(505) 8 999 8950
Managua, Nicaragua
Centroamérica



Date: Tue, 1 Dec 2015 15:18:13 -0800
From: solv...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: O.T Necesito migrar aplicacion monstruosa de VFP a otra herramienta, o bien pasarlo de DBF a MariaBd en tiempo record

Antonio Meza

unread,
Dec 1, 2015, 6:44:07 PM12/1/15
to Comunidad de Visual Foxpro en Español
Es que últimamente me reclaman por lo que escribo que ya no se quien se va a enojar jajajaj

saludos!!!

Allan Raúl Acuña

unread,
Dec 1, 2015, 6:48:52 PM12/1/15
to publice...@googlegroups.com
Asi he leido Antonio, pero es normal.

De hecho me gustaria consultarte como hago para crear un blog, tengo muchas cosas que me gustaria publicar.

Cosas que he ido acumulando y adaptando a mis usos, asi como codigos propios.


Saludos cordiales.

Lic. Allan Raúl Acuña
Analista Programador
msn= allan...@hotmail.com
skype= NicEasySoft
            +(505) 8 999 8950
Managua, Nicaragua
Centroamérica



Date: Tue, 1 Dec 2015 15:44:06 -0800

Víctor Hugo Espínola Domínguez

unread,
Dec 1, 2015, 6:50:49 PM12/1/15
to publice...@googlegroups.com
Hola Oscar

No conozco herramienta alguna que haga una migración de un sistema VFP a cliente/servidor, aunque exista no es una buena idea cambiar simplemente de contenedor de las tablas, es casi seguro que tu base de datos deba ser rediseñada y normalizada.

Una vez que tengas normalizadas tus tablas y que tengan claves primarias simples (una columna) puedes recurrir a un framework (Visual Extend, Visual Promatrix, Frameroot, Tier Adapter, etc...), pero toma su tiempo entender el funcionamiento del mismo.

Otra alternativa es que te construyas tu propio framework, también tiene su costo en tiempo.

La opción más rápida que conozco es Genexus, porque puedes empezar a producir sin preocuparte por los datos, la base de datos la genera Genexus!, pero no te entusiasmes aún no te dije lo que cuesta y mejor averígualo tú.


Saludos,
Víctor.
Lambaré - Paraguay.

Antonio Meza

unread,
Dec 1, 2015, 7:12:00 PM12/1/15
to Comunidad de Visual Foxpro en Español
hay muchos lugares gratuitos, uso www.wordpress.com pero por ejemplo esta

www.blogger.com donde esta portalfox.

Solo tienes que registrarte en cualquier y seleccionar tu plantilla, agregar paginas y entradas.

saludos

Martin Paredes

unread,
Dec 1, 2015, 7:19:14 PM12/1/15
to Comunidad de Visual Foxpro en Español
Oscar, ni en sueños existe lo que buscas, esto no es de horas, dias. semanas, meses, una cosa es Dbf's y muy pero muy diferente Cliente/Servidor, se tiene que hacer una analisis profundo y una buena planeacion de la migracion, las consideraciones son muchas, a veces nos dejamos llevar por los comentarios,
que es facil, que tengo esta herramienta etc. etc, tienes que picar mucha piedra.

Yo te sugiero que investigues, tu mismo, mas a fondo de el impacto sus consideraciones y los beneficios del tema.

Salds....
Mapasac
General Escobedo, N.L. Mexico

primero, tienes que organizar tus estructuras de datos,
El martes, 1 de diciembre de 2015, 15:46:30 (UTC-6), Oscar Quiros Coto escribió:

Antonio Meza

unread,
Dec 1, 2015, 8:42:13 PM12/1/15
to Comunidad de Visual Foxpro en Español
Definitivamente no hay una varita mágica para migrar de DBF a un servidor de base de datos.

Pero no es lo mismo tirar código de CERO a usar librerías, por ejemplo si quiero usar Códigos de Barras, para que empezar de cero si ya existe foxbarcode, mejor me dedico a estudiar la librería que ponerme a investigar como generar desde cero códigos de barras, que si el tipo de fuente, que si el tamaño que si la impresora que no se que, que no se cuando jajaja y unas cuantas lineas con foxbarcode estoy del otro lado, aprovechando el enorme esfuerzo que realizaron sus creadores y que compartieron para que no pasemos por lo mismo.

Entonces por ejemplo con FoxyDb no tienes que tirar código de cero para conectarte a Mysql, MariaDb y FireBird, estudias la librería y empiezas a usar sus funciones, y no perder el tiempo en como programar para conectarme y desconectarme, como programar para ejecutar una consulta, como programo los update, delete, insert, como se usan las transacciones y como programo para activarlas, que instrucción sql necesito para obtener el ultimo id insertado, etc etc tirar código para eso de cero es un buen de información por estudiar, entender y practicar, pero si ya existe FoxyDb mejor estudio sus funciones y vamos caminando rápido!!! por ejemplo para obtener el ultimo ID solo ejecuto odb.id() que andar viendo SqlExec(ocn,"selec..... ") etc etc nada que ver no?

Es mucho mejor invertirle tiempo en las librerías que intentar empezar de cero y fracasar en el intento, y mas cuando vienen de DBF que para saber como los manejaron jajajajaj y por supuesto que foxydb no te va a normalizar las tablas, ese tiempo que te va ahorrar usar foxydb lo inviertes en aprender a usar el servidor de base de datos, por ejemplo los tipos de datos que usa VFP con los que usa el servidor, indices, los primary key, etc.

Aprovechen lo que ya existe y no traten de inventar el hilo negro!! 

saludos
Antonio Meza

Martin Paredes

unread,
Dec 1, 2015, 9:22:13 PM12/1/15
to Comunidad de Visual Foxpro en Español
Cuando una libreria haga esto por mi, me arrodillo, cuando una libreria haga por mi en automatico instrucciones PLSQL, me enpino.

depender de una Liberia, es como traer siempre aire y vida artificial, una vez que falla ahi quedaste.....

FUNCION POSTGRESQL, esto si es arquitectura cliente/servidor........
  1. CREATE OR REPLACE FUNCTION mapasoft.fn_pvtacory_remi_fact_recibos(enosucursal integer, enoremision integer, enocliente integer, enometodo integer, etipocamb numeric, eimpsubtot numeric, eimpieps numeric, eimpiva numeric, eimptotal numeric, eivapor numeric, ectabanca character, eemail character, efecha date, enocaja numeric, enoturno numeric, enodiario integer[], ereferencia character, ecomentario character, enocobranza integer, emasiva numeric)
      RETURNS SETOF mapasoft.remision AS
    $BODY$
    DECLARE
       _eimpsubtot NUMERIC;
       _eimpieps NUMERIC;
       _eimpiva NUMERIC;
       _eimptotal NUMERIC;
    BEGIN
       IF NOT EXISTS(SELECT noremision FROM mapasoft.remision WHERE nosucursal=enosucursal AND noremision=enoremision LIMIT 1) THEN
          IF NOT EXISTS(SELECT noremision FROM mapasoft.pvtacory WHERE nosucursal=enosucursal AND noremision=enoremision LIMIT 1) THEN
             IF EXISTS (SELECT nodiario FROM mapasoft.pvtacory
                               WHERE nosucursal=enosucursal AND noremision=0 AND fecha=efecha AND nocaja=enocaja AND noturno=enoturno AND
                                     nodiario=ANY(enodiario) AND cveentsal=7 AND estatus=1) THEN
                UPDATE mapasoft.pvtacory SET noremision=enoremision
                       WHERE nosucursal=enosucursal AND noremision=0 AND fecha=efecha AND nocaja=enocaja AND noturno=enoturno AND
                             nodiario=ANY(enodiario) AND cveentsal=7 AND estatus=1;
                IF EXISTS (SELECT noremision FROM mapasoft.pvtacory WHERE nosucursal=enosucursal AND noremision=enoremision LIMIT 1) THEN
                   DROP TABLE IF EXISTS paso;
                   CREATE TEMPORARY TABLE paso AS
                   SELECT * FROM mapasoft.pvtacory WHERE nosucursal=enosucursal AND noremision=enoremision ORDER BY nodiario, nopartida;
                   IF FOUND THEN
                      WITH nnopartida AS
                           (
                            SELECT idpvtacory, nopartida, ROW_NUMBER() OVER ()::numeric(3,0) AS newnopartida
                                   FROM paso
                           )
                            UPDATE paso SET nopartida=nnopartida.newnopartida
                                   FROM nnopartida
                                        WHERE nnopartida.idpvtacory=paso.idpvtacory;
                      IF EXISTS(SELECT nopartida FROM paso WHERE nopartida=1) THEN
                         IF emasiva=0 THEN
                            UPDATE paso SET precio=ROUND(precio/(1+(poriva*0.01)), 2), importe=ROUND(cantidad*(precio/(1+(poriva*0.01))), 2);                       
                         ELSE
                            SELECT INTO _eimpsubtot SUM(importe) FROM paso;
                            SELECT INTO _eimpiva ROUND(SUM(importe*(poriva*0.01)), 2) FROM paso;
                            eimpsubtot=_eimpsubtot;
                            eimpiva=_eimpiva;
                            eimptotal=(_eimpsubtot+_eimpiva);
                         END IF;
                         IF eimpsubtot>0 AND eimptotal>0 THEN
                            IF NOT EXISTS(SELECT noremision FROM mapasoft.remision WHERE nosucursal=enosucursal AND noremision=enoremision LIMIT 1) THEN
                               INSERT INTO mapasoft.remision (noremision, nosucursal, nocliente, clavepago, formaenvio, novendedor, moneda, nometodo, nopartida,
                                                              noarticulo, producto, cantidad, unidad, precompra, precio, importe, poriva, porieps, pmoneda, noorigen)
                                                       SELECT noremision, nosucursal, enocliente, 1, 1, novendedor, 1, enometodo, nopartida, noarticulo,
                                                              producto, cantidad, unidad, precompra, precio, importe, poriva, porieps, pmoneda, 2
                                                              FROM paso;
                               IF EXISTS(SELECT noremision FROM mapasoft.remision WHERE nosucursal=enosucursal AND noremision=enoremision LIMIT 1) THEN
                                  UPDATE mapasoft.remision SET tipocamb=etipocamb, comentario=ecomentario, impsubtot=eimpsubtot, impieps=eimpieps, impiva=eimpiva,
                                                               imptotal=eimptotal, ivapor=eivapor, ctabanca=ectabanca, email=eemail, referencia=ereferencia
                                         WHERE remision.nosucursal=enosucursal AND remision.noremision=enoremision AND remision.nopartida=1;
                                  IF NOT EXISTS (SELECT nocobranza FROM mapasoft.cobraenc WHERE nosucursal=enosucursal AND nocobranza=enocobranza LIMIT 1) THEN
                                     INSERT INTO mapasoft.cobraenc (nosucursal, nocobranza, noremision, nocuenta, nocajero, abonos)
                                                            VALUES (enosucursal, enocobranza, enoremision, 99, 99, eimptotal);
                                     IF EXISTS (SELECT nocobranza FROM mapasoft.cobraenc WHERE nosucursal=enosucursal AND nocobranza=enocobranza LIMIT 1) THEN
                                        IF NOT EXISTS (SELECT nocobranza FROM mapasoft.cobradet WHERE nosucursal=enosucursal AND nocobranza=enocobranza LIMIT 1) THEN
                                           INSERT INTO mapasoft.cobradet (nosucursal, nocobranza, formpago, imppagos)
                                                                  VALUES (enosucursal, enocobranza, 99, eimptotal);
                                        END IF;
                                     END IF;
                                  END IF;
                               END IF;
                            END IF;
                         END IF;
                      END IF;
                   END IF;
                   DROP TABLE IF EXISTS paso;
                END IF;
             END IF;
          END IF;
          RETURN QUERY SELECT * FROM mapasoft.remision WHERE nosucursal=enosucursal AND noremision=enoremision ORDER BY nopartida;
       END IF;
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100
      ROWS 1000;
    ALTER FUNCTION mapasoft.fn_pvtacory_remi_fact_recibos(integer, integer, integer, integer, numeric, numeric, numeric, numeric, numeric, numeric, character, character, date, numeric, numeric, integer[], character, character, integer, numeric)
      OWNER TO "Mapasac";
Salds.
Mapasac
General Escobedo, N.L. Mexico


  1. El martes, 1 de diciembre de 2015, 15:46:30 (UTC-6), Oscar Quiros Coto escribió:

Víctor Hugo Espínola Domínguez

unread,
Dec 1, 2015, 11:26:19 PM12/1/15
to publice...@googlegroups.com
Hola Antonio

>como programar para conectarme y desconectarme, como programar para ejecutar una consulta, como programo los update, delete, insert, >como se usan las transacciones y como programo para activarlas, que instrucción sql necesito para obtener el ultimo id insertado, etc etc

Yo creo que la dificultad no va por ese lado, son menos de 10 sentencias y/o funciones que uno debe aprender a usarlas. El gran problema es cambiar el chip cerebral, olvidarse de lo aprendido y utilizado por mucho tiempo. Te propongo preparar un ejemplo sencillo de abm usando la técnica de programación en capas conjuntamente con la librería FoxyDb, creo que podemos usar el modelo propuesto por Les Pinter https://www.universalthread.com/ViewPageArticle.aspx?ID=232, si estás de acuerdo dame un OK y empiezo a preparar el proyecto.




Saludos,
Víctor.
Lambaré - Paraguay.


Antonio Meza

unread,
Dec 1, 2015, 11:42:14 PM12/1/15
to Comunidad de Visual Foxpro en Español
jajaj no pues si, definitivamente tu si le bajas la moral a cualquiera, casi casi nos estas diciendo que cambiemos de profesión jajaja

Una pregunta el lenguaje VFP y otros, el servidor de base de datos Mysql y otros, incluso el sistema operativo Windows y otros, que a caso no están compuestos por librerías o usan librerías propias y de terceros? y cuando falla una o varias no esperas a que salga una actualización o parchas el bug o lo reportas? o de que estamos hablando entonces? porque ya me perdí jajaj, osea si no quieres depender de las librerías entonces de seguro tienes tu propio sistema operativo, tu propio lenguaje de programación, es mas los procesadores tiene librerías así que de seguro también diseñaste el tuyo jajajajaj es BROMA!!!! tranquilos todos!!! quietos!!!! jajaja aun no es viernes pero ya es noche y ya llegue jajaj y esta muy bueno el chiste!!! porque si es un chiste eso de no depender de librerías? es que ya me lo estaba creyendo que hablabas en serio uuffff 

Con todo respeto definitivamente tienes confundido el termino cliente-servidor, como dice Rocky te hace falta leer mas books jejeje

Resultado de imagen para rocky mas book

Te hago varios comentarios con el fin de les sirvan a otros también por si no los quieres tomar en cuenta!!

Una cosa es un Strore procedure contenido en un servidor de base de datos y otra cosa es que un cliente se conecte a un servidor para realizar una acción como por ejemplo ejecutar un SP. nada que ver el termino con tu ejemplo, son dos cosas distintas, a ver conecta al servidor por medio de un Store procedure?? verdad que no? porque primero estableces la conexión cliente-servidor y luego realizas la acción como un Select, ejecutar un SP, etc etc.

Una recomendación, es tablas DBF se tenia la limitante de usar máximo 10 o 11 (no recuerdo exactamente) caracteres para el nombre de los campos, pero en los servidores de base de datos es mayor (no recuerdo exactamente) y no lo estas aprovechando, resulta algo complicado que una persona externa trate de entender tu SP, porque se pierde mas tiempo tratando de adivinar que significan los campos que en el proceso del SP, eso siempre se lo recomiendo a todos los que eh visto sus tablas de un servidor de base de datos.

Otro detalle los nombres de las tablas van en plural, como Remisiones, Pasos, etc, los nombres de los campos van en singular.son reglas de normalizacion de base de datos relacionales, no me las invente.

Otro detalle que veo en tu SP es que no especificas el nombre de la tabla al que pertenece el campo eso es una muy pero muy mala practica, y también esta descrito en reglas de bases de datos.

Te falta usar campos primary key en tus tablas!!! porque si tienes una tabla de Remisión (remisiones) que tiene un campo sucursal y un folio de remisión, debes tener a parte un campo ID que identifique el registro de la Remisión, entonces en los Where o Join solo tienes que hacer mención al ID de la remisión porque con ese simple ID ya sabes que el registro pertenece a la sucursal X y tiene el folio 0001111.

tabla remisiones
id idsucursal remision
5  1               000012
8  2               000005

En tu tabla Pvtacory debes tener algo así
id  idsucursal idremision  campoX  campoY  CampoZ
11 1               100             A            B             C
22 2               150             D            E             F
60 2               170             G            H             I 

Si quiero saber todos los números de folios de remisiones que son de la sucursal uno que están en la tabla Pvtacory

Select 
           p.CampoX
         , p.CampoY
         , p.CampoZ
         , r.remision
     form Pvtacory as p
     inner join remisiones as r
      on Pvtacory.idremision = remisiones.id
     where Pvtacory.idsucursal = ?xxx

Y en tu caso usas así
WHERE nosucursal=enosucursal AND noremision=enoremision LIMIT 1

Por lo tanto tus Inner Join serian igual
ON nosucursal=enosucursal AND noremision=enoremision LIMIT 1

Muy diferente a solo
on Pvtacory.idremision = remisiones.id

saludos
Antonio Meza
Auto Generated Inline Image 1

Antonio Meza

unread,
Dec 2, 2015, 12:35:57 AM12/2/15
to Comunidad de Visual Foxpro en Español
Hola Victor!!

Cuando empece a investigar sobre Cliente-Servidor, que conlleva muchos temas, en especial elegir el servidor de base de datos relacional (Mysql antes y ahora MariaDB) estudie mucho normalizacion de base de datos relacionales, indices, transacciones, campos primary key, tipos de datos, vistas, SP, tiggers, etc, etc, buenas practicas para el diseño de base de datos, nomenglaturas, y luego de eso como hacer para que desde VFP comunicarme con el servidor de base de datos, todo eso dio como resultado FoxyDB, no es solo aprenderse 10 sentencias para construir una librería de acceso a datos, porque eh visto varias que han publicado y NINGUNA hace mención a las transacciones, todas los códigos que eh visto usan transacciones automáticas cuando existen transacciones manuales y a demás de lectura y de escritura, enviar un simple Select a cualquier servidor con una transacción de escritura lo pones ha realizar trabajos innecesarios, en cambio si envías una transacción de solo lectura y haces un select y finalizas con un commit la operación es mas rápida consume menos recursos, etc, etc y ese simple hecho los que usan CursorAdapter, Vistas Remotas, Cursores actualizables no lo contemplan, no todos pero si la mayoría o luego quieren presumir Store procedure jajaja

Detrás de FoxyDb hay mucho estudio de mi parte y de la experiencia de muchos que me ayudaron con dudas o foros o blogs donde encontraba las soluciones, no es solo usar SqlExec como la mayoría cree y listo, es como todo si funciona pero cuando los datos crecen y los usuarios ahí ya me avisaran jajajaj ahh y no olvidar a Francisco que fue realmente mi estrella en usar foxyDb y reportarme los errores y mejoras, por ahí se me escapan alguno pero es quien mas me ha contribuido, no se su apellido jejej pero aparece en el historial de cada versión.

FoxyDb obliga a normalizar tablas, hacer uso de los campos primarykey, te permite conectar y desconectar y enviar los cambios cuando quieras sin bloquear ni afectar al servidor, permite sesiones privadas de datos que VFP tiene, te permite utilizar una sola conexión y compartirla con sesiones privadas, o lo recomendado es usar conexión y desconexion, en fin no terminaría de decirte todo lo que tiene la librería, no es lo que muchos creen, esta muy completa y el uso es tan sencillo pero si hace falta cambiar de mentalidad o de cerebro porque el cambio de DBF a servidor de base de datos es total, radical incluso para algunos.

La verdad que si estuviera en CodePlex ya estuviera en varios idiomas, con casi todos los servidores de bases de datos jajajaj y mejorada al 2000% pero mi ingles es malo como decir "caman mamey" jajaja el anuncio de open english, hay que documentar también y se requiere tiempo!!!

No quise poner ejemplos de Capas porque sabia que les costaría muchos, ya que casi nadie en el foro programa en Capas, es mas ve el tema que puse de usar cursores como objetos y nadie contesto jajaja porque lamentablemente no tiene idea que es eso, y los que usan en capas luego no tienen ni idea siquiera de lo que están haciendo jajaja y los genios de las capas no se meten en temas controversiales jajaja

Tengo mi librería llamada FoxyBI.prg que es la capa de negocios y mi librería FoxyBi_Data que es la capa de datos que usa la capa de acceso a datos que ya conoces FoxyDb y por ultimo tengo mi FrameWork para la capa de presentación llamado FoxyFw que interactua con FoxyBi.

Siempre he sido partidario de crear un verdadero FrameWork que compartamos todos lo que quieran compartir jajaj pero es a veces frustrarte el bajo interese de las cosas, por eso muchos se desaniman en compartir, tenia pensado compartir el proyecto completo pero a FoxyDb lo usan pocos y ya un framework completo es otra historia, si no pueden con algo sencillo y no estudian y practican y preguntan menos podrán con el paquete completo y seria perdida de tiempo que hagas las capas, no lo van a usar porque es algo totalmente cambiar de cerebro.

te paso parte del proyecto que eso que dice ahí lo hago actualmente, y si ves un error de concepto o de interpretacion me avisas para correguirlo jejeje 

NOTA: En verdad que no me molesta que me corrugan, lo que me molesta es que se rían de mi y no me digan porque jajajajaj en cambio la mayoría se molesta cuando le dices donde anda mal y en vez de decir un simple OK, o lo reviso o algo mas natural un simple Gracias se te viene encima a comerte jajajaj

Estoy finalizando la actualizacion de mi sistema contable para Mexico, anteriroemtne usaba DBF ahora usa MariaDb, pero esta reescrito de cero usando todo lo que tiene que ver con buenas practicas y cada linea de codigo donde le corresponde, fue un verdadero reto cambiarme el cerebro la verdad pero valió la pena, ahora puedo agarrar cualquier lenguaje y programar sin problemas, porque ya entiendo todo lo referente a las capas, POO, etc etc etc, ahí te dejo la lectura en el pdf, es solo una parte lo mas concreto.

saludos
Antonio Meza
proyecto open source.pdf

Martin Paredes

unread,
Dec 2, 2015, 1:23:10 AM12/2/15
to Comunidad de Visual Foxpro en Español
Antonio, por lo que escribes, me doy cuenta de como piensas, pero, aguanto vara, en este foro, que somos invitados que te quede claro, se intercambian, comparten y se opina, sobre temas concurrentes de tecnologías IT, desarrollo de software, etc.etc. si te molesta, te altera y/o te trastornan las opiniones contrarias a las tuyas, pues ese es tu problema.

De Tu librería, que ni siquiera la conozco y que a todos se las quieres imponer...!!!

Trabaja con, SAP??, Oracle??, DB2??, Progress??, Sybase??, quien la tiene instalada y quien la esta usando,
El patito fresh fud, Coca Cole, Pemexcito, Osito Bimbo, Petrobrax. Osso, Aeromézico.........Quien

La Funcion que criticas, tiene 5 años de antiguedad, la utilizan muchos y muchos comercios de puntos de venta, restaurantes, bares y mas que trabajan las 24 hrs. 7/30/365 días del año, pero, creo que tengo que revisarla a detalle porque ya le encontraron hoyos negros, peros y mucho mas.........

Tengo que estudiar, estoy desactualizado, tengo que leer y mucho, mucho, me falta mucho. tengo que leer mas book, book, book..........

Oscar, sorry por des-ubicarte un poco del tema original, pero asi son las cosas en la tecnología. son como la política, nunca nos ponemos de acuerdo.

Salds.
Mapasac
General Escobedo, N.L. Mexico







El martes, 1 de diciembre de 2015, 15:46:30 (UTC-6), Oscar Quiros Coto escribió:

Carlos Miguel FARIAS

unread,
Dec 2, 2015, 8:09:36 AM12/2/15
to Grupo Fox
No hay soluciones mágicas. Y aquí se han dicho muchas verdades. Todas valederas. Pero no se ha analizado correctamente el requerimiento de Oscar, que por cierto, tampoco veo del todo explicitado.
Migrar URGENTE aplicación MONSTRUOSA de DBF a MARIADB.
Si quieres hacer algo urgente, hay un error de fecha de comienzo de la tarea, no se empezó con tiempo, Urgente implica poco tiempo (que es poco tiempo?), si es porque el cliente lo pide intempestivamente, que pague, con plata, se puede en general resolver todo urgente, si es por demora tuya Agua y Ajo. Que definís por monstruosa, monstruosamente grande, monstruosamente fea, o ambas (y si es ambas, que carajo estas haciendo con mi suegra?! ;-D).
Se propusieron varias opciones. Por ejemplo, normalizar la BD, no se si es necesario, pero normalizar implica repensar el negocio. Es como decir que viene un tsunami y decides construir un dique.
Se discuten conceptos de cliente servidor u otras cosas. No puedo deducir de lo que dice Oscar que el sistema no tenga ya arquitectura cliente servidor (donde las dbfs están en una sola máquina, servidor de archivos), de hecho, foxpro se destacaba en sus comienzos de la competencia por el rendimiento en entornos de ese tipo.
Los problemas de modificar la aplicación, va a estar, entiendo, acotada a como se acceden a los datos (lecturas, modificaciones, etc.) y como los datos accedidos se relacionan con los formularios y los reportes (y con que están hechos los reportes).
Si se usa el esquema xbase (append, replace, do while, aún scan, seek, etc.) independientemente de lo monstruosa de la aplicación, tal como dijeron, el chip a cambiar es un tronco. (chip=astilla ;-D). Hay que convertir toda la lógica a cursores y sql (no conozco la herramienta de Antonio, por lo que no se si usando esta o directamente SQLPassthru, el esfuerzo de adaptación es "monstruoso". Y si los formularios estaban conectados directamente a tablas, otro gran trabajo de "reconexionado"
Como entiendo que urgente impide rediseñar la bd, y según han indicado, foxydb utiliza autoincrementales, habría una imposibilidad de aplicación, ya que implica lo mismo que normalizar, pero bueno, eso podrá ser retificado/ratificado por los que conocen la herramienta.
Pasar a una arquitectura en capas (ideal), lo veo inviable por la urgencia.
Entonces, como es algo urgente: Solo se tiene tiempo de convertir los dbfs en tablas idénticas en mariadb, y pasa los datos tal cual, con las adaptaciones de algunos como fechas. Todo el uso de filtros, implicará crear vistas sobre la bd, con los wheres que oficien de filtros y acceder a los datos a través de esas vistas.
Donde se usaban SET RELATIONS, la estrategia es la misma, se crean vistas equivalentes.
Toda la lógica de acceso se debe pensar en función de cursores (listados, reportes, browses, procesos por lotes etc.)
Toda la lógica de append blank replace deberá convertirs a INSERTs, toda la lógica de REPLACEs a UPDATES WHERE!!!!.
Lo interesante es que toda esa conversión, se puede probar contra las mismas dbfs (eso es soportado por fox) y una vez logrado eso "envolver" las sentencias SQL (sobre dbf) con SQL Passthru y conexiones a la bd.
En el proceso de conversión. Sugiero:
a) Codificar los programas de migración de datos de dbf a mariaDB
b) Migrar todos los programas de reportes tipo lote, no los tipos on-lines (facturas) porque estos se pueden probar procesando a) y luego el reporte. De esa manera, comparar con los reportes directos (sin convertir) y detectar diferencias, que implicarían errores de conversión.
c) Migrar módulos que procesen datos tipo lote y probar a, b y c, para verificar diferencias (puede que al convertir una bd en otra te surjan diferencias (tengo entendido que mariadb no maneja datos currency y tiene que crearse el equivalente con decimal). Y los datos de fecha, muchas veces crean algunas diferencias.
d) Y después empezar a convertir programas de modifican datos, desde los más simples a los más complejos, para ir tomándole la mano paso a paso.
De esta manera, reducís los tiempos de paralelo, que es lo que más pueden criticarte, y relativamente rápido, estas mostrando producción con el sistema convertido.
No hay herramientas de conversión rápidas. Las costumbres de codificación de cada uno, son muy difíciles de cambiar, y en caso de urgencia KISS.
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe

mapner

unread,
Dec 2, 2015, 10:57:16 AM12/2/15
to Comunidad de Visual Foxpro en Español
No hay soluciones mágicas, solo soluciones tecnológicas altamente complejas

"Toda tecnología lo suficientemente avanzada es indistinguible de la magia" 
Arthur C. Clarke 
https://es.wikipedia.org/wiki/Leyes_de_Clarke

Para pasar de DBFs a SQL C/S 
- Crear las tablas en MariaDB e importar los datos DBF
Para esto vas a Google, buscas DBF-MySQL Converter y apareceran 5000.000 de utilitarios que los hacen: como ser: http://www.convert-in.com/dbf2sql.htm
- Manejar MariaDB C/S desde tu actual aplicación VFP. 
Dos caminos: 
1) emparchar tu actual app en forma precaria: cambiar las aperturas (USE ...) por obtención de datos (filtrados) con VR, SPT o CA. y cuando tengas que grabar, actualizar a remoto. 
Las Vistas Remotas no son recomendables para proyectos grandes y diseñados en capas, pero para migraciones en proceso no son una mala idea.
2) Rediseñar por completo tu app diviendo en capas, UI, Reglas de Negocios y Acceso a Datos. Te llevará mas tiempo pero tu sistema quedará mas consistente para mantener.

Para pasar de VFP a WEB:
 Acá la cosa cambia y mucho. Significa reescribir por completo tu app en otra plataforma / lenguaje. Hay bibliotecas enteras que hablan de este tema.
Sugerencia: capacitación, capacitación, capacitación ...

Si todo esto lo tienes que hacer en tiempo record hay algo llamado dinero, con lo cual tercerizas tu proyecto llave en mano con alguien idóneo y a esperar los resultados. (a riesgo de no cambiar el auto por un par de años...)

Suerte!   

Antonio Meza

unread,
Dec 2, 2015, 11:02:50 AM12/2/15
to Comunidad de Visual Foxpro en Español
jajaja imponer?? pues ni que fuera Diputado o Sacerdote o Presidente, como para imponer algo a alguien jajaj eso si estuvo de chiste de viernes!!

"Foro a partir de hoy el que no use FoxyDb no escriba mas en este foro" jajaja eso si seria imponer y a demás no lo haría yo tendría que ser el administrador del foro y no lo soy y aun cuando lo fuera no haría tal cosa!!! buen chiste!!! jajaja esta como el chiste de ayer de no usar librerías jajajaj

La librería FoxyDb (patito feo o feo el patito jaja) la uso yo y la compartí para el que guste usarla, muy diferente recomendar que imponer, el código es libre lo puedes mejorar sin problemas e incluso mejorarla y venderla jajajaj o revisarlo y si encuentras detalles me dices y los modifico no me molestaría al contrario te lo agradecería a diferencia de otros que se enojan y molestan y alteran porque les digan que algo no esta bien, en mi caso es diferente me gusta que me ayuden y me digan hey aquí estas aplicando mal se así por esto y esto, por ejemplo recuerdo que hace mucho tiempo Edgar S. que ya no lo veo por aquí, me dijo no se escribe "eh escrito" para referirse a una persona se escribe "he escrito" y cada vez que voy a escribe "eh .." me acuerdo del comentario de Edgar y escribo "he escrito" si no fuera por el seguiría escribiendo "eh" cuando es "he" y eso lo agradezco mucho en cambio "otros" se molestan pero bueno así es esto del mole hay de varios chiles jajaja

Y como recomendación siempre que vayas hablar de un tema o en este caso una librería es mejor documentarse antes de hablar, eso es mas feo, hablar por hablar como decía otro compañero en el foro, tanto el código como la poca documentación esta libre!!

Nota: Recuerda que el hecho que un procedimiento, función, trabaje bien por mas de 1000 años y todo el planeta la use no quiere decir que esta bien escrita, solo funciona. ojo!!! no critique, te di tips para mejorarla y si quieres hacerlo bien si no también!!! jejeje y si me dices donde puedo mejorar te lo agradecer mucho!!!

saludos
Antonio Meza

Edwin Quijada

unread,
Dec 2, 2015, 11:56:31 AM12/2/15
to Comunidad de Visual Foxpro en Español
Lo puedes llevar a PostgreSQL , te lo recomiendo 100%, tienen una herramienta para hacerlo dbf2pg aunque si te pones necio usando un FDW puedes hacerlo directamente desde Postgres en tiempo record. Pase todo un sistema de VFP , la BD no era tan grande, pero pase todo en par de horas. Claro, algo que debes saber tu experiencia con esa otra herramienta eso dependera tu rapidez

Jairo Miranda

unread,
Dec 2, 2015, 12:44:03 PM12/2/15
to publicesvfoxpro
VFP 9.0 tiene una opción rápida que es UPSIZING  o Conversión a SQL SERVER

!!! Pruebalo ! a ver  !!

JM

Oscar Quiros Coto

unread,
Dec 2, 2015, 2:24:47 PM12/2/15
to publice...@googlegroups.com
Esta opción, alguno lo a probado?, el sistema utiliza base de datos nativa, no son dbfs libres.

Mis sistemas los tengo con VFP+MySql, pero un cliente, con fuentes, necesita hacer el cambio, y quiero evaluar algunas opciones y sugerencias,antes de tomar alguna decisión.

Saludos.

Edwin Quijada

unread,
Dec 2, 2015, 3:19:39 PM12/2/15
to publice...@googlegroups.com
Pero el cambio a que ? Que es lo que quiere cambiar ?

Oscar Quiros Coto

unread,
Dec 2, 2015, 3:24:49 PM12/2/15
to publice...@googlegroups.com
El sistema en cuestión, utiliza base de datos .dbc.
Utiliza gather memvar, scatter memvar, replace campo with etc... la idea es pasarlo a un motor de base de datos de la forma mas rápida posible, sqlserver,mysql, mariadb o postgress, de ahi la consulta, tal vez ya saben como hacer, alguna con experiencia real en el asunto que pueda dar recomendaciones. Lo de real me refiero con alguna herramienta como foxincloud o el UPSIZING que nunca lo he probado.

Saludos.

Patricio Muñoz

unread,
Dec 2, 2015, 3:33:39 PM12/2/15
to publice...@googlegroups.com
Oscar pide ayuda para pasar un sistema que esta en dbf a un SGBD,

al rato escribe lo siguiente:
"Esta opción, alguno lo a probado?, el sistema utiliza base de datos nativa, no son dbfs libres.

Mis sistemas los tengo con VFP+MySql, pero un cliente, con fuentes, necesita hacer el cambio, y quiero evaluar algunas opciones y sugerencias,antes de tomar alguna decisión.

Saludos."

Quien entiende eso?
lo primero dice que el sistema esta en DBF
lo segundo dice que TODOS sus sistemas estan en MySQL
lo tercero dice que un cliente tiene los fuentes... fuentes de que?.. asumo que el sistema no es de su autoría.

En conclusion: Que es lo que quiere?... Quiere hacer una migración de un sistema hecho por otro?. Si es así, cual es el problema si el trabaja con SGBD ya que TODOS sus sistemas estan en MySQL?

Bendiciones




--
Patricio Muñoz
Pro&Tech
Analista en Sistemas

Edwin Quijada

unread,
Dec 2, 2015, 3:43:00 PM12/2/15
to publice...@googlegroups.com
Oscar, creo que arrancaste de la forma equivocada sugiero que decidas a cual BD quieres migrar dependiendo de las prestaciones y de lo que te ofrezca la BD y luego entonces piensa en migrar. Sino sabes usar la BD que se eligio pues contrata ayuda para la migracion pero el criterio que estas usando, la que sea mas rapida para moverme, creo que no es el mas correcto

Oscar Quiros Coto

unread,
Dec 2, 2015, 3:49:43 PM12/2/15
to publice...@googlegroups.com
Gracias amigo.
Mil disculpas, no me doy a entender.

Mis sistemas estan en VFP+MySql, al decir mis sistemas, son los que yo desarrolle, con esto no hay problema.

Tengo un cliente con un sistema muy grande con VFP+.dbc, es decir con base de datos nativa, las .dbfs no están "sueltas", puesto que están dentro de la .dbc, a eso me refiero cuando indique noooooo son dbfs libres
Dicho sistema es de otro desarrollador o desarrolladores, no es mio, el cliente cuenta con todas las fuentes, fuentes son los archivos .prg, .scx, .vcx,  etc, no se por que no sabes que son fuentes.

Solicite ayuda, para ver quien ha hecho esto por medio de alguna herramienta, por ejemplo foxincloud, o el upsizing, para proponerlo al cliente, y no tener que hacerlo """manual""", ojo a las comillas, es decir manual entre comillas, para que entiendas.
Tienes que leer todo el contexto, cuando indico : Esta opción, alguno lo a probado? es con referencia a la respuesta anterior, a la que hacia referencia al UPSIZING

Saludos cordiales.

Edwin Quijada

unread,
Dec 2, 2015, 3:58:25 PM12/2/15
to publice...@googlegroups.com
Pero si mal no recuerdo el UPSIZING solo funciona para MSSQL entonces si quieres esto ya tendrias que ir para esta BD. Como te dije creo que deberias primero saber hacia donde , que BD, vas a usar pero dado que tienes experiencia con MySQL pues creo que no hay mucho que decir en este caso

mapner

unread,
Dec 2, 2015, 4:15:42 PM12/2/15
to Comunidad de Visual Foxpro en Español
Email...@ssoqc.com - oscarqu...@hotmail.com
Skype: oscar.quiros.coto
GTalk: os...@ssoqc.com



-- 
___________________________________________________
Soporte y Sistemas OQC, S.A.
Partner Autorizado de ESET en Costa Rica
Cel:(506) 87 11 00 11   (506) 62 00 18 76
Email...@ssoqc.com - oscarqu...@hotmail.com
Skype: oscar.quiros.coto
GTalk: os...@ssoqc.com



--
Patricio Muñoz
Pro&Tech
Analista en Sistemas
-- 
___________________________________________________
Soporte y Sistemas OQC, S.A.
Partner Autorizado de ESET en Costa Rica
Cel:(506) 87 11 00 11   (506) 62 00 18 76
Email...@ssoqc.com - oscarqu...@hotmail.com
Skype: oscar.quiros.coto
GTalk: os...@ssoqc.com

Antonio Meza

unread,
Dec 2, 2015, 4:43:27 PM12/2/15
to Comunidad de Visual Foxpro en Español
Migrar el sistema de otro desarrollador?? ufffff ahhh noooooo buenooooooo!!! eso si ya es otra histeria digo historia!!

Si los sistemas propios son difíciles de migrar de DBF a Servidor de base de datos ahora imaginen migrar un sistema desarrollado por otra persona!!!! que primero tienes que descifrar para poder migrar, es mejor que lo hagas nuevo con lo que ya usas seria mas rápido, mas fácil y mejor, que entiendas un calculo o un procedimiento que ve a saber que estaba pensando cuando lo hizo el otro ahora revisar todas las rutinas la lógica y ni decir de los datos jajajaj

Que la fuerza te acompañe!!! porque vas a necesitar ayudar de máximo supremo!!! dice mi hija que vas a necesitar un padrino mágico jajaj

saludos
Antonio Meza
Email...@ssoqc.com - oscarqu...@hotmail.com
Skype: oscar.quiros.coto
GTalk: os...@ssoqc.com



-- 
___________________________________________________
Soporte y Sistemas OQC, S.A.
Partner Autorizado de ESET en Costa Rica
Cel:(506) 87 11 00 11   (506) 62 00 18 76
Email...@ssoqc.com - oscarqu...@hotmail.com
Skype: oscar.quiros.coto
GTalk: os...@ssoqc.com



--
Patricio Muñoz
Pro&Tech
Analista en Sistemas
-- 
___________________________________________________
Soporte y Sistemas OQC, S.A.
Partner Autorizado de ESET en Costa Rica
Cel:(506) 87 11 00 11   (506) 62 00 18 76
Email...@ssoqc.com - oscarqu...@hotmail.com
Skype: oscar.quiros.coto
GTalk: os...@ssoqc.com

Juan C. Rivera Rosel

unread,
Dec 2, 2015, 4:50:54 PM12/2/15
to foxseros


Presenta un nuevo proyecto para desarrollar desde cero incluyendo migracion de datos y cobra 50 mil dolares, asi trabajaras tranquilo y con entusiasmo y si necesitas ayuda me pasas la voz ($).

Atte.



Juan Carlos Rivera Rosel





Date: Wed, 2 Dec 2015 13:15:42 -0800
From: mpis...@gmail.com

To: publice...@googlegroups.com
Subject: Re: [vfp] Re: O.T Necesito migrar aplicacion monstruosa de VFP a otra herramienta, o bien pasarlo de DBF a MariaBd en tiempo record

Carlos Miguel FARIAS

unread,
Dec 2, 2015, 5:32:32 PM12/2/15
to Grupo Fox
Yo las primeras fuentes que vi se rompieron, y encima después la partera me echo las culpa y me pego en el qlo (colita en esa época).
Y tal como comentan, a veces, un sistema es mas fácil reescribirlo de cero que adaptarlo.
Una ventaja podría darse en que, como está hecho con bd nativas, ya esté normalizado.
Además las tablas tendrán nombres apropiados.
Hay funciones de vfp que permiten escribir el sql de las tablas (para hacer las correcciones pertinentes y recrear la bd).
Para migrar, lo más fácil, es crear la bd en postgresql, crearle vistas remotas en la dbc, y luego transferir los datos en procesos por lotes. No es muy rápido de ejecutar pero fácil de instrumentar. Y se presupone que luego, irás optimizando con SPT o CA, o con FoxiDB (si puedes adaptarles los autoincrementales).
Personalmente, no me convencen los autoincrementales desde el punto de vista lógico de diseño, si es cierto que simplifican el diseño, y los accesos por PK. Pero es una simplificación de programación, igualmente, por algún lado se debe agregar algún campo-indice para establecer la unicidad, o en algún punto, se debe usar la unicidad.
Tampoco me parecen que no deban utilizarse, en algunos tipos de tabla, son apropiados, y son aplicables en enfoques OO.
Los autoincrementales se pudren cuando tienes datos equivalentes en bd o tablas separadas, y luego tienes que juntar los datos.
Para eso utilizo campos autocalculados, que no tienen problemas al momento del merge.
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe, yo voy a ver si ubico la partera HDP

Antonio Meza

unread,
Dec 2, 2015, 6:52:01 PM12/2/15
to Comunidad de Visual Foxpro en Español
Hola Miguel!! lo que pasa es que no tienes claro el concepto por eso no te convences de aplicarlo y te resulta mas sencillo hacer lo que haces, que por supuesto que funciona pero no es buena practica, pones al servidor a realizar búsquedas mas grandes.

Por eso FoxyDb los utiliza ya que son una maravilla!! cuando tengas claro el concepto de lo que representa un campo primary key autoincremental veras que los usaras.

En cuanto a tu comentario : "Los autoincrementales se pudren cuando tienes datos equivalentes en bd o tablas separadas, y luego tienes que juntar los datos.
Para eso utilizo campos autocalculados, que no tienen problemas al momento del merge."

Ese comentario claramente denota que no tienes claro el concepto, ya que una necesidad que tienes por tu diseño de base de datos lo suples combinando un campo primary key autocalculado para evitar problemas con una replicacion para que se entienda mas clara tu necesidad, es decir tiene la DB local por cada sucursal con tus campos combinados que luego envías a la DB remota matriz donde se junta toda la información de todas las sucursales, y de esta forma sigues por medio de los campos calculados teniendo las relaciones entre tablas pero obviamente pagas un rendimiento en la base de datos que no notarias mucho en pocos registros o pocos usuarios, pero a mayor numero pagaras el precio jejejej aunque no lo creas.

Normalizar una tabla no es cosa de niños hay que entender primero porque la importancia de normalizar, a muchos ni les interesa solo guardan la información como si fuera una hoja de excel (no digo que sea tu caso hablo en general) y luego la leen y guardan y así son felices y el sistema trabaja bien porque la concurrencia uy datos es poca y no se notan esos errores, incluso teniendo nuenos indices cuando los datos crecen es necesario revisar el PLAN para asegurarse que siga siendo el correcto a veces deja de serlo y se tienen que ajustar pero eso se ve en bases de datos de millones de registros.

saludos
Antonio Meza

Carlos Miguel FARIAS

unread,
Dec 3, 2015, 2:30:08 PM12/3/15
to Grupo Fox
Estimado Antonio:
En ningún momento he puesto en dudas tus conocimientos acerca de VFP y lo bueno o malo de framework de acceso a datos. Me molesta que indiques falta de conocimiento o ignorancia de parte mía en lo referente a lo de normalización de bases de datos (en adelante NBD) y/o el uso de autoincrementales (en adelante IAI).

Además, no encuentro relación en cuanto le hago "hacer  al sistema hacer una búsqueda más grande", y no conozco FoxyDB, y posiblemente sea maravilloso, pero solo porque está bien programado, no porque use IAI, es sería tal vez una limitación, si solo maneja PK de ese tipo, y no porque lo diga yo, si no porque lo dicen los "que saben".

En cuanto a NDB, empecé capacitandome en 1985, y luego fui perfeccionando me en lo teórico y práctico. En el año 1996 obtuve una certificación de M$ sobre SQL Server. En el año 1998 empecé con una investigación en la Universidad que desemboco en una técnica prácticas de NBD de datos (2003) publicada luego en un libro de Ingeniero de Sistemas doctorado en base de datos y minería de datos, que si la incluyo, es por lo apropiada que es la misma y no por razones de "quedar bien".

Dicha técnica fue ofrecida en este y otros foros, no se si el material se cargó en algún lado, pero bueno, si alguien le interesa, está disponible. La misma surgió de 20 años (a ese momento) diseñando sistemas, y 13 años (a ese momento) enseñando NBD en un carrera de Analistas Programadores (soy mi mejor alumno, 13 años aguantándome), la susodicha técnica permite normalizar mucho más rápido que un sistema que use álgebra relacional y formas normales, principalmente por la automaticidad del procedimiento de aplicación (es bien KISS), la particularidad que no requiere una formación muy grande del normalizador, solo que conozca los conceptos básicos del modelo relacional.

Y justamente allí es donde tu demuestras algún desconocimiento en lo referente a NBD. La NBD se aplica al modelo relacional. En el modelo relacional, cada una de las tablas tiene una clave primaria, dicha clave debe respetar criterios de unicidad y minimalidad. Las claves primarias deben componerse con la menor cantidad de atributos (campos, columnas) que permitan unicidad (no repetición) e identificación unívoca (no dos claves iguales).

Estas claves se conocen como naturales. Excepcionalmente, el modelo relacional, admite claves primarias artificiales (una de las posibilidades es el tipo IAI), y esta excepción se da cuando los atributos de la entidad normalizada no tiene ningún conjunto de campos que al momento de la creación de la instancia en la tabla, cumpla con los requisitos indicados de unicidad y minimalidad.

No tienen porque creerme directamente, investiguen en bibliografía de los "capos" en bases de datos como Date, Elmasri, y hasta el mismo Codd (creador del modelo relacional). En un libro introductorio por ejemplo (https://unefazuliasistemas.files.wordpress.com/2011/04/fundamentos-de-bases-de-datos-silberschatz-korth-sudarshan.pdf), ni se menciona IAI o siquiera claves calculadas como claves primaras. Por supuesto que hay mucha gente que indica la conveniencia de usar IAI en las bases de datos, y como indiqué, en algunos casos es aplicable, pero no es que si o si hay que usar IAI o calculados.

Es más, el concepto de IAI era un sistema de identificación de registros en los viejos sistemas indexados que usaban ISAM u otros sistemas de indexación en sistema informáticos de la década del 80 y anteriores, Se usaban porque los sistemas no tenían mucha capacidad de proceso (el 1° disco de 1GB es de 1980 y valía más de 100000 u$s). Entonces, el indice tenía que ser pequeño porque el sistema no se lo aguantaba si era grande.

Donde se empieza a utilizar el concepto de clave calculada (y en especial IAI) son en modelos objeto relacionales, que implica una serie diferentes (no mucho) del modelo relacional, y allí si se recurre a campos de ese tipo, pero estamos en un planteo de diseño diferente.
De hecho, tengo varios sistemas diseñados que utilizan un esquema objeto relacional, que utilizan claves primarias del tipo calculado, o sea, que cuando opino, no es por desconocimiento, si no porque los he usado, en las situaciones que su uso lo ameriten.
Probablemente, tenga más modelos objeto relacional diseñados que simplemente relacionales (por otra parte durante los 20 años que trabaje con mainframe, solo alcance en los últimos cinco a hacer algo relacional, básicamente por coexistencia con sistemas tradicionales que dificultaban la integración).

Como indiqué en el post anterior, los IAI aportan "simplicidad" al diseño del sistema, de hecho muchos frameworks orientados a la web y conocidos, como Django, y en algunos modelos de bd, no te queda otra que usar IAI, porque los datos campos (columnas, atributos) no tienen valores que puedan constituir una clave primaria. Es el caso de los gestores de contenido, eventos, noticias, etc, donde los contenidos que se cargan, datos textuales, datetimes, pero no campos que su valor no puedan repetirse, pero si hay duplicados en dicho valor, no es indicativo que se deba rechazar (no hay duplicidad, solo coincidencia temporal). Por ejemplo, los usuarios que se registran "alegremente" en un sistema web no formalizado, donde a lo sumo podría usarse como clave primaria la dirección de correo (y si la carga mal, basura).

Pero tengamos en cuenta una cosa, los IAI demandan más tiempo de proceso que un indice común (35% más en fox, según documentación del producto), en VFP, ocupan más espacio en disco (los índices) que un indice alfanumérico apropiado de menos de 8 caracteres. Todo indice numérico en vfp se almacena como entero de 8 bytes por clave, contra un indice alfanumerico con una clave menor a 8 bytes (ver ejemplos de CTOBIN, y BINTOC en fox).

En cuanto a diseño, un IAI ocupa poco espacio en la tabla (4 a 8 bytes) donde es PK, pero si o si ocupa más espacio que una clave natural, porque el IAI se puede omitir, los campos que componen la CN no. Si ahorran espacio en las tablas vinculadas, porque donde son FK (claves foráneas), se necesita la relación con la PK de la tabla principal, no importa si dicha PK es IAI o CN.

Evidentemente, en un esquema ACID, evitar conflictos con los IAI demanda más proceso del SGBD, para evitar los conflictos de diferentes sesiones de usuarios. Con una IAI, se debe extremar el control de asignación, ya que varias transacciones simultáneas indefectiblemente están compitiendo por un recurso común (la secuencia del IAI, que calcula el servidor) que con CN no lo hacen. La que se repite se rechaza y listo, o en algunos casos, actualiza "después" la misma instancia. Además, es raro, p.e. que el mismo cliente (CN con CUIT) se cree a la vez desde dos transacciones diferentes. En cambio en un esquema de IAI, el conflicto de proceso del IAI, es intrínseco del sistema.

Pero con un IAI, si tienes datos que no se pueden duplicar (claves candidatas) tienes que crear un indice sobre estas (UNIQUE) que al insertar, el sistema igualmente debe verificar, lo que implica doble proceso de control de indices (el IAI y el UNIQUE).

En el caso del ejemplo de sucursales (que tu mencionas) como problemático para mi esquema autocalculado (en adelante AC), porque afectaría mi desempeño, haces algo que no corresponde, opinas sobre algo que desconoces. Ya que no sabes como funciona dicho algoritmo. (Conste que el algoritmo lo publique en este y otros foros).

Todas las pruebas que hice me indican que si la red aguantara, podrían estar 10000 usuarios (desde diferentes PCs) insertando casi 1000 registros por segundo cada uno en una misma tabla, teóricamente el limite en vfp no lo puedo alcanzar por rebaso la capacidad de las tablas en unos 20". Corriendo y generando claves directamente sobre el servidor, el límite que encontré fue 1000 claves por segundo, en razón de que la clave generada tiene 8 bytes. El algoritmo, no necesita recurrir al servidor para la clave siguiente, y para cargar datos en tablas donde se usa como FK, solo tiene que asegurarse que no fue rechazada como PK por el servidor (de donde detecté ese límite de 1000 por segundo por usuario-pc).

Si esa capacidad no te alcanza, bueno, contrata a otro.

Ah, otra cosa, la clave AC me deja pistas de auditoria para saber quien cuando y donde cargo la fila.

Pregunto?
Si tienes sucursales "desconectadas" cargando datos maestros y sus relacionados, con IAI, cuando tienes que unificar datos, como lo haces? En cada sucursal, el SGBD genera su propia secuencia, que evidentemente, se repite cuando están desconectados, por lo tanto el IAI se repite, y su uso en relaciones también, cuando sincronizas, QUE HACES?.

Si te encuentras con sistemas heredados, que usan IAI, y luego debes unificarlos, es un parto de panza. Si usan CN, no es problemático, los conflictos se resuelven "naturalmente". Si el sistema usa IAI, y no controla bien lo que se carga en las claves candidatas, te aparecen duplicados que crea situaciones casi insolubles.

Como indique en este post, no estoy en contra del uso de IAI, o AC, es más, aplicando el principio KISS, uso IAI o AC, pero no como solución única, si no como algo que me permite simplificar el modelo, o en algunos casos (como los que mencione de gestores de contenidos o equivalentes). Pero si hablamos de NBD y eficiencia (no de simplicidad de diseño o codificación), me gustaría ver una explicación fundamentada, toy viejo pero quiero, tengo y puedo seguir aprendiendo.

Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe, CUIDADO, los IAI son una creación del lado oscuro de la Fuerza 😁
Reply all
Reply to author
Forward
0 new messages