Wednesday, December 12, 2007

Tasting the mix of PHP, WML and SAP

Tasting the mix of SAP, WML and SAP on SDN

Saben ustedes lo que es el WML? Muy simple...WML significa Wireless Markup Language y es utilizado para desarrollar aplicaciones móbiles.

Hace algunas semanas, tuve que hacer un pequeño juego utilizando JavaME (Ya postearé sobre eso)...Por lo cual, obviamente pensé en hacer un emulador de SE16 utilizando el conector SAPJCo, JavaME y SAP...Por lástima, algunas librerías me siguen mostrando errores...No importa...Dado mi "error", decidí retomar un proyecto que tenía archivado desde hace tiempo...Utilizar PHP, WML y SAP para hacer una emulación de SE16...Me tomó algunas horas hacer esto...

index.php

<?php
session_start();
$_SESSION = array();
session_destroy();
header("Content-type: text/vnd.wap.wml");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
echo ("<?xml version='1.0'?>");
?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="index" title="SE16" ordered="false">
<p>
Server:<input name="Server" size="5"/><br/>
System:<input name="Sysnum" size="3"/><br/>
Client:<input name="Client" size="3"/><br/>
User:<input name="User" size="6"/><br/>
Password:<input name="Password" size="7" type="password"/><br/>
</p>
<do type="accept" label="OK" optional="false">
<go href="process.php" method="post">
<postfield name="Server" value="$Server"/>
<postfield name="Sysnum" value="$Sysnum"/>
<postfield name="Client" value="$Client"/>
<postfield name="User" value="$User"/>
<postfield name="Password" value="$Password"/>
</go>
</do>
</card>
</wml>

Login_Class.php

<?php

Class Login
{
var $Login, $rfc;

function Log_In($Server,$Sysnum,$Client,$User,$Pass)
{
$this->Login = array ("ASHOST"=>$Server,
                      "SYSNR"=>$Sysnum,
                      "CLIENT"=>$Client,
                      "USER"=>$User,
                      "PASSWD"=>$Pass,
                      "CODEPAGE"=>"1404");

return $this->Login;
}

function RFC_Connection($Login)
{
$this->rfc = saprfc_open($Login);

   IF ( !$this->rfc )
   {
       ECHO "The connection fails with the following error:".saprfc_error();
       EXIT;
   }
   else
   {
       return $this->rfc;
   }
}
}

?>

process.php

<?php
session_start();
header("Content-type: text/vnd.wap.wml");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
echo ("<?xml version='1.0'?>");
?>
<?php
require_once("Login_Class.php");
?>

<?php
if(!isset($_SESSION["Server"]))
{
$_SESSION["Server"] = $_POST["Server"];
$_SESSION["Sysnum"] = $_POST["Sysnum"];
$_SESSION["Client"] = $_POST["Client"];
$_SESSION["User"] = $_POST["User"];
$_SESSION["Pass"] = $_POST["Password"];
}
$Login = new Login();
$Log_Me =  $Login->Log_In($_SESSION["Server"],$_SESSION["Sysnum"],$_SESSION["Client"],
                          $_SESSION["User"],$_SESSION["Pass"]);
$RFC_Me = $Login->RFC_Connection($Log_Me);
?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="choose" title="SE16" ordered="false">
<p>
Table:<input name="Table" size="20"/><br/>
</p>
<do type="accept" label="OK" optional="false">
<go href="Show_Table.php" method="post">
<postfield name="Table" value="$Table"/>
</go>
</do>
</card>
</wml>

Show_Table.php

<?php
session_start();
require_once("SE16.php");
require_once("Login_CLass.php");

if(isset($_POST["Table"]))
{
$Table = $_POST["Table"];
$Login = new Login();
$Log_Me =  $Login->Log_In($_SESSION["Server"],$_SESSION["Sysnum"],$_SESSION["Client"],
                          $_SESSION["User"],$_SESSION["Pass"]);
$RFC_Me = $Login->RFC_Connection($Log_Me);
$SE16 = new SE16();
$SE16->Show_Table($Table,$RFC_Me);
}
?>

SE16.php

<?php
header("Content-type: text/vnd.wap.wml");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
echo ("<?xml version='1.0'?>");
?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">

<?php

Class SE16
{
var $fce;

function Show_Table($Table,$RFC_Me)
{

   $this->fce = saprfc_function_discover($RFC_Me, "RFC_READ_TABLE");
   IF (! $this->fce )
   {
       ECHO "The function module had failed.";
       EXIT;
   }

   $Table = STRTOUPPER($Table);

   saprfc_import ($this->fce,"QUERY_TABLE",$Table);
   saprfc_import ($this->fce,"DELIMITER","/");
   saprfc_table_init ($this->fce,"OPTIONS");
   saprfc_table_init ($this->fce,"FIELDS");
   saprfc_table_init ($this->fce,"DATA");

   $rfc_rc = "";

   $rfc_rc = saprfc_call_and_receive ($this->fce);
   if ($rfc_rc != SAPRFC_OK)
   {
       if ($rfc == SAPRFC_EXCEPTION )
           echo ("Exception raised: ".saprfc_exception($this->fce));
       else
           echo ("Call error: ".saprfc_error($this->fce));
       exit;
   }

   $data_row = saprfc_table_rows ($this->fce,"DATA");
   $field_row = saprfc_table_rows ($this->fce,"FIELDS");

   ECHO "<wml>";
   ECHO "<card id='SE16' title='' ordered='false'>";
   ECHO "<p>";
   ECHO "<table columns='$field_row' title='$Table'>";
   ECHO "<tr>";
   for($i=1; $i<=$field_row ; $i++)
   {
   $FIELDS = saprfc_table_read ($this->fce,"FIELDS",$i);   
   ECHO "<td><b>";
   ECHO $FIELDS['FIELDNAME'];
   ECHO "</b></td>";
   }
   ECHO "</tr>";
   for($i=1; $i<=$data_row ; $i++)
   {
   ECHO "<tr>";
   $DATA = saprfc_table_read ($this->fce,"DATA",$i);
   $TEST = SPLIT("/",$DATA['WA']);
     for($j=0; $j<$field_row; $j++)
     {
     ECHO "<td>";
     ECHO $TEST[$j];
     ECHO "</td>";
     }
   ECHO "</tr>";
   }  
   ECHO "</table>";
   ECHO "</p>";
   ECHO "</card>";
   ECHO "</wml>";
}
}

?>

Ahora, podemos ver algunas imágenes...

SE16_WAP_Login

SE16_WAP_Table

SE16_WAP_Show

Inclusive, podemos utilizar el navegador Opera para poder ver mejor el output de la tabla.

SE16_WAP_Show_Opera

Espero que le haya gustado.

Saludos,

Blag.

 

Technorati Tags:

1 comment:

Unknown said...

Hola Alvaro, que problema tuviste con J2ME y JCO??? Quizá te pueda ayudar, espero tu post sobre ese proyecto...