Monday, November 02, 2015

Ada y HANA jugándo juntas

Este post fué posteado originalmente en Ada and HANA playing together.


Ada es un lenguaje de programación estructurado, the tipeado estático, imperativo, de amplio espectro y orientado a objetos, extendido de Pascal y otros lenguajes.

Fué desarrollado originalmente para el Departamento de Defensa de los Estados Unidos. Y fué llamado en honor a Ada Lovelace (1815-1852), quién fué la primera programadora de computadoras.

Ada es un lenguaje que simplemente no te deja fallar…puesto que posee mecanismos para revisión de código tanto en modo de compilación como de ejecución…eliminándo la gran mayoría de posibles errores molestos que se podrían generar un tu aplicación…

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 Ada…



Ada viene instalado en la mayoría de distribuciones basadas en Linux…pero la versión puede ser un poco antigua…así que es mejor descargar e instalar una versión más actualizada…así que por favor solo hagan esto en una sesión de terminal…

sudo apt-get install gnat
sudo apt-get install libaws-bin libaws3.2.0-dev

Para instalar tanto Ada como AWS (No…no ese…Ada Web Server)…

También, necesitaremos descargar e instalar XML/Ada

tar zxvf xmlada-gpl-4.3-src.tgz
cd xmlada-4.3-src/
./configure --prefix=/usr/gnat
PROCESSORS=4 make all
make docs
make install

Luego, tenemos que actualizar el archivo .bashrc para tener las rutas correctas…

PATH=/usr/gnat/lib/gnat:$PATH
export PATH
GPR_PROJECT_PATH=/usr/gnat/lib/gnat:$GPR_PROJECT_PATH
export GPR_PROJECT_PATH

ADA_PROJECT_PATH=$ADA_PROJECT_PATH:/usr/gnat/lib/gnat
export ADA_PROJECT_PATH
ADA_OBJECTS_PATH=$ADA_OBJECTS_PATH:/usr/gnat/lib/gnat
export ADA_OBJECTS_PATH
ADA_INCLUDE_PATH=$ADA_INCLUDE_PATH:/usr/gnat/lib/gnat
export ADA_INCLUDE_PATH

Luego creamos un archivo llamado ada_hana.adb en nuestro editor favorito y copiamos el siguiente código

ada_hana.adb
with Ada.Text_IO; use Ada.Text_IO;
with AWS.Client;
with AWS.Response;

with Input_Sources.Strings;
with Unicode.CES.Utf8;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;

with Sax.Readers;        use Sax.Readers;
with DOM.Readers;        use DOM.Readers;
with DOM.Core;           use DOM.Core;
with DOM.Core.Documents; use DOM.Core.Documents;
with DOM.Core.Nodes;     use DOM.Core.Nodes;
with DOM.Core.Attrs;     use DOM.Core.Attrs;

procedure Ada_Hana is
 Flights : Unbounded_String;
 Input : Input_Sources.Strings.String_Input;

 Reader : Tree_Reader;
 Doc    : Document;
 C_List   : Node_List;
 P_List   : Node_List;
 C_N      : Node;
 P_N      : Node;

begin
 Flights := AWS.Response.Message_Body (AWS.Client.Get (URL=>"http://YourServer:8000/Flights/flights.xsodata/FLIGHTS", 
                                                              User => "SYSTEM", Pwd => "YourPassword")); 
 
 Input_Sources.Strings.Open (To_String(Flights), Unicode.CES.Utf8.Utf8_Encoding, Input);
 DOM.Readers.Parse (Reader, Input);
 Doc := Get_Tree (Reader); 
 
 C_List := Get_Elements_By_Tag_Name (Doc, "d:CARRNAME");
 P_List := Get_Elements_By_Tag_Name (Doc, "d:PRICE");

   for Index in 1 .. Length (C_List) loop
      C_N := Item (C_List, Index - 1);
      P_N := Item (P_List, Index - 1);
      Put_Line (Node_Value(First_Child(C_N)) & ": " & Node_Value(First_Child(P_N)));
   end loop; 

   Free (C_List);
   Free (P_List);
   Free (Reader);
   
end Ada_Hana;

Para compilar esta aplicación debemos crear un nuevo archivo…y llamarlo compile_ada_hana.gpr

compile_ada_hana.gpr
with "aws";
project Compile_Ada_HANA is
for Main use ("ada_hana.adb");
end Compile_Ada_HANA;

Y ejecutarlo así…

sudo gprbuild compile_ada_hana.gpr

Una vez que el executable ha sido generado…podemos ejecutarlo así…

./ada_hana


Si se preguntan…porque no utilicé JSON en vez de XML? Bueno…hay una explicación sencilla para esto -:) La librería de JSON es muy buena…pero tuve algunos problemas compilándola y no hay muchos ejemplos que como extraer información de un JSON complejo…así que utilizar XML parecía una opción mejor y más sencilla -;)

Saludos,

Blag.
Development Culture.

No comments: