Colecciones OnLine
La plataforma XOne, por regla general, opera con una Base de Datos local en el dispositivo, de forma que aunque no haya conexión de datos, podamos trabajar en todo momento con la aplicación.
Ello no implica que siempre tenga que trabajarse “OFF-LINE”, es la forma más cómoda y rápida para trabajar con un dispositivo, pero la tecnología también nos permite crear colecciones “ON-LINE” para recuperar determinados datos o incluso crear la aplicación completa “ON-LINE” si fuese necesario.
- El nombre de los nodos connection debe ser único para todo el mappings.xml, aunque estén en distintas colecciones. Si bien pueden definirse en cualquier colección, para tener todas las conexiones localizadas, mejor definirlos en el nodo app al inicio del mappings.
- Todas las colecciones ONLINE cargan los datos con LOADALL, NO se pueden recorrer los datos con STARTBROWSE.
Comprobar Conectividad
Antes de lanzar una Coleccion ONLINE tenemos que asegurarnos de tener conexión a internet, y para ello podemos hacer uso de esta función y colección para hacer la comprobación:
//FUNCION PARA COMPROBAR SI TIENE CONEXION CON ALGUNA DIRECCION function comprobarConexionJS() { var conexion=0; $http.get( "https://www.google.es/", function() { conexion=1 //self.setFieldPropertyValue("MAP_CONNECTION", "text-forecolor-disabled", "#509c16"); //self.MAP_CONNECTION="** DISPOSITIVO CON CONEXION **"; //ui.refresh("MAP_CONNECTION"); }, function(){ //No hay conexión //self.setFieldPropertyValue("MAP_CONNECTION", "text-forecolor-disabled", "#CC3333"); //self.MAP_CONNECTION="!!! DISPOSITIVO SIN CONEXION !!!"; //ui.refresh("MAP_CONNECTION"); }); return conexion; }
Comprobar Conexión con Proxy JSON
//FUNCION PARA COMPROBAR SI TIENE CONEXION CON UN PROXY JSON function ComprobarConexion() { var conexion=0; try{ //appdata.Error.Clear //on error resume next var coll=appData.getCollection("ContentComprobarConexion"); coll.startBrowse(); //appdata.Error.Clear if (coll.getCurrentItem()!==null) { //Si nos ha devuelto algún registro quiere decir que tenemos conexión. //if (coll.getCurrentItem().RESULTADO==="##OK##") { conexion=1; //} } coll.endBrowse(); coll.clear(); coll=null; return conexion; }catch(err){ return conexion; } }
<coll name="ContentComprobarConexion" title="XoneCollvacia" sql="select ##COMPROBAR_CONEXION## from gen_empresa" connection="json_comprobar" objname="ComprobarConexion" updateobj="ComprobarConexion" progid="ASData.CASBasicDataObj"> <connection name="json_comprobar" connstring="Provider=Xone Remote Provider;Data Source=http://xoneisp.com/XOneJSONAllbyXOne/default.aspx;ProgID=com.xone.db.json.JSONConnection;Timeout=5;Security Level=0" /> <group name="General" id="1"> <prop name="RESULTADO" type="T" visible="0" /> </group> </coll>
Opciones Online
En la plataforma XOne, tenemos varias formas de conectarnos para obtener datos remotos:
Nombre Conexión Online | Servidor de Conexión | Conexión a ERP Cliente | Plataformas |
---|---|---|---|
JSONBD | Proxy intermedio que devuelve JSON | Conexión a BD | Android, IOS, W8 (En desarrollo) |
JSONWS | Proxy intermedio que devuelve JSON | Conexión a Web Service | Android, IOS, W8 (En desarrollo) |
xoneonline | Proxy intermedio que devuelve XML | Conexión a BD | Android, IOS, Windows Mobile, blackberry |
xonedirect | Directo a Web Services del Cliente | Web Services del Cliente | Android, IOS (En desarrollo) |
NODO connection en mappings
En las colecciones ONLINE, tenemos que tener un nodo connection con la cadena de conexión al Proxy intermedio, o Web Service del que obtendremos los datos.
Parámetros Connection | Descripción |
---|---|
name | Debe ser único en TODO el mappings. |
connstring | Llamada al Proxy o Web Service al que nos vamos a conectar, pasándole diferentes parámetros: -Provider :Xone Remote Provider. Este valor debe ser siempre así ya que es de sistema. -Data Source:Nombre del web service al que llamamos. -namespace: Nombre que se obtiene del WSDL del atributo targetNamespace. -progid:Nombre del progID utilizado por la maquinaria, los valores son: -1.com.xone.db.soa.SOAConnection: Utilizada para atacar directamente a los web service desde el frame. -2.com.xone.db.json.JSONConnection:Utilizada para conectarse a los web service a traves de proxy JSON. -3.CGSProxy.CProxy :Utilizada para conectarse con proxy genérico que devuelve XML, a los web services. |
Timeout | Tiempo de espera de una respuesta antes de que de error. (En segundos) |
Security Level | Tipo de seguridad (Numérico). Dependiente del proxy utilizado. |
method | El método de obtener los datos del Proxy, GET o POST. |
Proxy JSONBD
Proxy que atacará la Base de Datos del Cliente y devolverá los resultados en forma JSON al framework XOne. (Más rápido que el antiguo método de colecciones ONLINE que devolvía XML).
Se puede obtener la última versión del Proxy descargándola de la web xonesupport.
Web.Config de JSONBD
Dentro del fichero Web.Config del proxy, nos encontramos con el nodo appSettings:
<appSettings> <add key="debug" value="true"/> <add key="Connection String" value="Provider=System.Data.SqlClient;Data Source=AQUI LA CADENA DE CONEXION A LA BASE DE DATOS;"/> <add key="Security Level" value="0"/> <add key="Database Operations Allowed" value="select,insert,delete,update"/> </appSettings>
Parámetros del nodo appSettings | Valores |
---|---|
debug | true - false Se deja log en el visor de sucesos. |
Connection String | Cadena de Conexión a la Base de Datos |
Security Level | 0 - 1 - 2 - 3 0.- Sin seguridad. La llamada se procesa tal cual. 1.- Seguridad con http header authentication. Se envía el usuario y la contraseña para comparar en local. 2.- Por mantenimiento de sesión. Se necesita un token de sesión que envía el servidor cuando se autentica. 3.- Por certificado. (En Desarrollo). |
Database Operations Allowed | select - insert - delete - update Operaciones permitidas a la hora de trabajar contra la Base de Datos. |
Ejemplo de tipo JSONBD
<!-- ########################## LLAMADA ONLINE ENTRE FRAMEWORK___PROXY JSON_BASE DE DATOS ############################# --> <coll name="MapaReservas" fontsize="8" title="MapaReservas" objname="MapaReservas" updateobj="MapaReservas" progid="ASData.CASBasicDataObj" sql="SELECT t1.ID,t1.CODEDIFICIO,t1.CODPLANTA,t1.CODSALA,t1.DATE_START,t1.CAPACIDAD,t1.MATRIZ FROM gen_MapaReservas t1" filter="" sort="DATE_START limit 50" connection="mapa" userawsql="true"> <!-- Aqui lo dividimos en 2 líneas para que se vea mejor el ejemplo, DEJAR EN UNA SOLA LINEA. --> <connection name="mapa" connstring="Provider=Xone Remote Provider;Data Source=http://xone.es/XoneJSONReservaSalas/Default.aspx; ProgID=com.xone.db.json.JSONConnection;Timeout=60;Security Level=0" /> <group name="General" id="1" /> <prop name="CODEDIFICIO" type="T" visible="0" group="1" /> <prop name="CODPLANTA" type="T" visible="0" group="1" /> <prop name="CODSALA" type="T" visible="0" group="1" /> <prop name="DATE_START" title="F.Inicio" type="D" visible="1" group="1" /> <prop name="CAPACIDAD" title="Capacidad" type="N" visible="1" group="1" /> <prop name="MATRIZ" title="Matriz" type="T" visible="1" group="1" /> </coll>
Parámetro del mappings | Observaciones |
---|---|
sql | Igual que siempre, como si fuese OFFLINE, la diferencia es que la SQL se ejecuta en una BD remota. |
filter y sort | Como siempre, el WHERE y el ORDER BY de la sentencia SQL |
connection | Valor del atributo name del nodo connection definido más abajo . |
userawsql | Para que el framework no intente parsear la SQL y la ponga en forma de subconsulta, que la deje tal cual está en el atributo SQL. |
loadall | Poner a “true”. Todas las colecciones ONLINE cargan los datos con LOADALL, no se pueden recorrer los datos con STARTBROWSE. |
Proxy JSONWS
Proxy que atacará los Web Services del Cliente y devolverá los resultados en forma JSON al framework XOne. (Más rápido que el antiguo método de colecciones ONLINE que devolvía XML).
Se puede obtener la última versión del Proxy descargándola de la web xonesupport.
Ejemplo de tipo JSONWS
<!-- ########################### LLAMADA ONLINE ENTRE FRAMEWORK___PROXY JSON_WEBSERVICE ############################## Coleccion online para llamar al Web Service a partir del Proxy. En Android: se le puede indicar el endpoint, ya que se puede tener un único proxy llamando a varios WebService. Lo que hace la llamada es en el SQL se le pone a que opción del web service se llama, que en el ejemplo es CheckLic2 y en el filter se pasan los parametros que pueda permitir el webservice. --> <coll name="CheckLic2" title="CheckLic" objname="CheckLic" updateobj="CheckLic" progid="ASData.CASBasicDataObj" sql="SELECT * FROM CheckLic" filter="stPIN=355136053971720" sort="" connection="CheckLic2" loadall="true"> <connection name="CheckLic2" connstring="Provider=Xone Remote Provider;Data Source=http://xoneisp.com/XoneJSONWebService/;endpoint=xoneisp.com;ProgID=com.xone.db.json.JSONConnection;Timeout=60;Security Level=0" /> <group name="General" id="1" /> <prop name="Result" type="T" visible="7" group="1" /> </coll>
Web.Config de JSONWS
Dentro del fichero Web.Config del proxy, nos encontramos con los nodos appSettings y client:
<appSettings> <add key="debug" value="true"/> <!-- Direccion del WSDL del Web Service al que nos tenemos que conectar si solamente tiramos contra un web service --> <add key="EndPoint" value="http://www.cgsoft.net/geoipservice.asmx?WSDL"/> <add key="Class" value="GeoIPServiceSoapClient"/> <!-- --> <!-- Direcciones WSDL de los Web Services a los que queramos conectar en caso de que tiremos contra varios web services, desde un mismo proxy --> <add key="EndPoint(xoneisp.com)" value="http://xoneisp.com/Xonelive/xonelivews.asmx?wsdl"/> <add key="Class(xoneisp.com)" value="ServiceSoapClient"/> <add key="EndPoint(xone.es)" value="Http://xone.es/services/listadatos.asmx?WSDL"/> <add key="Class(xone.es)" value="listadatosSoapClient"/> <!-- --> <add key="Security Level" value="0"/> </appSettings> ..... ..... ..... <client> <endpoint address="http://www.cgsoft.net/geoipservice.asmx" binding="basicHttpBinding" bindingConfiguration="httpbinding" contract="GeoIPServiceSoap" name="GeoIPServiceSoap" /> <endpoint address="http://xoneisp.com/Xonelive/xonelivews.asmx" binding="basicHttpBinding" bindingConfiguration="httpbinding" contract="ServiceSoap" name="ServiceSoap" /> <endpoint address="http://xone.es/services/listadodatos.asmx" binding="basicHttpBinding" bindingConfiguration="httpbinding" contract="listadatosSoap" name="listadatosSoap" /> </client>
Parámetros del nodo appSettings | Valores |
---|---|
debug | true - false Se deja log en el visor de sucesos. |
endpoint |
Direccion del WSDL del Web Service al que nos tenemos que conectar. P.Ej: http://www.cgsoft.net/geoipservice.asmx?WSDL
Ejemplo de llamada a web service en mappings.xml: <connection name="CheckLic2" connstring="Provider=Xone Remote Provider;Data Source=http://xoneisp.com/XoneJSONWebService/;endpoint=xoneisp.com; ProgID=com.xone.db.json.JSONConnection;Timeout=60;Security Level=0" /> |
Class | Es la clase del WSDL. La misma se obtiene al final del WSDL, en el apartado wsdl:service name=“Service” (Normalmente hay 2 en el WSDL, cogemos el primero de ellos) y se le añade “Client” al final, por ejemplo, para <wsdl:port name=“servicesoap”… > el Class sería “servicesoapclient” |
Security Level | 0 - 1 0.- Sin seguridad. La llamada se procesa tal cual. 1.- Seguridad con http header authentication. Se envía el usuario y la contraseña para comparar en local. La Seguridad por cabecera debe de tenerlo implementado el web service que sea. |
Parámetros del nodo client | Valores |
address | La dirección del web service. (SIN el ?wsdl al final de la dirección) |
contract | El contrato del wsdl que está al final del mismo, dentro del apartado wsdl:service name=“Service” |
name | Se le indica el mismo que el contract. |
XOneOnline
Antigua forma de realizar las conexiones ONLINE, que devolvía los datos en formato XML.
Ejemplo de código XOneOnline
<coll name="VisitasOnline" title="VisitasOnline" fontsize="8" progid="ASData.CASBasicDataObj" objname="" updateobj="" sql="SELECT t1.* FROM ##PREF##kk t1" connection="proyecto_online1" cache="false" loadall="true" useextdata="true" stringkey="true" idfieldname="SECUENCIA" check-owner="false" > <connection name="proyecto_online1" connstring="Provider=CGSoft Remote Provider;Data Source=http://123.123.123.123/Proxy/Default.aspx?;ProgID=CGSProxy.CProxy;appname=CGMobile;Timeout=60;network=0"/> <group name="General" id="1"/> <prop name="ID" visible="7" group="1" type="N" fieldsize="10"></prop> <prop name="SECUENCIA" visible="7" group="1" type="N" fieldsize="10"></prop> <prop name="STATUS" visible="7" group="1" type="N" fieldsize="10"></prop> <prop name="ERRDESC" visible="7" group="1" type="T" fieldsize="40"></prop> </coll>
- El SQL de la colección: “SELECT t1.* FROM ##PREF##kk t1” NO SIRVE para nada, y tanto objname como updateobj están vacíos, puesto que NO vamos a tratar con una base de datos local.
- A nivel del nodo COLL, tenemos un parámetro connection=“proyecto_online1“ que es el que especifica que la colección, es una colección ONLINE.
- Posteriormente, tenemos el nodo <connection name=”proyecto_online1” …>, que será donde se define realmente la conexión con el webservice contra el que va a funcionar la colección. MUY IMPORTANTE, el valor de este atributo debe ser unico para todo el mappings.
La respuesta del webservice debe ser algo como esto:
<xml> <R> <F N="SECUENCIA" T="T" V="9482e7e4-fee3-4a7a-8e1f-6e5b0e294b54" /> <F N="STATUS" T="N" V="0" /> <F N="ERRDESC" T="T" V="Parametros incompletos" /> </R> </xml>