In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Sincronizar tablas Maridb

SQL databases
Responder
Avatar de Usuario
gerencia
Mensajes: 259
Registrado: Sab Jun 20, 2009 6:01 pm

Sincronizar tablas Maridb

Mensaje por gerencia »

Hola a todos,

Alguien ha hecho algo de forma manual que permita sincronizar 2 tablas una local y otra en la nube de
Mariadb ?.

La idea es mantener actualizada una información en la nube de lo que ocurre con la tabla local, no se puede usar
la opción de configurar los servidores para que se hagan automáticas por lo que no disponemos de configurar el servidor de
Mariadb en la nube, por lo que deberá hacerse de forma manual .

Si alguno ha desarrollado algo me vendría bien un poco de ayuda.

Saludos a todos,
Jose David Angulo Urzola
Auditoria y Sistemas Ltda.
Cartagena-Colombia
Avatar de Usuario
bingen
Mensajes: 478
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Sincronizar tablas Maridb

Mensaje por bingen »

Buenas, nosotros lo hemos desarrollado a través de un Webdatasouce y mantenemos sincronizado el escritorio con la Web. Espero que este código te sirva de orientación, sino ponte en contacto conmigo.

//En caso de trabajar con un WebDataSource externo y existir en él una tabla con el mismo nombre
//replica los registros indicados en la Web por su Id

Function SynchronizeWebExt(cOrigen, cDestino, xId, lDelete, lTruncateBefore)

Local lControl:=.F., aCampos:={}, aDatos:={}, aCamposOrigen:={}, nCampo:=0, cValores:="", aValores :={}
Local lSuccess:=.T.

Default cDestino to cOrigen
Default lDelete To .F. //Si el procedimiento es de borrado en lugar de ser inserción/edición
Default lTruncateBefore To .F. //Antes de realizar la operaci´çon se vacia la totalidad de la tabla

cOrigen := SubStr(cOrigen,At(".",cOrigen)+1)
cDestino := SubStr(cDestino ,At(".",cDestino )+1)


//Si no se ha configurado el WebDataSource Externo esto no vale para nada
If Appdata:oWebDataSourceExt=Nil
Return .F.
Endif

//El xId tiene que venir con algo si no no hay que hacer nada
if Vacio(xId)
LogDebug("No se puede sincronizar un contenido de xId Vacio para "+cOrigen+" >>> "+cDestino+" en la BBDD "+Appdata:cWebDatabaseExt)
Return .F.
Endif

//Tiene que existir el origen en la BBDD de trabajo o en la de control
if Vacio(Appdata:oSqlSource:GetTables(cOrigen))
lControl:=.T.
if Vacio(Appdata:oControlDb:GetTables(cOrigen))
LogDebug("No se puede encontrar el archivo de origen "+cOrigen+" para la sincronización Web")
Return .F.
Endif
Endif

//Abrir la BBDD de la Web externa si no lo está
If !Appdata:oWebDataSourceExt:lConnected()
Appdata:oWebDataSourceExt:lConnected:=.T.
Endif

//Tiene que existir el destino en la BBDD de la Web externa
Appdata:oWebDataSourceExt:lConnected:=.T.
If Vacio(Appdata:oWebDataSourceExt:GetTables(cDestino))
Appdata:oWebDataSourceExt:lConnected:=.F.
LogDebug("No se puede encontrar el archivo de destino "+cDestino+" para la sincronización Web")
Return .F.
Endif


//Lista de campos del origen y del destino para ver que hay que sincronizar
aCamposOrigen:=IF(!lControl,Appdata:oSqlSource:QueryArray("describe "+cOrigen),Appdata:oControlDb:QueryArray("describe "+cOrigen))
aCampos:=Appdata:oWebDataSourceExt:QueryArray("describe "+cDestino)
For nCampo:=1 to Len(aCampos)
If AScan(aCamposOrigen,{|x| Lower(x[1])==Lower(aCampos[nCampo,1]) })=0
HB_ADel(aCampos,nCampo,.T.)
nCampo--
Endif
Next

//El Id siempre tiene que ser un array y monodimensional
If ValType(xId)<>"A"
xId:={xId}
Endif

//Añadir o actualizar registros en la web
Appdata:oWebDataSourceExt:BeginTrans()
If !lDelete
//Si se ha pedido lTruncateBefore vaciar la tabla antes de empezar
If lTruncateBefore
Appdata:oWebDataSourceExt:Execute("truncate "+cDestino)
Endif

If !lControl
aDatos:=Appdata:oSqlSource:QueryArray("select "+ArrayToChar(aCampos,",",1)+" from "+cOrigen+" where id in("+ArrayToChar(xId,",")+")" )
Else
aDatos:=Appdata:oControlDb:QueryArray("select "+ArrayToChar(aCampos,",",1)+" from "+cOrigen+" where id in("+ArrayToChar(xId,",")+")" )
Endif

Appdata:oWebDataSourceExt:BeginTrans()

For Each aValores in aDatos
cValores+=" ("+Concat(aValores,,.T.)+"), "
If Len(cValores)>60000
lSuccess := IF(!Appdata:oWebDataSourceExt:Execute("replace into "+cDestino+" ("+ArrayToChar(aCampos,",",1)+") Values "+HB_StrShrink(cValores,2)) .Or. !lSuccess, .F.,.T.)
cValores:=""
If Mod(aValores:__enumIndex,8)=0 //Para prevenir el tamaño máximo de la instrucción Http que se envia al servidor Apache via WebDataSource
Appdata:oWebDataSourceExt:CommitTrans()
Appdata:oWebDataSourceExt:BeginTrans()
Endif
Endif
If !lSuccess
Exit
Endif
Next
lSuccess := IF(!Appdata:oWebDataSourceExt:Execute("replace into "+cDestino+" ("+ArrayToChar(aCampos,",",1)+") Values "+HB_StrShrink(cValores,2)) .Or. !lSuccess, .F.,.T.)
Else //Eliminar registros en la web
lSuccess := Appdata:oWebDataSourceExt:Execute("delete from "+cDestino+" where id in("+ArrayToChar(xId,",")+")")
Endif

If !lSuccess
Appdata:oWebDataSourceExt:RollBackTrans()
Else
Appdata:oWebDataSourceExt:CommitTrans()
Endif

//Cerrar la BBDD de la Web externa
Appdata:oWebDataSourceExt:lConnected:=.F.

Return lSuccess
//------------------------------------------------------------------------------
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
ignacio
Site Admin
Mensajes: 8955
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Sincronizar tablas Maridb

Mensaje por ignacio »

Buenas noches,

Simplemente utilice los evento del dataset local para actualizar todo en remoto

Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
gerencia
Mensajes: 259
Registrado: Sab Jun 20, 2009 6:01 pm

Re: Sincronizar tablas Maridb

Mensaje por gerencia »

Bingen,
muchas gracias por tu aporte.

bingen escribió: Sab Ene 08, 2022 7:38 am Buenas, nosotros lo hemos desarrollado a través de un Webdatasouce y mantenemos sincronizado el escritorio con la Web. Espero que este código te sirva de orientación, sino ponte en contacto conmigo.

//En caso de trabajar con un WebDataSource externo y existir en él una tabla con el mismo nombre
//replica los registros indicados en la Web por su Id

Function SynchronizeWebExt(cOrigen, cDestino, xId, lDelete, lTruncateBefore)

Local lControl:=.F., aCampos:={}, aDatos:={}, aCamposOrigen:={}, nCampo:=0, cValores:="", aValores :={}
Local lSuccess:=.T.

Default cDestino to cOrigen
Default lDelete To .F. //Si el procedimiento es de borrado en lugar de ser inserción/edición
Default lTruncateBefore To .F. //Antes de realizar la operaci´çon se vacia la totalidad de la tabla

cOrigen := SubStr(cOrigen,At(".",cOrigen)+1)
cDestino := SubStr(cDestino ,At(".",cDestino )+1)


//Si no se ha configurado el WebDataSource Externo esto no vale para nada
If Appdata:oWebDataSourceExt=Nil
Return .F.
Endif

//El xId tiene que venir con algo si no no hay que hacer nada
if Vacio(xId)
LogDebug("No se puede sincronizar un contenido de xId Vacio para "+cOrigen+" >>> "+cDestino+" en la BBDD "+Appdata:cWebDatabaseExt)
Return .F.
Endif

//Tiene que existir el origen en la BBDD de trabajo o en la de control
if Vacio(Appdata:oSqlSource:GetTables(cOrigen))
lControl:=.T.
if Vacio(Appdata:oControlDb:GetTables(cOrigen))
LogDebug("No se puede encontrar el archivo de origen "+cOrigen+" para la sincronización Web")
Return .F.
Endif
Endif

//Abrir la BBDD de la Web externa si no lo está
If !Appdata:oWebDataSourceExt:lConnected()
Appdata:oWebDataSourceExt:lConnected:=.T.
Endif

//Tiene que existir el destino en la BBDD de la Web externa
Appdata:oWebDataSourceExt:lConnected:=.T.
If Vacio(Appdata:oWebDataSourceExt:GetTables(cDestino))
Appdata:oWebDataSourceExt:lConnected:=.F.
LogDebug("No se puede encontrar el archivo de destino "+cDestino+" para la sincronización Web")
Return .F.
Endif


//Lista de campos del origen y del destino para ver que hay que sincronizar
aCamposOrigen:=IF(!lControl,Appdata:oSqlSource:QueryArray("describe "+cOrigen),Appdata:oControlDb:QueryArray("describe "+cOrigen))
aCampos:=Appdata:oWebDataSourceExt:QueryArray("describe "+cDestino)
For nCampo:=1 to Len(aCampos)
If AScan(aCamposOrigen,{|x| Lower(x[1])==Lower(aCampos[nCampo,1]) })=0
HB_ADel(aCampos,nCampo,.T.)
nCampo--
Endif
Next

//El Id siempre tiene que ser un array y monodimensional
If ValType(xId)<>"A"
xId:={xId}
Endif

//Añadir o actualizar registros en la web
Appdata:oWebDataSourceExt:BeginTrans()
If !lDelete
//Si se ha pedido lTruncateBefore vaciar la tabla antes de empezar
If lTruncateBefore
Appdata:oWebDataSourceExt:Execute("truncate "+cDestino)
Endif

If !lControl
aDatos:=Appdata:oSqlSource:QueryArray("select "+ArrayToChar(aCampos,",",1)+" from "+cOrigen+" where id in("+ArrayToChar(xId,",")+")" )
Else
aDatos:=Appdata:oControlDb:QueryArray("select "+ArrayToChar(aCampos,",",1)+" from "+cOrigen+" where id in("+ArrayToChar(xId,",")+")" )
Endif

Appdata:oWebDataSourceExt:BeginTrans()

For Each aValores in aDatos
cValores+=" ("+Concat(aValores,,.T.)+"), "
If Len(cValores)>60000
lSuccess := IF(!Appdata:oWebDataSourceExt:Execute("replace into "+cDestino+" ("+ArrayToChar(aCampos,",",1)+") Values "+HB_StrShrink(cValores,2)) .Or. !lSuccess, .F.,.T.)
cValores:=""
If Mod(aValores:__enumIndex,8)=0 //Para prevenir el tamaño máximo de la instrucción Http que se envia al servidor Apache via WebDataSource
Appdata:oWebDataSourceExt:CommitTrans()
Appdata:oWebDataSourceExt:BeginTrans()
Endif
Endif
If !lSuccess
Exit
Endif
Next
lSuccess := IF(!Appdata:oWebDataSourceExt:Execute("replace into "+cDestino+" ("+ArrayToChar(aCampos,",",1)+") Values "+HB_StrShrink(cValores,2)) .Or. !lSuccess, .F.,.T.)
Else //Eliminar registros en la web
lSuccess := Appdata:oWebDataSourceExt:Execute("delete from "+cDestino+" where id in("+ArrayToChar(xId,",")+")")
Endif

If !lSuccess
Appdata:oWebDataSourceExt:RollBackTrans()
Else
Appdata:oWebDataSourceExt:CommitTrans()
Endif

//Cerrar la BBDD de la Web externa
Appdata:oWebDataSourceExt:lConnected:=.F.

Return lSuccess
//------------------------------------------------------------------------------
Jose David Angulo Urzola
Auditoria y Sistemas Ltda.
Cartagena-Colombia
Responder