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