// For easy checking of BAPI-type values
if (!defined("SAPRFC_OK")) define("SAPRFC_OK",0);
if (!defined("SAPRFC_ERROR")) define("SAPRFC_ERROR",1);
if (!defined("SAPRFC_APPL_ERROR")) define ("SAPRFC_APPL_ERROR",2);
class saprfc {
var $logindata;
var $rfc_conn;
var $func_id;
var $show_status_flag;
var $check_bapi_errors;
var $status;
var $status_infos;
var $debug;
var $call_function_result;
var $system ;
var $mysqlconfig ;
var $mysqldb ;
function saprfc($system = 'D' , $TESTRUN = 'X') {
$this->system = $system ;
$this->TESTRUN = $TESTRUN ;
$this->rfc_conn=false;
$this->func_id=false;
$this->show_status_flag=isset($config["show_errors"]) ? $config["show_errors"] : true;
$this->check_bapi_errors=isset($config["check_bapi_errors"]) ? $config["check_bapi_errors"] : false;
$this->status="";
$this->status_infos="";
$this->debug=0 ;
$this->call_function_result=false; // Result of the last executed sapaccess-call_function()
$this->setLogin();
$this->login();
$this->mysqlconfig = new Zend_Config(
array(
'database' => array(
'adapter' => 'Mysqli',
'params' => array(
'host' => 'localhost',
'dbname' => 'newsap',
'username' => 'root',
'password' => 'metropolis',
)
)
)
);
$this->mysqldb = Zend_Db::factory($this->mysqlconfig->database);
$this->mysqldb->setFetchMode(Zend_Db::FETCH_ASSOC);
}
function setLogin()
{
if ($this->system == 'P')
{
$this->logindata = array ("ASHOST"=>"192.168.23.28",
"SYSNR"=>"00",
"CLIENT"=>"100",
"USER"=>"coreteam",
"PASSWD"=>"Vision2017",
"CODEPAGE"=>"1404");
}
else
{
echo "CONNECTION ERROR" ;
exit ;
}
}
function setLoginData($logindata) {
$this->logindata=$logindata;
}
// TODO: currently only login with logindata allowed
// that means you have to set logindata for the class on creation
// maybe we can use setcookie ("SAPRFC_LOGON", urlencode(serialize($this->logindata)),time()+7200);
function login()
{
if (!$this->rfc_conn)
{
$this->rfc_conn=@saprfc_open($this->logindata);
if (!$this->rfc_conn) {
return $this->setStatus(SAPRFC_ERROR,"saprfc::login()\nOpen RFC connection with saprfc_open() failed with error:\n".@saprfc_error());
}
}
return SAPRFC_OK;
}
// Close RFC_Connection
function logoff()
{
if ($this->rfc_conn)
{
@saprfc_close($this->rfc_conn);
}
}
// set Status and optionally show Errors
function setStatus($status,$status_infos)
{
$this->status=$status;
$this->status_infos=$status_infos;
if ($this->show_status_flag &&
$this->status!=SAPRFC_OK ) {
$this->printStatus();
}
return $this->status;
}
// Checks if last Call succeded
function getStatus()
{
return $this->status;
}
// Returns actual Status/Error
function getStatusText()
{
$statustext="";
switch ($this->status) {
case SAPRFC_OK:
$statustext=$this->status_infos;
break;
case SAPRFC_APPL_ERROR:
$statustext=$this->status_infos["TYPE"]." ".$this->status_infos["ID"]."-".$this->status_infos["NUMBER"].": ".$this->status_infos["MESSAGE"];
break;
case SAPRFC_ERROR:
$statustext=$this->status_infos;
break;
}
return $statustext;
}
// Returns actual Status/Error
function getStatusTextLong()
{
$statustext="";
switch ($this->status) {
case SAPRFC_OK:
$statustext.="
";
$statustext.="No errors detected.";
$statustext.="
";
$statustext.="
".$this->getStatusText()."";
$statustext.="
";
break;
case SAPRFC_APPL_ERROR:
$statustext.="
";
$statustext.="Application-Errors found during BAPI-Calls:";
$statustext.="
";
$statustext.="
".$this->getStatusText()."";
$statustext.="
";
break;
case SAPRFC_ERROR:
$statustext.="
";
$statustext.="Errors found during saprfc-Calls:";
$statustext.="
";
$statustext.="
".$this->getStatusText()."";
$statustext.="
";
break;
}
return $statustext;
}
function printStatus()
{
echo $this->getStatusTextLong();
}
// Call RFC-Function in SAP
function callFunction($func_name="",$parameters)
{
/* typical call:
$result=$saprfc->call_function("RFC_SYSTEM_INFO",
array( array("EXPORT","SYSTEM","MBS")
array("IMPORT","CODEPAGE")
array("IMPORT","DBNAME")
array("TABLE","APPLLIST",array())
)
);
*/
// Initialize Variables
$result_data=array();
$this->call_function_result=false;
// Check SAPRFC-Installation
if (! extension_loaded ("saprfc")) {
return $this->setStatus(SAPRFC_ERROR,"saprfc::callFunction()\n SAPRFC-Extension.dll not loaded.");
}
// Validate given data
if (empty($func_name)) {
return $this->setStatus(SAPRFC_ERROR,"saprfc::callFunction():\n No Function-Name given");
}
// Move Parameters to local Arrays
$func_params_import=array();
$func_params_tables=array();
$func_params_export=array();
foreach ($parameters as $key => $param) {
$type=$param[0];
$name=$param[1];
$value=isset($param[2])?$param[2]:"";
switch ($type) {
case "IMPORT":
$func_params_import[$name]=$value;
break;
case "EXPORT":
$func_params_export[$name]="";
break;
case "TABLE":
$func_params_tables[$name]=$value;
if (!is_array($value)) {
return $this->setStatus(SAPRFC_ERROR,"saprfc::callFunction()\n Wrong Parameter-Value for Table-Parameter ".$name.". We expected an Array.");
}
break;
default:
return $this->setStatus(SAPRFC_ERROR,"saprfc::callFunction()\n Wrong Parameter-Type '".$type."'. Must be IMPORT, EXPORT or TABLE.");
}
}
// Do Login (only done in method login(), if necessary)
if ($this->login()==SAPRFC_ERROR) {
return $this->getStatus();
}
// Discover Function in SAP
$this->func_id=@saprfc_function_discover($this->rfc_conn,$func_name);
if (!$this->func_id) {
return $this->setStatus(SAPRFC_ERROR,"saprfc::callFunction()\n Function module '".$func_name."' seems not to exist. function saprfc_function_discover() failed.");
}
// Set Import-Parameters
foreach ($func_params_import as $name => $value) {
$rc=@saprfc_import($this->func_id,$name,$value);
if (empty($rc)) {
return $this->setStatus(SAPRFC_ERROR,"saprfc::callFunction('".$func_name."')\n Import-Parameter=".$name. " could not be set. (Does it exist?)");
}
}
// Set Table-Parameters (importing-values)
foreach ($func_params_tables as $name => $value) {
$rc=@saprfc_table_init($this->func_id,$name);
if (empty($rc)) {
return $this->setStatus(SAPRFC_ERROR,"saprfc::callFunction('".$func_name."')\n Table-Parameter=".$name. " could not be set. (Does it exist?)");
}
foreach ($value as $key => $data) {
@saprfc_table_append($this->func_id,$name,$data);
}
}
// Execute Function
$result = @saprfc_call_and_receive ($this->func_id);
if ($result != SAPRFC_OK)
{
if ($result == SAPRFC_EXCEPTION ) {
return $this->setStatus(SAPRFC_ERROR,"saprfc::callFunction('".$func_name."')\n saprfc_call_and_receive(): Exception raised: ".@saprfc_exception($this->func_id));
} else {
return $this->setStatus(SAPRFC_ERROR,"saprfc::callFunction('".$func_name."')\n saprfc_call_and_receive(): Call error: ".@saprfc_error($this->func_id));
}
}
// Get Exporting-Parameters
foreach ($func_params_export as $name =>$value) {
$rc=@saprfc_export($this->func_id,$name);
// if (empty($rc)) { // llaegner removed (Reason: when export returns the -good- value "0", then empty also evaluates to true (thanks Alexander Gouriev)
if (!isset($rc)) {
return $this->setStatus(SAPRFC_ERROR,"saprfc::callFunction('".$func_name."')\n Export-Parameter=".$name. " could not be set (Does it exist?)".@saprfc_error($this->func_id));
} else {
$result_data[$name]=$rc;
}
}
// Get Table-Parameters
foreach ($func_params_tables as $name => $content) {
// Ausgabe-Tabelle initialisieren
$result_data[$name]=array();
$rows=@saprfc_table_rows($this->func_id,$name);
for ($i=1; $i<=$rows; $i++)
{
$result_data[$name][$i]=@saprfc_table_read ($this->func_id,$name,$i);
}
}
// Save function-call result for later analysis
$this->call_function_result=$result_data;
// Echo Debug-Information, if flagged
if ($this->debug)
@saprfc_function_debug_info($this->func_id);
// Falls es ein BAPI-Aufruf ist, Fehler raussuchen
if ($this->check_bapi_errors) {
$bapi_return=@saprfc_export($this->func_id,"RETURN");
if (isset($bapi_return) &&
is_array($bapi_return) &&
isset($bapi_return["MESSAGE"]) &&
$bapi_return["NUMBER"] != 0) {
// FINISH FUNCTION-CALL
$this->setStatus(SAPRFC_APPL_ERROR,$bapi_return);
return $result_data;
}
}
// Close Function-Execution and free results removed because it sometimes stops completly executing PHP!!
//@saprfc_function_free($this->func_id);
// FINISH FUNCTION-CALL
$this->setStatus(SAPRFC_OK,"call function '".$func_name."' successfull.");
return $result_data;
}
function ser_value($value) {
// if (is_null($value)) { return "N"; }
// elseif (is_bool($value)) { return $value ? "b:0":"b:1"; }
// elseif (is_integer($value)) { return "i:".$value; }
// else { return "s:".strlen($value).":\"".$value."\""; }
return "$value" ;
}
function serialize_data($array) {
$n = count($array);
$space = '' ;
for ($i=0 ; $i<=$n ; $i++)
{
$space .=" " ;
}
//$result = "a:".$n.":{";
$result = "$space\n";
$i = 1;
foreach ($array as $key => $value) {
$result .= $this->ser_value($key)."=>";
$result .= (is_array($value)) ? $this->serialize_data($value) : $this->ser_value($value) ;
$result .= "$space\n" ;
}
return $result;
}
}
?>