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!

No comments: