Sincronizar con
WebServices es una manera de sincronizar datos que nos permite independizarnos de la base de datos centralizada ya que somos nosotros los que programamos el proceso de sincronización.
Además podemos definir nuestras propias reglas o filtros.
El proceso consiste en tener un
WebService o varios que se encarguen de recibir o mandar colecciones de datos, no importa en que lenguaje esté programado ese
WebService .
Desde el modelo .NET Mobile se consume ese
WebService y en el mismo se programa la lógica de la sincronización.
Veamos un Ejemplo
Se tiene una Base de conocimiento sobre una base de datos cualquiera con las siguientes estructuras:
La idea es modelar un sistema donde se ingresan incidentes y se asigna un usuario para atender ese incidente.
Supongamos ahora que nos piden implementar un sistema en .NET Mobile que permita a los Usuarios obtener la información de que incidentes tiene que atender en forma remota desde su pocket.
Un primer paso a tener en cuenta es definir la colección de datos que nos interesa enviar o recibir.
En este caso definimos un SDT Datos, colección con los atributos que necesitamos
Estos datos son los que vamos a enviar o a recibir.
Para cada una de estas funciones vamos a hacer un procedimiento que va a ser el webservice que luego consumiremos (para que un procedimiento sea un
WebService hay que definirlo como Main, con call protocol = SOAP)
El Procedimiento para entregar los datos lo vamos a implementar así:
for each
where UsuarioId = &UsuarioId
where IncidenteAtendido <> "Y"
&incidente = New Datos.Incidente()
&incidente.IncidenteId = IncidenteId
&incidente.IncidenteFecha = IncidenteFecha
&incidente.IncidenteDsc = IncidenteDsc
&datos.Add(&incidente)
endfor
Con un parm:
parm(&UsuarioId, &datos);
O sea, recibimos un usuario, cargamos en un SDT los incidentes no atendidos de ese usuario y se los entregamos en la colección.
El Procedimiento para recbir los datos lo vamos a implementar así:
&OK = 0
For &incidente in &datos
&OK =1
for each
where &incidente.IncidenteId = IncidenteId
IncidenteDsc = &incidente.IncidenteDsc
IncidenteAtendido = "Y"
endfor
endfor
Y el parm
parm(&UsuarioId, &datos, &OK);
En este caso recibimos un usuario y los datos modificados por el mismo, los procesamos leyendo la colección modificando los registros de la base centralizada y retornamos la cantidad de resgistros que procesamos.
Supongamos que creamos la base de conocimiento .NET Mobile con la siguiente estructura:
Vamos a importar los servicios por medio del WSDL Inspector teniendo presente usar la IP de la máquina con el
WebService en la URL del wsdl.
Luego el consumo de esos servicios lo hacemos de la siguiente forma.
Para el servicio de entrega de datos, vamos a implementar un procedimiento que haga lo siguiente:
&ws.Execute(&Usuario,&Datos)
for &incidente in &Datos
new
IncidenteId = &incidente.IncidenteId
IncidenteFecha = &incidente.IncidenteFecha
IncidenteDsc = &incidente.IncidenteDsc
IncidenteAtendido = "N"
endnew
endfor
msg(&Datos.Count.ToString() ' registros recibidos ')
En este caso pasamos el Usuario y recibimos los datos , con los cuales creamos registros en nuestra tabla.
Para el proceso que recibe los datos, vamos a implementarlo de la siguiente manera:
for each
where IncidenteAtendido = "Y"
&incidente = New Datos_Incidente()
&incidente.IncidenteId = IncidenteId
&incidente.IncidenteFecha = IncidenteFecha
&incidente.IncidenteDsc = IncidenteDsc
&datos.Add(&incidente)
endfor
&ws.Execute(&usuario,&Datos, &OK)
msg(&OK.ToString() 'registros enviados')
Cargamos en la colección los incidentes que fueron atendidos y los entregamos al servicio.
En caso de que el servicio no esté disponible se va a producir un error que cancelará la aplicación.
Si se quiere enmascarar ese error se debe programar de la siguiente forma.
&location = getlocation('Servicio_ServicioDownload')
&location.CancelOnError = 2
Donde &location es del tipo location y Servicio_ServicioDownload es el tipo de la variable webservice cambiando los puntos por guiones
Luego de ejecutar el Execute del
WebService se debe consultar el error:
GetSoapErr(), si es distinto de 0 no hay error.
Se pueden ver los errores con GetSoapErr() y GetSoapErrMsg()