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.

  1. 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.
  2. Todas las colecciones ONLINE cargan los datos con LOADALL, NO se pueden recorrer los datos con STARTBROWSE.

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>

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)



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

Si se van a llamar a distintos Web Services desde el proxy, tenemos que poner endpoint(Loquesea), siendo el valor entre paréntesis el valor del atributo “endpoint=Loquesea;” especificado en la llamada del mappings.xml para llamar a un Web Service u otro.

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.



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>