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; } } ?>