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
aqui graba el dbf a mysql
aqui crea la tabla segun la base de datos seleccionada
saludos



aqui pueden bajar el codigo completo
http://www.eleben.com.mx/prueba.zip
saludos
partes del codigo aqui se conecta
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 Nilaqui graba el dbf a mysql
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
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 wesaludos



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