Showing posts with label SUP. Show all posts
Showing posts with label SUP. Show all posts

Friday, November 09, 2012

Consumiendo R desde SAP Mobile Platform

En inicios de este anho, en Marzo, estaba visitando a mi amigos de equipo en SAP Labs Palo Alto, y mi bien amigo y colega Rui Nogueira me pidio que participe en su mas que excelente Technology Innovation Podcast donde hablamos sobre R y SAP HANA. Al final de la entrevista le dije a Rui que iba a tratar de conectar R con SUP (Al cual llamamos ahora SMP)...pero en realidad...nunca lo hice por mi falta de tiempo y especificamente y mas importante...porque no tenia ni la menor idea de como hacerlo...

Asi que...ayer, mientras leia el libro de Steve Jobs en mi Kindle, escuche una voz en mi cabeza que decia..."Dude! What the SAP? Where's R and SMP?" (Creanme, no va sonar tan bien si lo traduzco)...es ese momento...supe que tenia que hacer algo al respecto...

De nuevo...no tenia idea de como hacerlo ni de como comenzar a trabajar en esto...pero ya habia usado Rook (Servidor Web de R) en mi blog RSAP, Rook y ERP y tambien Sinatra (Ruby WebServer) en mi  blog PowerBuilder y Gateway - Al estilo de Sinatra Supe entonces, que esa era la manera de hacerlo.

Sabia que tenia que desarrollar una aplicacion Rook para exponer la data como JSON y pasarsela a SMP. Bueno...eso fallo rapidamente, porque hasta donde yo se y tambien mis pruebas fallaron, SMP aun no soporta JSON.

Mi proximo pensamiento fue hacer que la aplicacion Rook expusiera los datos como XML, lo cual por supuesto funciono bien, pero sin usar la libreria standard de R XML porque la respuesta es un objecto en C que se ve bastante mal cuando se convierte a texto.

Lo primero, fue pensar en un buen ejemplo para este blog...pero como dicen, tienes que ensenarle al hombre como pescar...asi que termine con un ejemplo bastante simple. Digamos que eres un profesory mi esposa Milly, mi hija Kiara y yo, somos estudiantes. Tienes un archivo Excel donde pones los nombres y las notas y quieres una aplicacion mobil que lea el archivo, calcule la media y provea la nota final, simplemente pasando la nota del alumno. Ya lo se...Excel? Porque no SAP HANA? Bueno...eres un profesor chapado a la antigua...SAP HANA es tan veloz, que ni siquiera puedes verlo...asi que te aferras a las herramientas mas basicas...


Por supuesto, en R, preferimos trabajar con archivos .CSV files, asi que siendo un buen profesor, creas el archivo y nos lo das, para que podamos jugar con el.

Para hacerme las cosas mas sencillas, use mi cuenta de CloudShare.com para empezar a trabajar...Cree mi aplicacion SMP, llame a la pagina web de Rook y lo probe en mi emulador de BlackBerry...todo funciono como una maravilla...pero...siempre hay uno...el problema real vino cuando decidi mover todo a AWS...

La cosa es...y no me di cuenta a su debido tiempo...en CloudShare.com todo funciono porque ambos, el Servidor SMP y el Servidor Rook estan en el mismo lugar...el mismo entorno localhost...en AWS, las cosas cambian porque el Servidor SMP esta en el cloud mientras que mi Servidor Rook esta en mi localhost (laptop)...gran problema...

Ayer estuve trabajando hasta las 10:00 pm tratando de descubrir como solucionar este gran problema...quizas es por eso que termine con una idea realmente tonta...dije...Ok...vamos a mover el Servidor Rook al cloud tambien! Asi que me logee en mi Servidor SMP Server, instale R y todo lo demas y ejecute el Servidor R...de regreso en mi laptop...por supuesto que fallo miserablemente...el nuevo Servidor Rook era localhost pero para mi Servidor AWS...asi que de ninguna manera mi emulador de Android iba a poder verlo...

Me dije...Ok...no hay que entrar en panico...tengo un Servidor de R en AWS...vamos a hacerlo ahi...otro fallo (ya me estoy acostumbrando)...el Servidor de R en AWS no tiene cabeza, asi que ningun browser tiene permitido trabajar...ademas...Rook siempre es localhost, asi que no habia manera de hacer la llamada...

Comence a entrar en panico...asi que me fui a dormir...aunque sea por un momento...

Hoy dia, me levante a las 5:30 am y comence a navegar esperando ver la luz al final del tunel...y lo hice...gracias a Dios...lo hice...

Un azombroso desarrollador llamado Noah Lorang logro hacer que Rook funciones en Heroku...to explicado en su Github account...asi que mi vida estaba salvada (no por mucho tiempo, tristemente)...




Nunca antes habia usado Heroku...y debo admitirlo...no es para novatos...realmente me tomo mucho tiempo hacerlo funcionar...pero finalmente lo hice (Obviamente...de otra manera, no estaria aburriendolos con toda mi charla sin sentido)...

Asi que...aqui esta lo que hice...

  • Me cree una cuenta en Heroku e instale el Heroku Tool Belt.
  • Me cree una public key.
  • Dentro de la aplicacion Git Bash instalada por el Heroku Tool Belt me loguee.


Clonar y crear una aplicacion en Heroku
git clone git://github.com/noahhl/rookonheroku.git blagcodes 
#(Esto va a clonar el Github de Noahy crear una carpeta llamada blagcodes 
#para guardar los codigos)
heroku create blagrook 
#(Cree una aplicacion para mi script de Rook)
git push heroku master 
#(Esto me permite pasar todo de mi carpeta folder 
#a mi cuenta de Github)

Con esto, estaba casi listo para rockear...pero necesitaba hacer algo primero...pasar mi propio script de Rook...

Summarize.R
library(Rook)
 
newapp<-function(env){
  req<-Rook::Request$new(env)
  res<-Rook::Response$new()
 
  name_param = req$params()$name
 
  Grades_Source = read.csv(file="Grades.csv",header=TRUE)
  Name<-Grades_Source$Name
  Grades<-Grades_Source$Grades
  Mean<-aggregate(Grades~Name,data=Grades_Source,FUN=mean)
  Mean_Result<-c(subset(Mean,Name == name_param))
 
  res$write("<root>")
  res$write("<Name>")
  res$write(Mean_Result$Name)
  res$write("</Name>")
  res$write("<Final_Grade>")
  res$write(as.character(Mean_Result$Grade))
  res$write("</Final_Grade>")
  res$write("</root>")
 
  res$finish()
}
 
 
server = Rhttpd$new()
server$add(app = newapp, name = "summarize")
server$start(listen="0.0.0.0", port=as.numeric(Sys.getenv("PORT")))
 
 
while(T) {
  Sys.sleep(10000)
}


A pesar del nombre, en realidad hice algo mas sencillo, simplemente tome el archivo demo.R y lo reemplace con mi propio codigo fuente. Tambien, copie el archivo Grades.csv a mi carpeta blagcodes (que esta localizada en mi laptop).

El codigo es simple, creamos una aplicacion Rook llamada "summarize" que va a leer el archivo Grades.csv, lo sumarizamos utilizando la funcion mean e imprimimos una estructura basica de XML pasando el Nombre y Nota de la persona que pasamos como parametro. Necesitamos pasar el listen="0.0.0.0" y el port=as.numeric(Sys.getenv("PORT")) para que Heroku sepa como llamar a la pagina.

De vuelta en el Git Bash, hice lo siguiente para pasar los cambios de vuelta a Heroku...

Passing back to Heroku
git add .
git commit -am "message"
git push heroku

Con esto, todo estaba listo y preparado...asi que veamos como se ve...


(Estoy usando IE solo porque queria mostrar que la respuesta de la aplicacion Rook se puede ver un poco diferente a una respuesta XML, pero viendo el codigo fuente, en realidad pueden ver que es un XML...ademas, porque IE no trata de unir las pestanas cuando se les pone juntas como si lo hace Chrome).

Cuando comence a desarrollar la aplicacion SMP me di cuenta de que llamar a un WebService no era una opcion...puesto que por supuesto, este no es un WebService...asi que opte por usar un REST Web Service...pero me estaba pidiendo utilizar estructuras XSD...asi que luego de otro largo tiempo...encontre una simpatica herramienta online para hacer eso...

Simplemente pase una estructura XML y deje que la herramienta trabajara por mi...



Por supuesto...nunca antes habia trabajado con XSD...asi que no sabia que esperar...la cosa es...si utilizas esta estructura...va a fallar...primero por el Final_Grade que es xs:byte y segundo porque cuando estaba cargando los parametros, Final_Grade se estaba mostrando tambien...y yo no queria que pase eso...asi que hice una copia del archivo, cambie un poco aqui y alla y termine con Request.txt y Response.txt como pueden ver aqui...



Asi que...como le iba diciendo...cree un REST WebService...


Luego de esto...vino otra parte complicada puesto que no sabia como hacer que el parametro funcione...afortunadamente...logre hacerlo funcionar...


Cargue mi Request.txt y obtuve el elemento Root...


Luego, repeti lo mismo para Response.txt y termine con esto...


Luego de crear mi Mobile Application, cree un Personalization Key para poder controlar el parametro.


Este es el Look & Feel de la aplicacion. Algo bastante simple, se te pide un nombre, presionas Get Grades y el resultado se te sera devuelto en una lista.


Ahora...estamos listos para probar la aplicacion...



Me parece...que no me fue muy bien en los examenes...veamos como le fue a mi hija...



Como me lo esperaba! Mi hija es mas inteligente y hermosa que yo...

Bueno...eso es todo amigos...me tomo cerca de 24 horas (sumando ayer y hoy dia) para poder tener esto funcionando...pero puedo asegurarle a Mr. Nogueira que Blag siempre cumple sus promesas...le prometi tener a R funcionando con SMP...y aqui esta...

Saludos,

Blag.

Tuesday, August 14, 2012

SUP en AWS - Un mejor ejemplo de vuelos

Ya he tratado con este problema antes, pero realmente nunca inverti tiempo en tratar de resolverlo, hasta que alguien hizo la pregunta en los foros...

Cuando creamos una aplicacion SUP, la mayoria de veces usamos cajas de texto para enviar la informacion y obtener datos, o quizas podemos escoger un control choice con algunos valores hardcode.

Que pasa si por ejemplo, queremos tener un mejor ejemplo de vuelos, uno que nos muestre un control choice con todas las aerolineas ya cargadas...eso seria excelente, no? Y en realidad...es mucho mas facil de lo que parece...

Para que esto funcione, necesitamos primero logearnos en nuestro ERP y crear una estructura llamada ZFLIGHT_DETAILS.


Luego, un Table Type basado en esa estructura.


Finalmente...un realmente simple Modulo de Funciones RFC...demasiado simple si me lo preguntan...


Este FM simplemente nos va a devolver todas las aerolineas con sus respectivos codigos.

Con esto listo, podemos irnos a nuestro Unwired Workspace y crear un proyecto. En este proyecto, crearemos dos MBO's. Uno enlazado a nuestro FM ZGET_AIRLINES y el otro enlazado al BAPI BAPI_FLIGHT_GETLIST.


Aqui, es importante crear un Personalization Key solo para el MBO GetFlightsMBO  y por supuesto, no debemos olvidarnos de hacerle el enlace.



Despues de grabar y enviar al servidor, establecemos nuestros Starting Points. Y aqui viene la parte emocionante...puesto que no vamos a escoger la primera opcion solamente, sino tambien la tercera.


Cuando hacemos doble click en la pantalla "Activate", tendremos una pantalla vacia con un link que dice "Submit Workflow"...aqui, pueden ponerse creativos y usar el logo de su empresa...escribir un mensaje...y por supuesto, cambiar "Submit Workflow" to "Empezar" o "Comenzar el viaje"...de cualquier modo...mi trabajo no es construir software comercial, asi que lo dejo como esta...


Cuando hacemos click en el enlace "Submit Workflow", podemos establecer las propiedades, y aqui es donde vamos a llamar a nuestro FM. Tengan en cuenta que es muy importante que el Default Success Screen sea "Start".


Ahora, debemos irnos a la ventana "Start Screen", y agregar un control Choice y un enlace con el nombre "Get Flights".


Cuando establecemos las propiedades del contrl Choice, veran de donde viene la magia.


No se olviden de hacer link a la Personalization Key.



Finalmente, nuestro modelo se deberia ver con este...


Debemos grabar y generar nuestro proyecto para poder verlo en el dispositivo mobil de nuestra preferencia.






Espero que les guste este blog y espero que ya tengan su propio servidor de SUP en Amazon Web Services...sino...haganlo ahora! Mientras tanto pueden tambien crear sus servidores de SAP HANA y R...

Saludos,

Blag.

Thursday, August 09, 2012

SUP en AWS - Desde el punto de vista de Blag

El otro dia lei el blog de My 1st Sybase Unwired Platform app on AWS de Tobias Hofmann quien es un amigo y SAP Mentor. Tobias no parece estar muy feliz con SUP en Amazon...asi que por supuesto...tenia que hacer la prueba yo mismo.

Utilizando la documentacion del guru a tiempo completo Juergen Schmerder llamada Get your own Sybase Unwired Platform server on Amazon Web Services pude descargar el SDK y crear mi imagen en AWS ...la cual, para ser honestos, no funciono porque muchos errores ridiculos...pero solo me tomo unos cuantos minutos limpiar todo el desastre, y crear una nueva imagen que funciono perfectamente...tenia mi propio servidor de SUP listo y corriendo.

Luego de que instale el emulador de Android, instalar el Sysbase Workflow no fue para nada complicado...simplemente tuve que llamar este comando...

Instalando Sybase Workflow
<path_to>\adb install <path_to>\SybaseDataProvider.apk

Lo primero que note mientras hacia mi primer ejemplo, era algo que Tobias ya habia expirementado...un DLL estaba perdido o no podria ser leido...


Realmente estaba confundido por esto...Hasta me logee en el Remote Desktop para copiar el archivo y crear la misma estructura en mi laptop...no funciono...hasta que encontre un comentario from Pasquale de Angelis que como por arte de magia arreglo todo.

Ahora...queria hacer un ejemplo interesante, porque leer datos de las tablas de vuelos es demasiado comun...asi que decidi hacer algo mas.

Pense acerca del RFC_ABAP_INSTALL_AND_RUN pero...uno de los parametros de entrada es una tabla, con estructura y aun cuando el preview funciono, no pude realmente encontrar una forma de hacerlo funcionar utilizando los Personalization Keys...asi que...por supuesto, cree mi propia ZRFC_ABAP_INSTALL_AND_RUN.

Actualizacion: RFC_ABAP_INSTALL_AND_RUN no ha sido liberado, como se muestra en https://service.sap.com/sap/support/notes/514998 y no debe ser usado en un entorno de productivo. Este es solamente un ejemplo en un blog y debe ser tomado como tal.



Basicamente me deshize del parametro de tabla y utilize 8 parametros para poder formar el codigo que se debe ejecutar.



Con el Modulo de Funciones RFC listo, pude comenzar con el duro trabajo en SUP...y por cierto...para que esto realmente funcione tuve que crear un programa ZTEST vacio en mi ERP.


Cree un MBO relacionado a mi Modulo de Funcion y 8 Personalization Keys, uno para cada parametro.


Asocie los Personalization Keys con los argumentos o parametros del MBO.




Dentro de la pantalla, cree los parametros y el menu para enviar el codigo fuente.


Una simple asociacion de los Personalization Keys y Parameter Keys hicieron el truco.

Luego de eso...que en realidad no me tomo mas de 5 minutos, estaba listo para la prueba final...ejecutar un simple programa ABAP en Android...

ABAP LOOP
REPORT ZTEST.
DATA: COUNTER TYPE I.
DO 10 TIMES.
COUNTER = COUNTER + 1.
WRITE:/ 'Counter value is:', COUNTER.
ENDDO.



Funciono perfectamente! Asi que...ninguna prueba puede estar completa sin una prueba compleja...

ABAP_SELECT
REPORT ZTEST.
DATA: T_SPFLI TYPE STANDARD TABLE OF SPFLI.
FIELD-SYMBOLS: <FS_SPFLI> LIKE LINE OF T_SPFLI.
SELECT * FROM SPFLI INTO TABLE T_SPFLI.
LOOP AT T_SPFLI ASSIGNING <FS_SPFLI>.
WRITE:/ <FS_SPFLI>-CARRID, <FS_SPFLI>-CONNID.
ENDLOOP.



Excelente, no? No tuve ningun problema de conexion con AWS...el servicio fue muy estable y confiable...despues de todo, tengo un servidor de SAP HANA y un servidor de R sentados juntos a mi nuevo servidor de SUP.

Saludos,

Blag.

Friday, April 20, 2012

Experimentos de Blag con SUP - Volumen 2


Como lo prometi...aqui esta otro de mis experimentos con SUP...esta vez, queria hacer algo mas interesante y mas complejo...algo que realmente ...Asi que tome algo que construi hace bastante tiempo utilizando PHP y SAP...Estoy hablando de la emulacion de SBWP mas conocido como SAP Mail.
Por supuesto, tuve que regresar a mis raices en ABAP roots y construir algunos modulos de funciones RFC.
(El codigo es un poco extenso, asi que voy a subirlo junto con el codigo de SUP a Code Exchange )
Con eso listo...podemos empezar a trabajar con SUP...primero que nada, dejenme enseñarles el modelo.


Realmente, es mas sencillo de lo que se ve. Como tenemos 4 modulos de funcion, debemos crear 4 MBO's (Business Model Objects) y enlazamos 2 de elllos...El de Titles con el de Details...



Debemos establecer una relacion entre Titles y Details, porque vamos a tener una pantalla con los Titulos y para cada uno de ellos vamos a mostrar el detalle.



Es muy importante definir el Personalization keys, puesto que vamos a utilizarlos como parametros para los  MBO's.


Este es el Personalization para el MBO Send Mail.



Con toda la explicacion, podemos echarle un vistazo a la demo, que corre en un emulador de BlackBerry.







Como pueden ver, podemos hacer todo lo que hariamos en la transaccion SBWP...pero como siempre -:(  tengo un pequeño bug...en la ventana de Reply, el "To:" deberia estar lleno, sin embargo, no he podido conseguirlo aun...porque despues de todo...SUP es una nueva tecnologia, y todos estamos aprendiendo a utilizarla -;)

https://cw.sdn.sap.com/cw/groups/blag-stuff?view=documents