Friday, January 10, 2014

MeteorJS y SAP HANA

Si pensaban que iba a aprender MeteorJS y no tratar de enlazarlo con SAP HANA...entonces estaban completamente equivocados-;)

Por supuesto...estoy lejos de ser un buen desarrollador en Meteor...así que por favor tenganme paciencia -:( Tampoco soy muy bueno en NodeJs...así que...ya saben...solo soy yo jugando un poco -:)

Así que...comencemos...hay muchas maneras en las cuales podemos conectar Meteor y SAP HANA...pero...que pasaría si de alguna manera pudieramos hacer la conexión de una manera nativa?

Si no han visitado aún SAP Developers on GitHub...les recomiendo que lo hagan...tenemos algunos cuantos excelentes proyectos Open Source...

En fín...allí van encontrar una gema perdida llamada simplemente node-hdb el cual es por supuesto...un conector nativo de NodeJS para SAP HANA...impresionante, no?

Ahora...se preguntarán...que tiene que ver NodeJS con Meteor? Fácil...Meteor utiliza NodeJs en el fondo...

Revisando la web...encontré este impresionante Hack de Meteor llamado Complete NPM integration for Meteor el cual es simplemente asombroso...basicamente...nos permite incluir paquetes NodeJS en el servicio interno de NodeJS en nuestra instalación de Meteor...

Simplemente debemos hacer esto...

Instalando node-hdb en Meteor
npm install -g meteor-npm
cd "nuestro_proyecto"
meteor-npm

Esto creará una carpeta llamada "npm" dentro del proyecto...ahora...simplemente crea una archivo llamado packages.json en la raiz de tu carpeta...

Packages.json
{
 "hdb": "0.2.0"
}

Con esto...estamos listos para divertirnos con Meteor -;)

Primero...hagamos la parte del HTML...

HANA_Test.html
<head>
  <title>SAP HANA and MeteorJS</title>
</head>

<body>
  {{> CallHANA}}
</body>

<template name="CallHANA">
<DIV ID'block' ALIGN='CENTER'>
<H1>Calling SAP HANA from MeteorJS</H2>
 <TABLE BORDER='1'>
 <TR><TH>Carrier</TH><TH>Connection</TH>
     <TH>Country From</TH><TH>City From</TH>
     <TH>Airport From</TH><TH>Country To</TH>
     <TH>City To</TH><TH>Airport To</TH>
     <TH>Distance</TH></TR>
 {{#each Spfli}} 
  <TR>
   <TD>{{CARRID}}</TD><TD>{{CONNID}}</TD>
   <TD>{{COUNTRYFR}}</TD><TD>{{CITYFROM}}</TD>
   <TD>{{AIRPFROM}}</TD><TD>{{COUNTRYTO}}</TD>
   <TD>{{CITYTO}}</TD><TD>{{AIRPTO}}</TD>
   <TD>{{DISTANCE}}</TD>
  </TR>
 {{/each}}
 </TABLE>
</DIV> 
</template>

Luego...creamos dos carpetas...una llamada "server" y la otra llamada "client"...

Dentro de la carpeta "server" creamos un archivo llamado "HANA_TestServer.js"

HANA_TestServer.js
var myjson = [];

Meteor.methods({
    'CallHANA': function CallHANA() {
  hdb    = Meteor.require('hdb');
    client = hdb.createClient({
    host     : 'hanasvr-XX.sapdevcenter.com',
    port     : 30015,
    user     : 'SYSTEM',
    password : 'XXXXXX'
  });

  client.connect(function (err) {
     if (err) {
       return console.error('Connect error', err);
     } 
      client.exec('select top 10 * from SFLIGHT.SPFLI', function (err, rows) {
       client.end();
       if (err) {
          return console.error('Execute error:', err);
       }
        var count = Object.keys(rows).length
        for(var i=0;i<count;i++){
         myjson.push(rows[i]); 
        } 
      });
  });
  return myjson;
 }  
  });

Dentro de la carpeta "client" creamos un archivo llamado ""HANAClient.js"...

HANAClient.js
 Meteor.startup(function () {
    Meteor.call("CallHANA", function (error, result) {
             Session.set("myjson", result);
            });
    });

    Template.CallHANA.Spfli = function () {
     row = Session.get("myjson");
     return row;
    };

Cuando hemos terminado...simplemente llamamos a nuestra aplicación Meteor y luego de refrescar la página...debo trabajar en la parte de reactividad -:( Estoy seguro de que con un simple botón que llame a la función sería suficiente...pero estoy cansado y soy flojo...El resultado del query será mostrado-;)


No se ve exactamente impresionante...pero para ser el primer paso...pienso que es más que suficiente -;)

Saludos,

Blag.
Developer Empowerment and Culture.

No comments: