Showing posts with label Gateway. Show all posts
Showing posts with label Gateway. Show all posts

Tuesday, September 25, 2012

PowerBuilder y Gateway - Al estilo de Sinatra

El otro dia estaba jugando con la idea de consumir Gateway desde PowerBuilder...asi que por supuesto, intente muchas cosas como leerlo como un WebService o un servicio REST...ninguna funciono puesto que Gateway genera OData.


Hace unos dia lei un asombroso blog escrito por Mark Bradley llamado Gateway over PowerBuilder donde el estaba utilizando un OData Service DataWindow...el cual no encontre en mi IDE de PowerBuilder...Me contacte con Mark y me dijo que estaba usando una version "not released yet" de PowerBuilder, asi que mi nueva meta era conseguir una nueva forma de conectar PowerBuilder y Gateway usando lo que tenia a la mano...

Intente muchas cosas mas...incluyendo el WCF Data Services for OData que no funciono para nada...

Pero como parte de mi trabajo es romperme la cabeza tratando de hacer las cosas mas locas y excitantes...decidi optar por otro camino...

Recorde que ruby_odata es capaz de consumir Gateway, puesto que yo fui uno de los que participo en el proyecto Ruby, Camping and...Gateway? (Perdon...voy a corregir el codigo apenas pueda...post viejo)

Luego me entere de que Sinatra el WebFramework de Ruby con clase es capaz de exponer la data como un servicio REST (Necesitas instalar el gem de JSON)...asi que todas las piezas caian por su propio peso...

Escribi un pequenho script Ruby/Sinatra para leer de Gateway (Para este ejemplo, hice el servicio anonimo...para evitar escribir mucho)...por si acaso...lo llame Sinatra_JSON.rb


Luego de ejecutarlo, puedo revisarlo en mi broswer...


Con esto listo...me podia mover a PowerBuilder...crear una Solution --> Target (Especifica que quiere una ventana en el inico) --> y luego creamos un cliente RESTFUL.





Luego de eso, necesitamos generar el Proxy...


Y crear un Grid DataWindow...


Necesitamos definir las columnas que vamos a extraer y mostrar en nuestra ventana.


Creamos un DataWindow dentro de nuestra Window (w_window) y un boton. Hacemos drag & drop del Grid DataWindow en nuestro DataWindow.


Hacemos doble click en el boton y pegamos el siguiente codigo...


Vamos a la aplicacion y hacemos doble click, pegamos este codigo...


Estamos listos para ejecutar nuestro programa, y presionar el boton "Call Flights"...


Funciona! Asi que hagamos un recuento...leemos el servicio Gateway utilizando Ruby_OData y lo exponemos como un servicio REST utilizando Sinatra. En PowerBuilder creamos un cliente REST, y consumimos el servicio REST de Sinatra y lo mostramos en un Grid DataWindow...

Espero que les guste...hasta el momento...pienso que es la mejor manera de hacer trabajar a PowerBuilder y Gateway hasta que podamos poner nuestra manos en el ultimo release de PowerBuilder.
La unica desventaja, es que necesitamos pasar los parametros estaticamente en vez de pasarlos dinamicamente...bueno...quizas la proxima vez...

Saludos,

Blag.

Friday, April 20, 2012

Cuando R conoció a SAP Gateway


Algunos dias atras, estaba jugando con la idea de hacer algo con SAP Gateway...pensé en utilizar SUP, pero como ya escribí 2 blogs, decidí regresar a unos de mis lenguajes de programación favoritos...R...

Así que...Gateway puede ser consumido como ODATA y JSON (Si no estoy en un error) no esta soportado completamente, asi que mi unica opción era ODATA...pero R no soporta ODATA...así que estaba enfrentando un verdadero problema...

Estaba en un error -:P ODATA es un protocolo y JSON y XML son formatos...Gateway genera XML en este momento y JSON esta en camino...agradecimientos especiales a Wayne Brown (Solution Owner, SAP NetWeaver Gateway)

Afortunadamente, R es uno de esos de esos lenguages de programacion que viene a rescatarte cuando menos te lo esperas...buscando un poco me di cuenta de que R puede hacer Web Scrapping...lo cual significa que basicamente leo todo el XML generado por SAP Gateway, extraigo la informacion que necesito y gereno un grafico bonito para impresionar a la gente...Por cierto...estoy filtrando los datos para recibir solo los datos de 'AA', puesto que leer la lista de los 1,304 registros sería muy pesado para R, puesto que R no brilla realmente cuando se trata de performance...ademas, parsear un XML tan grande es un poco estresante para cualquiera...

Primero, creamos un servicio SAP Gateway basado en la BAPI BAPI_FLIGHT_GETLIST. Aqui esta el resultado en XML:

http://lscies1.sapdevcenter.com/sap/opu/sdata/sap/ZFLIGHT_MODEL/zflightCollection?$filter=airline_1 EQ 'QF'&sap-client=520&$format=xml


Luego, hacemos unas cuantas lineas de codigo en nuestro R Studio. Basicamente, busca todas la lineas que tengan la palabra "cityto" y elimina todo lo demas, para poder extraer unicamente el nombre de la ciudad. Luego, simplemente ordenamos los valores, los sumamos y generamos el gráfico.

library("plotrix")
 
web_page <- readLines("http://lscies1.sapdevcenter.com/sap/opu/sdata/sap/ZFLIGHT_MODEL/zflightCollection?$filter=airline_1 EQ 'AA'&sap-client=520&$format=xml")
 
mypattern = '([^<]*)'
datalines = grep(mypattern,web_page,value=TRUE)
getexpr = function(s,g)substring(s,g,g+attr(g,'match.length')-1)
g_list = gregexpr(mypattern,datalines)
matches = mapply(getexpr,datalines,g_list)
result = gsub(mypattern,'\\1',matches)
names(result) = NULL
airlines <- sort(table(result), decreasing = TRUE)
lbls <- names(airlines)
 
pie3D(airlines,labels=lbls,explode=0.1,
      main="American Airlines")

Aquí esta el resulado...


Nos vemos la próxima vez!