Page 1 of 1

Consulta Sobre Pasar Dbf a Mysql

PostPosted: Thu Jan 28, 2021 1:23 pm
by remtec
Hola Amigos, muy buen día.

Tengo una solicitud de pasar periódicamente una DBF de 1.100.000 registros, a una tabla MySQL, donde realizaran algunas estadísticas externas.

Necesito como pasar esta DBF, con la complicación que existe una campo en la DBF que en la Tabla MySQL cambia de nombre, pero debe tener el mismo dato.

Estructura DBF.
Folio N 10
Fecha D
Cod_Pro C 5 ** Este Campo Cambia de Nombre en tabla MySQL
Nom_Pro C 40
...
...
...

Tabla Tabla MySQL
Folio N
Fecha D
Med_Tra ** Este Campo debe contener el mismo dato de Cod_Pro.
Nom_Pro


Existe alguna forma de realiza este proceso desde FWH 17.09, con algun codigo Prg. y generar una ejecutar un exe cuando se requiera.

Muchos Saludos

Antonio

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Thu Jan 28, 2021 2:20 pm
by cmsoft
Podes hacer el insert en la base de datos, recorriendo la dbf y cada n registros (por ejemplo 10000) grabas en la base
Code: Select all  Expand view

TRY
      CONNECT oServer HOST cServer ;
                      USER cUser ;
                      PASSWORD cPassword ;
                      PORT nPort ;
                      FLAGS nFlags;
                      DATABASE cDBName
                               
   CATCH oErr
     RETURN NIL
END
USE folios ALIAS "folios" SHARED NEW
text = "insert into mitabla (folio,  fecha, Med_Tra, Nom_pro) VALUES "
i = 0
TRY
    oServer:BeginTransaction()
    oServer:Execute("SET SESSION wait_timeout = 186400") // Pones una duracion de sesion larga
    oServer:Execute("TRUNCATE mitabla") // Esto unicamente si cada vez que la tenes que llenar, primero la tenes que vaciar
    do while !folios->(eof())
        text = text + " (" + clipvalue2sql(folios->folio) + ","+;
                             clipvalue2sql(folios->fecha) + "," +;
                             clipvalue2sql(folios->Cod_Pro) + "," +;
                             clipvalue2sql(folios->Nom_Pro) +;
                             +"),"
        folios->(dbskip())
        i++
        IF i > 10000
           i := 0
           text = LEFT(text,LEN(text) - 1)
           oServer:Execute(text)
           text = "insert into mitabla (folio,  fecha, Med_Tra, Nom_pro) VALUES "
        ENDIF      
    enddo
    IF i > 0
       text = LEFT(text,LEN(text) - 1)
       oServer:Execute(text)
    ENDIF
    oServer:CommitTransaction()
    oServer:Execute("SET SESSION wait_timeout = 28800") // Volves a poner corta
CATCH oErr
    MsgStop("Error MySql"+CHR(10)+oErr:description,"Error")
    RETURN NIL 
END TRY    
 

Espero te sirva

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Thu Jan 28, 2021 3:55 pm
by remtec
Hola Cesar.

Muchas gracias por tu ayuda, siempre presente cuando requiero de ella, te lo agradezco de corazón.

Realizare las pruebas este fin de semana.

Muchas gracias y que estés muy bien.

Saludos

Antonio

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Thu Jan 28, 2021 4:50 pm
by Armando
Antonio:

Como te puedes dar cuenta, las DBF y Tablas pueden convivir perfectamente.

Saludos

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Thu Jan 28, 2021 5:06 pm
by remtec
Hola Armando como estas.

Si, ayer me contacto un cliente que por lo menos tenia 25 años sin saber de el, en aquellos años le desarrolle un Sistema pero Clipper 5.2 DOS, ni pensar en ambiente windows, para mi sorpresa, aun lo usan y con un almacenamiento de 1.000.000 de registros. Es una grata sorpresa, pero un gerente necesita poder trabajar esa información externamente y por eso la consulta.

Muchos Saludos.

Antonio

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Thu Jan 28, 2021 5:21 pm
by Armando
Antonio:

Otro comentario, para trabajar con tablas, ya sean MySQL, MariaDB o SQL,
no necesitas librerías externas, ojo, NO DIGO QUE SEAN MALAS o que no sirvan,
simplemente digo que no las necesitas, con ADO + las mejoras a muchos
comandos que Mr. Rao ha hecho (Estupendo trabajo) tienes suficiente.

Lo único que debes cambiar es tu chip para no querer trabajar tablas al
estilo de las DBFs.

Saludos

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Thu Jan 28, 2021 10:21 pm
by remtec
Armando:

Muy agradecido por ayuda, entiendo todo lo que me has comentado y mucho mas con la información que me enviaste.

En este caso particular, no son mas de 8 campos de una Dbf que contiene varios mas, que incluso revisando entre mis cosas, ni siquiera tengo los PRG del sistema de clipper, que es una versión muy antigua, por lo que lo único que podría hacer es crear unas pocas líneas de código en FWH con un parámetro de fecha para seleccionar y eso es todo, que lo ejecuten cuando lo necesiten, algo esta pasando en las gerencias que están reuniendo manipular datos en busca de información que les ayude a gestionar.

La verdad que me deja muy sorprendido que al dia de hoy, aun este en plena vigencia, un sistema desarrolla completamente en clipper y 16 bits.

Bueno amigo, creo que yo aun estoy muy lejos de la actualidad de uds, años luz, espero pronto como te comente dar el salto a MySQL, SQL, en un proyecto grade, solo deseo que sea luego.

Muchos Saludos.

Antonio

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Thu Jan 28, 2021 11:19 pm
by Armando
Antonio:

Sin pretender meterme en tus negocios, pienso que tu cliente está
en un riesgo alto, los PCs a 16 bits prácticamente están extintos
así que el día que, por necesidad, deban cambiar a PCs de 32 o 64
bits tu excelente sistema dejará de funcionar.

Saludos

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Fri Jan 29, 2021 1:18 am
by remtec
Armando

Totalmente de acuerdo en lo que opinas, por eso me sorprende que aun este operativo este sistema, no he visto hoy en que maquinas los están corriendo, solo se que hasta pc con Windows xp 32 bits, tendría que funcionar sin problemas. Pensar proponer una actualización, tendría que evaluarlo mucho, por mi parte ya no desarrollo ese tipo de temas, hoy desarrollo en el área de la Salud, ya hace muchos años. Esto es solo responder a pasar los datos a una Tabla que me la han solicitado así.

Muchos Saludos

Antonio

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Mon Feb 01, 2021 4:38 am
by nageswaragunupudi
remtec wrote:Hola Amigos, muy buen día.

Tengo una solicitud de pasar periódicamente una DBF de 1.100.000 registros, a una tabla MySQL, donde realizaran algunas estadísticas externas.

Necesito como pasar esta DBF, con la complicación que existe una campo en la DBF que en la Tabla MySQL cambia de nombre, pero debe tener el mismo dato.

Estructura DBF.
Folio N 10
Fecha D
Cod_Pro C 5 ** Este Campo Cambia de Nombre en tabla MySQL
Nom_Pro C 40
...
...
...

Tabla Tabla MySQL
Folio N
Fecha D
Med_Tra ** Este Campo debe contener el mismo dato de Cod_Pro.
Nom_Pro


Existe alguna forma de realiza este proceso desde FWH 17.09, con algun codigo Prg. y generar una ejecutar un exe cuando se requiera.

Muchos Saludos

Antonio


It is very easy using built-in MySql library of FWH 17.09, using this function without writing any code.

Code: Select all  Expand view

USE MYDBF
oCn:UploadFromAlias( "mysqltable", "FOLIO,DATA,CODE_PRO,NOM_PRO", "folio,date,med_tra,nom_pro" )
 


Not only different field names, we can also use expressions in the dbf field list.

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Mon Feb 01, 2021 4:51 am
by nageswaragunupudi
This is a small exmaple.
You can copy to fwh\samples folder, build with buildh or buildx and test.
Please provide your mysql server credentials, password, etc.
Code: Select all  Expand view

#include "fivewin.ch"

function TestUploadFromAlias()

   local oCn, oRs, nBatchSize := 500

   FWCONNECT oCn HOST "localhost" USER "root" PASSWORD "yourpassword" DATABASE "yourdb"
   ? "connected"

   oCn:DropTable( "dbf2sql" )
   oCn:CreateTable( "dbf2sql", { { "custname", "C", 30, 0 }, { "address", "C", 30, 0 } } )
   ? "table created"
   USE CUSTOMER NEW
   ? "start upload"
   oCn:UploadFromAlias( "dbf2sql", "TRIM(FIRST-','-LAST),STREET", "custname,address", nBatchSize )
   ? "uploaded"

   oRs   := oCn:dbf2sql
   XBROWSER oRs
   oRs:Close()
   oCn:Close()

return nil
 


Image

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Tue Feb 02, 2021 4:32 pm
by remtec
Mr. Rao.

Muy buen dia.

Deseando que te encuentres muy bien.

Como siempre mil gracias por tu ayuda y tiempo dedicado, estos nos ayuda a crecer.

Ya he probado y funciona muy bien, ahora a preparar el programa para hacer las ultimas pruebas y entregar.

Muchas gracias.

Antonio.

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Tue Feb 02, 2021 11:44 pm
by TecniSoftware
Mr Rao

Es posible utilizar un Meter en este ejemplo para visualizar el progreso?

Muchas gracias


nageswaragunupudi wrote:This is a small exmaple.
You can copy to fwh\samples folder, build with buildh or buildx and test.
Please provide your mysql server credentials, password, etc.
Code: Select all  Expand view

#include "fivewin.ch"

function TestUploadFromAlias()

   local oCn, oRs, nBatchSize := 500

   FWCONNECT oCn HOST "localhost" USER "root" PASSWORD "yourpassword" DATABASE "yourdb"
   ? "connected"

   oCn:DropTable( "dbf2sql" )
   oCn:CreateTable( "dbf2sql", { { "custname", "C", 30, 0 }, { "address", "C", 30, 0 } } )
   ? "table created"
   USE CUSTOMER NEW
   ? "start upload"
   oCn:UploadFromAlias( "dbf2sql", "TRIM(FIRST-','-LAST),STREET", "custname,address", nBatchSize )
   ? "uploaded"

   oRs   := oCn:dbf2sql
   XBROWSER oRs
   oRs:Close()
   oCn:Close()

return nil
 


Image

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Wed Feb 03, 2021 4:20 am
by nageswaragunupudi
1. Setup your meter
2. oCn:bMeter := { |nProgress,nTotal| <your_meter_update_function>( nProgress,nTotal ) }
3. oCn:UploadFromAlias(...)
4. oCn:bMeter := nil

But we advise you not to display meter, except for very huge tables, because the display of meter reduces the speed a lot.

Re: Consulta Sobre Pasar Dbf a Mysql

PostPosted: Wed Feb 03, 2021 12:52 pm
by TecniSoftware
nageswaragunupudi wrote:1. Setup your meter
2. oCn:bMeter := { |nProgress,nTotal| <your_meter_update_function>( nProgress,nTotal ) }
3. oCn:UploadFromAlias(...)
4. oCn:bMeter := nil

But we advise you not to display meter, except for very huge tables, because the display of meter reduces the speed a lot.


Thank you!
Geetings