lunes, 17 de febrero de 2014

¿Cómo cargar un Dynamic Combo/List Box a partir de los datos de un Web Service ?

En algunos casos se ha presentado la necesidad de cargar un  Combo o List Box con los datos que retorna un servicio externo (Web Service Soap o Rest).

En la versión X Evolution 2 de GX, los Dynamic Combo Box y List Box incluyen una nueva propiedad llamada Data Source From. En el link pueden tener más información, pero básicamente dicha propiedad permite que un Combo/List Box pueda ser cargado dinámicamente, ya no solo a partir de una determinada "tabla", sino desde un Data Provider.

Entonces ahora el problema se traduce en la siguiente pregunta: 

¿Cómo lograr que un Data Provider retorne los datos de un Web Service?

La respuesta está en la cláusula Input del Data Provider. 

Con dicha cláusula podemos cargar un Data Provider a patir de los datos de otra fuente, que puede ser otro Data Provider, un Procedure o directamente un Web Service.

Veamos con un ejemplo como podríamos cargar esos datos a partir de un Web Service.

Ejemplo
Supongamos que tenemos un servicio SOAP que retorna una lista de Paises. Una vez importado en nuestra KB via WSDL Inspector tendremos básicamente estos objetos:

  • Un External Object, llamésmosle CountryService, con el método GetCountries.
  • Un SDT llamado CountryServiceResponse, con los elementos CountryId y CountrName.
    El método CountryService retorna una colección de este tipo:

Para definir el Data Provider que retorna esa lista de países, realizamos estos pasos: 
  1. Creamos un nuevo Data Provider (DPCountries)
  2. Arrastramos el SDT definido por el WS al Source del Data Provider. Es decir, podemos aprovechar ese mismo SDT para la salida de nuestro Data Provider, pero podría ser un nuevo SDT.
  3. Agregamos el Input Clause, para invocar el webservice y cargar los paises. 
  4. Cambiamos la propiedad Collection del Data Provider a True (esto depende de la estructura del SDT, si e mismo ya es una colección, esto no será necesario).

Donde: 
&ws es de tipo CountryService
&Country es de tipo CountryServiceResponse

Finalmente vamos al panel donde tenemos la variable de tipo Dynamic Combo/List Box y le asociamos el Data Provider anterior en la propiedad 'Data Source From'.


jueves, 6 de febrero de 2014

Google Translate desde las aplicaciones Genexus

El servicio de Google translate es gratis desde la página translate.google.com , pero para usarlo en tu aplicación debes integrarte a traves de su API, como detalla en https://developers.google.com/translate/v2/getting_started?hl=es
Esto significa que desde el Api V2 se integra a traves de servicios REST , pasando una Key y registrandose (dar una tarjeta de crédito). Luego desde una aplicación con Gx no seria difícil integrarte a través del servicio REST usando el tipo de datos HTTPCLIENT.
El código programado en Genexus , desde un procedimiento por ejemplo, seria algo como (**) o se pueden bajar el Xpz de ejemplo
Solo faltaria, para que funcione
    1. Obtener la Key se puede ver
en http://stackoverflow.com/questions/4854388/google-api-key-for-translation o hay un video de yotube http://www.youtube.com/watch?v=-KHq094SeWU que si bien no esta actualizado , esta bien claro 
    2. Hay que aceptar las condiciones del pricing que se detalla en https://developers.google.com/translate/v2/pricing
Anteriormente , con el API v1 existia un External Object, para realizar la integración http://wiki.gxtechnical.com/commwiki/servlet/hwiki?External+Object%3A+Google+Translator, pero ahora esta deprecated.
(**)
//https://www.googleapis.com/language/translate/v2?
//key=[Insert your key]
//&source=en
//&target=es
//&q=Hello%20world
//&trace=token:ACwti_c...

&lang_or = 'en'
&lang_dest = 'es'
&texto = 'Hello%20world'

&httpclient.Host = 'www.googleapis.com'
&httpclient.BaseUrl = '/language/translate/'
&query = 'key=' + &key.Trim()
&query = &query + '&source=' + &lang_or + '&target=' + &lang_dest
&query = &query + '&q=' + &texto
&query = &query + '&trace=token:ACwti_c...'

&http client.Execute('GET',&query)

&result = &httpclient.ToString()
msg(&result,status)

miércoles, 22 de enero de 2014

¿Cómo enviar mensajes de Whatsapp a través de una aplicación SD GeneXus?

Hoy en día, gracias a la masificación de los dispositivos inteligentes (Smart Devices) y a la adaptación de los usuarios al uso de estas nuevas tecnologías, se han creado muchísimas aplicaciones y servicios nuevos que, en ciertos casos, ofician de productos sustitutos de tecnologías y servicios de uso común como ser redes sociales, mensajería y llamadas. Tal es el caso de Whatsapp, que en los últimos años ha ganado campo en el terreno de la mensajería con un crecimiento de más de 200% en 2013.

Fuente: http://www.emol.com/noticias/tecnologia/2014/01/15/639815/uso-de-aplicaciones-moviles-aumento-un-115-durante-el-ano-pasado.html



Debido a estos cambios de tecnología y a la aparición de estos productos sustitutos, es necesario que nuestras aplicaciones desarrolladas en GeneXus puedan interactuar con las aplicaciones de vanguardia. En este caso explicaremos brevemente cómo interactuar con Whatsapp desde una aplicación GeneXus.

Veamos cómo se hace...
Es posible enviar mensajes de Whatsapp desde una aplicación SD (Smart Device) desarrollada en GeneXus utilizando Custom URL Schemes.
Esto significa, utilizar la API Interop para hacer una llamada a una URL específica. Si la aplicación llamada está instalada en el dispositivo, se abrirá y permitirá realizar acciones.

¿Cómo se programa?
En un evento de un objeto SD programar lo siguiente:

Interop.Open("whatsapp://app") --> Esto permite abrir la aplicación Whatsapp para interactuar.

Interop.Open("whatsapp://send?text=hola!!!") --> Esto permite enviar el mensaje "hola" a través de Whatsapp. Es necesario seleccionar el contacto al que se desea enviar el mensaje luego que se hace el redirect a la aplicación.

De esta forma logramos tener dos tipos de interacciones con Whatsapp en una simple línea de código.

Más info:
http://www.whatsapp.com/faq/en/iphone/23559013
Interop.Open method