FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Modulo sencillo que traspasa un dbf a Mysql
Posts: 120
Joined: Wed Mar 11, 2009 07:32 PM
Modulo sencillo que traspasa un dbf a Mysql
Posted: Fri Jul 13, 2012 08:28 PM
Hola buen dia ,, este modulo me sirvio para traspasar los archivos dbf a mysql ( con la libreria tymsql xharbour )

aqui pueden bajar el codigo completo
http://www.eleben.com.mx/prueba.zip

saludos


partes del codigo aqui se conecta
Code (fw): Select all Collapse
Function xconecta(Xruta, Xusuario, Xcontra, Xpuerto)
local Oserver
local oBrw, Obrw2
local oDlg2, oBtn
local aBases:={}, aTablas:={}
local i
聽 聽oServer:= TMYSQLSERVER():new( alltrim(xruta), alltrim(xusuario), alltrim(xcontra), xpuerto)
聽 聽IF oserver:lError
聽 聽 聽 MSGALERT( "Hubo error al conectarse, verifique si hay conexion al servidor o usuario/clave incorecta we...")
聽 聽 聽 Return Nil
聽 聽Endif

聽 
聽 聽
聽 聽 聽 
聽 聽abases:=Oserver:ListDBs() 聽 聽 聽// Obtiene la lista de las bases de datos we
聽 聽if len(abases)>=1
聽 聽 聽 aTablas:=Metetablas(Oserver, aBases[1] ) 聽 
聽 聽Endif
聽 聽DEFINE DIALOG oDlg2 FROM 1, 1 TO 35, 120 TITLE "Bases de datos Disponibles "+str(len(abases),4) 
聽
聽 聽@ 1.5, 1 XBROWSE oBrw OF oDlg2 ARRAY aBases size 130,210 update;
聽 聽 聽 聽 聽 COLUMNS {1};
聽 聽 聽 聽 聽 HEADERS {"Base De Datos "};
聽 聽 聽 聽 聽 COLSIZES 200 LINES CELL;
聽 聽 聽 聽 聽 ON CHANGE (atablas:=Metetablas(Oserver, aBases[ oBrw:nArrayAt] ),oBrw2:aArrayData := aTablas, obrw2:refresh() )
聽 聽 聽 聽 聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽odlg2:oClient := oBrw 聽 聽 聽 聽 聽 
聽 聽
聽 聽@ 1.5, 20 XBROWSE oBrw2 OF oDlg2 ARRAY aTablas size 150,210 update;
聽 聽 聽 聽 聽 COLUMNS {1};
聽 聽 聽 聽 聽 HEADERS {"Tablas de La Base 聽Datos"};
聽 聽 聽 聽 聽 COLSIZES 250 LINES CELL;
聽 聽 聽 聽 聽 ON LEFT DBLCLICK VisorBase(Oserver, aTablas[ oBrw2:nArrayAt], aBases[ oBrw:nArrayAt] 聽) 
聽 聽 聽 聽 聽 聽
聽 聽oBrw2:CreateFromCode()
聽 聽odlg2:oClient := oBrw2 聽 聽 聽 聽 聽 
聽 聽

聽 聽 @ 120, 360 BTNBMP OBTN PROMPT "Tras 聽Dbf/Mysql" 聽 聽 聽2007 聽OF oDlg2 size 60,12 action (Diatras(Oserver, Abases[ oBrw:nArrayAt] ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 atablas:=Metetablas(Oserver, aBases[ oBrw:nArrayAt] ),oBrw2:aArrayData := aTablas, obrw2:refresh()) 聽
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 
聽 聽 @ 140, 360 BTNBMP OBTN PROMPT "a Excel" 聽 聽 聽2007 聽OF oDlg2 size 60,12 ACTION;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽MsgMeter( { |oMeter, oText, oDlg2, lEnd | ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Expexcel( oBrw2, oMeter, oText, oDlg2, @lEnd ) } )
聽 
聽 聽
聽 聽 @ 160, 360 BTNBMP OBTN PROMPT "Salir 聽" 聽 聽 聽2007 聽OF oDlg2 size 60,12 ACTION 聽odlg2:end() 
聽 聽
聽 聽
聽 聽
聽 聽
聽 聽ACTIVATE DIALOG ODLG2 CENTER聽
聽 聽
聽 聽
聽 聽
聽 聽
Return Nil



aqui graba el dbf a mysql
Code (fw): Select all Collapse
Function SaveSql(ocon, xoregi, xcalias, xcuantos, xbase, xmeter) 聽 // esta funcion traspasa la informacion del dbf a mysql 
LOCAL oqry, opalo, n, i, puro, VAN:=0
LOCAL J:=0, m1:=0, m2:=0, XCAMPO:="", tin:=0
LOCAL CINSERT:="", CCAMPOS:="", METE:=",", CVALOR:="", CDATO:="", cinser2, cval2
LOCAL CCTA1:=0, CCTA2:=0

聽 xbase:=alltrim(xbase)
聽 oqry:=ocon:Query( "SELECT * FROM "+xcalias ) 聽 聽 
聽 聽 聽IF oqry:lError
聽 聽 聽 ? "no se pudo abrir la base de datos 聽"+xcalias
聽 聽 聽 return .f.
聽 聽
聽 聽endif
聽
聽 聽opalo := __objclone( oQry ) 聽 // pasa los dato de oqry a apalo
聽 聽select (xcalias)
聽 
聽 聽xoregi:gotop()
聽 聽n:=0
聽 聽J:=0
聽 聽CINSERT:="INSERT INTO `"+xbase+"`.`"+alltrim(xcalias)+"` ("
聽 聽CCAMPOS:="" 聽// TOMARA LOS DATOS DE LOS CAMPOS OK
聽 聽VAN:=1
聽 聽METE:=","
聽 聽ccampos:=+"`"+"ele"+"`"+METE 聽 //CAMPO MAESTRO WE
聽 聽FOR I:=1 TO XCUANTOS
聽 聽 聽 聽IF VAN=XCUANTOS
聽 聽 聽 聽 聽 聽METE:=" " 聽/// PARA NO METER MA CAMPOS NO LE PONES LA COMA WE
聽 聽 聽 聽ENDIF 聽 聽
聽 聽 聽 聽CCAMPOS:=CCAMPOS+"`"+fieldname(i)+"`"+METE
聽 聽 聽 聽VAN:=VAN+1
聽 聽NEXT I
聽 聽CINSERT:=CINSERT+CCAMPOS+")"
聽 聽CVALOR:="VALUES ("
聽 聽VAN:=1
聽 聽METE:=","
聽 聽cinser2:=cinsert
聽 聽cval2:=cvalor
聽 聽tin:=1
聽 聽do while .not. eof()
聽 聽 聽 CDATO:=""
聽 聽 聽 mete:=","
聽 聽 聽 cinsert:=cinser2
聽 聽 聽 cvalor:=cval2
聽 聽 聽 van:=1
聽 聽 聽 cdato:=+"'"+alltrim(str(tin,10))+"'"+METE 聽 // este es el primer campo we el maestro consecutivo de los registros 
聽 聽 聽 For i:= 1 to xcuantos 聽//namda mas 10 registro para probar
聽 聽 聽 聽 聽IF i=XCUANTOS 聽 //1 por el campo clave 
聽 聽 聽 聽 聽 聽 METE:=" " 聽/// PARA NO METER MA CAMPOS NO LE PONES LA COMA WE
聽 聽 聽 聽 聽ENDIF 聽 聽
聽 聽 聽 聽 聽puro:=fieldname(i)
聽 聽 聽 聽 聽puro:=(xcalias)->&puro 聽 聽 // aqui esta tomando el valo del campo la & es una macro que pega el el valor y lo toma como instruccion
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽IF Xoregi:fieldtype(i)="C"
聽 聽 聽 聽 聽 聽 puro:=quicara(puro) 聽//quita los posibles " o ' que hayga de valores en los campo porque si no no se da de alta ok 
聽 聽 聽 聽 聽Endif
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽IF Xoregi:fieldtype(i)="M" 聽 聽// sepse
聽 聽 聽 聽 聽 聽 puro:=quicara(puro) 聽//quita los posibles " o ' que hayga de valores en los campo porque si no no se da de alta ok 
聽 聽 聽 聽 聽Endif
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽IF Xoregi:fieldtype(i)="L"
聽 聽 聽 聽 聽 聽 //QUIRE DECIR QUE EL CAMPOS ES LOGICO WE
聽 聽 聽 聽 聽 聽 PURO:=CAMTIPOL(PURO) // convierte el valor logico en f o t para el campo en sql 
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽IF Xoregi:fieldtype(i)="D"
聽 聽 聽 聽 聽 聽 //QUIRE DECIR QUE EL CAMPOS ES FECHA WE
聽 聽 聽 聽 聽 聽 PURO:=str(year(puro),4)+"-"+strzero(month(puro),2)+"-"+strzero(day(puro),2) 聽 聽// 聽"2008-12-12" // convierte el valor logico en f o t para el campo en sql 
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽IF Xoregi:fieldtype(i)="N"
聽 聽 聽 聽 聽 聽 //QUIRE DECIR QUE ES CAMPO NUMERICO AY QUE CHECAR LOS ENTEROS Y LOS DECIMALES
聽 聽 聽 聽 聽 聽 PURO:=ALLTRIM(STR(PURO)) // convierte el valor logico en f o t para el campo en sql 
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽CDATO:=CDATO+"'"+puro+"'"+METE
聽 聽 聽 聽
聽 聽 聽 聽 
聽 聽 聽 
聽 聽 聽 Next i 聽 /// pasa los datos del objecto de la clase database
聽 聽 聽 cvalor:=cvalor+cdato+")"
聽 聽 聽 cinsert:=cinsert+cvalor
聽 聽 聽
聽 聽 TRY 聽 聽
聽 聽 聽 聽oqry:=ocon:Query(cinsert) 聽 聽// regresa error si no se da de alta correctamente por x causas mayores
聽 聽 CATCH
聽 聽 聽 聽? "Error del sistemas// falla conexion checar 聽"+cinsert 聽 聽 // aqui se puede validar con do while en espera asta que aya conexicon o salirse
聽 聽 聽 聽return .f.
聽 聽 聽 聽
聽 聽 END
聽 聽 
聽 聽
聽 聽 聽 IF oqry:lError
聽 聽 聽 聽 聽 
聽 聽 聽 
聽 聽 聽 聽 聽 CCTA1:=CCTA1+1
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽if !msgyesno("error "+cinsert,"deseas continuar ") 聽// condicion que imprime el insert y pregunta si desea seguir 聽 聽
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// con esta impresion checamos posibles validaciones que hagan falta para agregarselas okidoki 聽
聽 聽 聽 聽 聽 聽 return .f.
聽 聽 聽 聽 聽endif
聽 聽 聽 else
聽 聽 聽 // 聽 ? "no hay error we"
聽 聽 聽 聽 聽CCTA2:=CCTA2+1
聽 聽 聽 聽 
聽 聽 聽 endif 聽 
聽 聽 聽 
聽 聽 聽SELECT (xcalias)
聽 聽 聽xoregi:skip()
聽 聽 聽xMeter:Set( tin)
聽 聽 聽SysRefresh()

聽 聽 聽van:=van+1
聽 聽 聽tin:=tin+1
聽 聽 聽 n:=n+1
聽 聽 聽
聽 聽Enddo 聽// hace todo el recorrido 
聽 聽
聽 聽
聽 聽 ? "Se dieron de alta "+alltrim(str(CCTA2))+" errores "+alltrim(str(ccta1))+" de "+alltrim(str(tin-1))+" registros traspasados"
聽 聽 
聽 聽
RETURN .t.

aqui crea la tabla segun la base de datos seleccionada
Code (fw): Select all Collapse
 Function Creatabla(osql, cdata, cuantos, oregi,obase, kprimary, ksegunda)
LOCAL CALIAS, cEstructura, entro:=.f., serbase
local cauxi, i, ctexto1, oquery, n

聽 聽
聽 聽cEstructura := "CREATE TABLE IF NOT EXISTS "+alltrim(alias())+" 聽( "
聽 聽
聽 聽CTEXTO1:="ele integer default 0," 聽 聽 聽 聽// es un campo clave para agregarselo y poder de dar de alta todos los registros 
聽 聽cEstructura:=cestructura + ctexto1
聽 聽for i:=1 to cuantos 聽// son los campos que tiene la base de datos calias 聽 la que se selecciono
聽 聽 聽 entro:=.f.
聽 聽 聽 
聽 聽 聽 
聽 聽 聽 
聽 聽 聽 if oregi:fieldtype(i)="C"
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽CTEXTO1:="varchar("+alltrim(str(obase[i][3]))+") default '.',"
聽 聽 聽 聽 聽entro:=.t.
聽 聽 聽 endif
聽 聽 聽
聽 聽 聽 if oregi:fieldtype(i)="D"
聽 聽 聽 聽 聽CTEXTO1:="date default '2008-12-12',"
聽 聽 聽 聽 聽entro:=.t.
聽 聽 聽 endif
聽 聽 聽
聽 聽 聽 if oregi:fieldtype(i)="N"
聽 聽 聽 聽 聽entro:=.t.
聽 聽 聽 聽 聽IF OBASE[I][4]>0 聽 //QUIERE DECIR QUE TIENE DECIMALES WE
聽 聽 聽 聽 聽 聽 CTEXTO1:="decimal("+alltrim(str(obase[i][3]))+","+alltrim(str(obase[i][4]))+") default 0, "
聽 聽 聽 聽 聽ELSE
聽 聽 聽 聽 聽 聽 CTEXTO1:="integer("+alltrim(str(obase[i][3]))+") default 0,"
聽 聽 聽 聽 聽endif
聽 聽 聽 endif
聽 聽 聽 
聽 聽 聽 if oregi:fieldtype(i)="L"
聽 聽 聽 聽 聽CTEXTO1:="varchar(1) default ' ',"
聽 聽 聽 聽 聽entro:=.t.
聽 聽 聽 endif
聽 聽 聽 
聽 聽 聽 if oregi:fieldtype(i)="M" 聽 // que longitud le puedo poner a esto ( porque con text marca error) 聽ay levariamos a nuestro gusto o ay un tipo de datos especial 
聽 聽 聽 聽 聽CTEXTO1:="varchar(500) default ' ',"
聽 聽 聽 聽 聽entro:=.t.
聽 聽 聽 endif
聽 聽 聽
聽 聽 聽 
聽 聽 聽
聽 聽 聽 if entro 聽 
聽 聽 聽 聽 聽ctexto1:=oregi:fieldname(i)+" "+ctexto1
聽 聽 聽 聽 聽cEstructura:=cestructura + ctexto1
聽 聽 聽 endif
聽 聽 聽
聽 聽next i 聽 // con esto son todos los campos de la base de datos 聽 
聽 聽//cEstructura += " ) "
聽 聽cEstructura += "PRIMARY KEY (ele) ) "
聽 // cEstructura += "KEY prodi ( nombre ) )" 聽 聽 聽 //ay que checar con willian que es prodi 聽 y si no hay key prodi como terminamos el primary key we
聽 聽cEstructura += " ENGINE=InnoDB DEFAULT CHARSET=latin1"
聽
聽 聽// Ejecuta query para creaci贸n de la tabla
聽 聽osql:Query( cEstructura )
聽 聽IF osql:lError
聽 聽 聽 聽MSGALERT( "Hubo error al seleccionar la base de datos, verifique...")
聽 聽 聽 osql:end()
聽 聽 聽 
聽 聽 聽 // si no hay error aqui podemos llamar el traspaso de la informacion o se hace depues lo weno que ya quedo generado la estructura al sql
聽 聽 聽 return .f.
聽 聽else

聽 聽
聽 聽ENDIF

聽 聽
Return .t. 聽 // dar de alta efectuado verdadero we



saludos


Benjamin Casarrubias Moreno
Cd. Obreg贸n, Sonora, M茅xico
chino72vale@hotmail.com
Fivewin 24.04, Harbour 3.3, xharbour 1.2.1, Fivelinux, Visual Estudio 2022
Oracle Api Rest, SDK Contpaq, Facturaci贸n Electr贸nica, XML DIOT 2025
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Modulo sencillo que traspasa un dbf a Mysql
Posted: Sat Jul 14, 2012 02:32 PM

Benji,

Excelente aporte.

Saludos

William, Morales

Saludos



m茅xico.sureste
Posts: 120
Joined: Wed Mar 11, 2009 07:32 PM
Re: Modulo sencillo que traspasa un dbf a Mysql
Posted: Sat Jul 14, 2012 05:08 PM
hola wilian,, wenas wenas tardes

le agregue que guarde la ultima configuracion ,, y ya trae las altas y bajas de las base de datos ,,,

en otra chancita le pongo altas a las tablas de las bases de datos ,, y cambios de la estructura directamente quedando completo este visor

saludos

aa y gracias por tu ayuda ,,, cualquier cosa ay te hecho un grito como siempre

http://www.eleben.com.mx/prueba.zip
Benjamin Casarrubias Moreno
Cd. Obreg贸n, Sonora, M茅xico
chino72vale@hotmail.com
Fivewin 24.04, Harbour 3.3, xharbour 1.2.1, Fivelinux, Visual Estudio 2022
Oracle Api Rest, SDK Contpaq, Facturaci贸n Electr贸nica, XML DIOT 2025
Posts: 120
Joined: Wed Mar 11, 2009 07:32 PM
Re: Modulo sencillo que traspasa un dbf a Mysql
Posted: Tue Jul 17, 2012 04:18 PM
ya esta en el modulo ,,,

altas a bases de datos y bajas mysql


altas a tablas de mysql ,, tiene los tipos que vi en una pagina para dar de alta en mysql falta validar los tama帽os minimo y maximo


faltaria cambios a la estructura de la tabla proximamente y ejecutar un query mostrando el resultado , quedando completo


saludos

http://www.eleben.com.mx/prueba.zip
Benjamin Casarrubias Moreno
Cd. Obreg贸n, Sonora, M茅xico
chino72vale@hotmail.com
Fivewin 24.04, Harbour 3.3, xharbour 1.2.1, Fivelinux, Visual Estudio 2022
Oracle Api Rest, SDK Contpaq, Facturaci贸n Electr贸nica, XML DIOT 2025
Posts: 120
Joined: Wed Mar 11, 2009 07:32 PM
Re: Modulo sencillo que traspasa un dbf a Mysql
Posted: Mon Jul 23, 2012 05:45 PM
hola buen dia

ya esta anexado tambien,,, creacion de indices ,,, y borrado de indices

siguiente paso ,,, agregar los cotejamientos a las base de datos

saludos



bajar modulo y fuentes

http://www.eleben.com.mx/prueba.zip
Benjamin Casarrubias Moreno
Cd. Obreg贸n, Sonora, M茅xico
chino72vale@hotmail.com
Fivewin 24.04, Harbour 3.3, xharbour 1.2.1, Fivelinux, Visual Estudio 2022
Oracle Api Rest, SDK Contpaq, Facturaci贸n Electr贸nica, XML DIOT 2025
Posts: 196
Joined: Tue Jul 01, 2008 06:34 PM
Re: Modulo sencillo que traspasa un dbf a Mysql
Posted: Thu Jul 26, 2012 12:29 AM

Exelente, pero falta el .DLL de donde lo bajo

Gracias

Luis Ponce
Posts: 120
Joined: Wed Mar 11, 2009 07:32 PM
Re: Modulo sencillo que traspasa un dbf a Mysql
Posted: Thu Jul 26, 2012 03:47 AM
hola, hola

esta en el siguiente enlace

http://www.eleben.com.mx/prueba.zip

no lo habia subido la dll , pero ya esta ay

le agregue un archivo .dbf que tiene los cotejamientos estoy en validaciones pero se puede poner manual en las altas de las tablas faltando los motores


saludos
Benjamin Casarrubias Moreno
Cd. Obreg贸n, Sonora, M茅xico
chino72vale@hotmail.com
Fivewin 24.04, Harbour 3.3, xharbour 1.2.1, Fivelinux, Visual Estudio 2022
Oracle Api Rest, SDK Contpaq, Facturaci贸n Electr贸nica, XML DIOT 2025
Posts: 196
Joined: Tue Jul 01, 2008 06:34 PM
Re: Modulo sencillo que traspasa un dbf a Mysql
Posted: Thu Jul 26, 2012 04:03 PM

Gracias we

Lo probare, espero ver la luz... ya es hora

Luis Ponce

Continue the discussion