Monday, November 09, 2015

Volviéndonos funcionales con SAP HANA y Erlang

Este post fué posteado originalmente en Getting functional with SAP HANA and Erlang.


Erlang es un lenguaje y sistema de ejecución concurrente de propósito general con recolección de variables. Y también es funcional, con evaluación impaciente, asignamiento único y tipeado dinámico. Me olvidé de mencionar que también es distribuído, concurrente y toleránte a fallos?.


Una descripción bastante grande, no? Bueno…Erlang ha estado presente desde hace más o menos los últimos 30 años…


Así que…ninguna demostración estaría completa si la enlazaramos con SAP HANA, so? Así que…vamos a hacerlo -;)

Primero, debemos crear un objeto Join y asociar la tabla por MANDT y CARRID. De ahí, seleccionar los siguientes campos como output MANDT, CARRID, CARRNAME, PRICE y CURRENCY.

Luego crear un objeto Aggregation seleccionándo los campos CARRNAME, PRICE (Como columnas agregadas) y CURRENCY. Debemos filtrar el campo CURRENCY por ‘USD’.

Luego, debemos crear un objeto Projection y seleccionar solo PRICE y CARRNAME.

En el objeto Semantics asegúrense de marcar  “CROSS CLIENT” como cliente por defecto.


Ahora, cambiemos a la vista SAP HANA Development y creemos un nuevo repositorio. Lo llamaremos“Flights”.

Creamos un proyecto “XS Engine” y también lo llamamos “Flights”. Lo enlazamos con el repositorio “Flights”.

Creamos un archivo vacio llamado “.xsapp”.

Creamos un archivo llamado “.xsaccess” con el siguente código.

.xsaccess
{
          "exposed" : true,
          "authentication" : [ { "method" : "Basic" } ]
}

Finalmente creamos un archivo llamado “flights.xsodata” con el siguiente código

flights.xsodata
service {
          "Blag/FLIGHTS_BY_CARRIER.calculationview" as "FLIGHTS" keys 
                                                        generate local "Id";
}

Activamos el proyecto y lanzamos nuestro browser...deberíamos ver algo como esto…


La parte de SAP HANA está lista…así que ahora podemos pasar a la parte de Erlang…

Erlang, a diferencia de muchos otros lenguajes, no tiene un manejador de paquetes, así que solamente debemos descargar el paquete que necesitamos, compilarlo y utilizarlo -;)

Para programar en Erlang uso uno de los más impresionántes editores que he encontrado hasta ahora…Geany. Viene practimente pre configurado para manejar muchos lenguajes de programación, así que debería dejarte listo para utilizar Erlang.

Necesitamos descargar mochijson2.erl y guardarlo en la carpeta de nuestro proyecto, luego simplemente debemos compilarlo escribiendo

erlc mochijson2.erl

Del terminal o presionándo el botón. El primero de la imagen.


Con eso, deberíamos estar más que listos para comenzar a programar -:) Copien y peguen el siguiente código…

Erlang_HANA.erl
-module(erlang_HANA).
-export([getOData/0,showInfo/5]).

showInfo(Carriers, Prices, Acc, Len, Ctr) when Ctr =< Len ->
 showInfo(Carriers, Prices,  Acc ++ [binary_to_list(lists:nth(Ctr,Carriers))] ++ [": "] ++
   [binary_to_list(lists:nth(Ctr,Prices))] ++ ["\n"], Len, Ctr + 1);
showInfo(_, _, Acc, Len, Ctr) when Ctr > Len ->
 io:format("~s",[Acc]).
 
getOData() ->
 inets:start(),
 Response = httpc:request(get, {"http://54.65.196.224:8000/Flights/flights.xsodata/FLIGHTS?$format=json", 
                          [{"Authorization", "Basic " ++ base64:encode_to_string("SYSTEM:Blag1977")}]}, [], []),
 Flights = mochijson2:decode(response_body(Response)),
 {struct, JsonData} = Flights,
 {struct, D} = proplists:get_value(<<"d">>, JsonData),
 Results = proplists:get_value(<<"results">>, D),
 Carriers = [proplists:get_value(<<"CARRNAME">>, S) || {struct, S} <- Results],
 Prices = [proplists:get_value(<<"PRICE">>, S) || {struct, S} <- Results],
 showInfo(Carriers, Prices, "", length(Carriers), 1).

response_body({ok, { _, _, Body}}) -> Body.

Guarda tu archivo y presiona el botón “Run or view the current file”. El último de la foto, que parece dos engranajes.


Debemos utilizar el formato “nombre_del:archivo:método()”para cargarlo en memoria y ejecutarlo -;)

Saludos,

Blag.
Development Culture.

No comments: