Monday, January 21, 2013

PHP tambien la rompe con SAP HANA!


Un par de dias atraz, un amigo me digo que algunas personas estaban tratando de hacer que PHP y SAP HANA trabajen juntos sin ningun tipo de exito...por supuesto...lo tome como mi nueva meta...No he hecho nada de PHP en mucho tiempo...pero eso nunca me ha detenido -;)

Lo primero...fue crear una conexion ODBC y tratar de hacerla funcionar...no funciono...pero solo porque la cree utilizando "User DSN" en vez de "System DSN"...cuando necesitamos utilizar una o la otra?...No tengo idea...pero mientras funcione...no me importa...

Ahora que ya estaba funcionando...era tiempo de hacer un simple query...eso tambien fallo...con un agresivo y raro mensaje...



Scrollable Result aun no esta implementado...que se supone que significa eso? Al principio...pense que quizas el NVARCHAR no estaba soportado, asi que cree una tabla temporal utilizando solamente dos campos VARCHAR...el mismo resultado...asi que era algo mas...al final...luego de buscar en Google...descubri que algunas Bases de Datos permiten que los cursores avancen y retrocedan...y de alguna manera...con SAP HANA me estaba dando un error...la solucion mas simple fue especificar el cursor

$conn = odbc_connect("HANA_KT_SYS","SYSTEM","manager", SQL_CUR_USE_ODBC);

El uso de SQL_CUR_USE_ODBC era todo lo que necesitaba para continuar...

Para este ejemplo, decidi crear un Attribute View uniendo las tablas SPFLI y SCARR. Para la primera pantalla voy a mostrar todos los CARRID disponibles y en la segunda pantalla, voy a mostrar algunos campos en una tabla HTML. Algo simple y directo.


Ahora, veamos el codigo PHP...

PHP_SAPHANA.php
<?php
$conn = odbc_connect("HANA_KT_SYS","SYSTEM","manager", SQL_CUR_USE_ODBC);
if (!($conn)) { 
 echo "<p>Connection to DB via ODBC failed: ";
 echo odbc_errormsg ($conn );
 echo "</p>\n";
}
else{
 if(isset($_POST["CARRID"]) == false)
 {
  $sql = "SELECT CARRID, CARRNAME FROM SFLIGHT.SCARR 
                        WHERE MANDT = 300";
  $rs = odbc_exec($conn,$sql);
  print("<DIV ALIGN='CENTER'>");
  print("<H1>SAP HANA from PHP</H1>");
  print("<FORM NAME='Get_Data' 
                       ACTION='$_SERVER[PHP_SELF]' METHOD='POST'>");
  print("<SELECT NAME='CARRID'>");
  while($row = odbc_fetch_array($rs)){
      $carrid = $row["CARRID"];
   $carrname = $row["CARRNAME"];
   print("<OPTION VALUE='$carrid'>$carrname");
  }
     print("</SELECT>");
      print("<INPUT TYPE='SUBMIT' VALUE='Get Data'>");
      print("</FORM>");
      print("</DIV>");
 }
 else{
  $carrid_param = $_POST["CARRID"];
  $sql = "SELECT * FROM \"_SYS_BIC\".\"blag/AV_FLIGHTS\" 
          WHERE CARRID = '$carrid_param'";
  $rs = odbc_exec($conn,$sql);
  print("<DIV ALIGN='CENTER'><TABLE BORDER=1>"); 
          print("<TR><TH>MANDT</TH>
                       <TH>CARRID</TH>
                       <TH>CONNID</TH>
                       <TH>COUNTRYFR</TH><TH
                       >CITYFROM</TH>                        
                       <TH>AIRPFROM</TH>
                       <TH>COUNTRYTO</TH>
                       <TH>CARRNAME</TH>
                       <TH>DISTANCE</TH></TR>");
  while($row = odbc_fetch_array($rs)){
   $mandt = $row["MANDT"];
   $carrid = $row["CARRID"];
   $connid = $row["CONNID"];
   $countryfr = $row["COUNTRYFR"];
   $cityfrom = $row["CITYFROM"];
   $airpfrom = $row["AIRPFROM"];
   $countryto = $row["COUNTRYTO"];
   $carrname = $row["CARRNAME"];
   $distance = $row["DISTANCE"];
   print("<TR><TD>$mandt</TD><TD>$carrid</TD>
           <TD>$connid</TD><TD>$countryfr</TD>
        <TD>$cityfrom</TD><TD>$airpfrom</TD>
        <TD>$countryto</TD><TD>$carrname</TD>
        <TD>$distance</TD></TR>");
  }
  print("</TABLE>");
  print("<A HREF='PHP_SAPHANA.php'>Go Back</A></DIV>");
 }
}
?>

Ahora, podemos llamarlo desde cualquier navegador de Internet...




Como pueden ver...no hay limitaciones para lo que puedes hacer con SAP HANA...algunas veces...solo toma un poco mas de investigacion -;)

Saludos,

Blag.

No comments: