公司剛上sap系統,由於資金有限,sap與其它系統的數據交換需要公司內部實現。於是,領導決定入庫申請流程需要在sap與OA系統里實現電子簽核流,重擔果然落到我的身上。好在我只負責OA,還一位同事負責sap。
OA是用PHP開發的,於是連接語言自然使用PHP。網上搜了下,發現php的saprfc擴展早在2005年就有了,不過雖然過了那么多年,擴展依然可用。
一、下載saprfc擴展並在php.ini啟用。訪問http://pan.baidu.com/s/1kVPemn9,下載saprfc1.4.1完整版,里面包含windows版php4.4、php5.2、php5.3 dll擴展文件,以及sapclasses文件夾下的接口類等。復制相應版本的php_saprfc_5xx.dll至php的擴展文件夾下,修改php配置文件php.ini,在dynamic extensions下面增加一行:extension=php_saprfc_5xx.dll.然后重啟httpd服務。網頁訪問phpinfo(),出現以下信息,表示php saprfc擴展安裝成功。
二、安裝sap客戶端並根據saprfc1.4.1完整版里的example_userlist.php測試與sap服務器的連接。saprfc本質上是模擬sapGUI登錄。所以需要安裝rfcsdk才能實現連接。為簡化操作,直接安裝sapGUI客戶端,則rfcsdk也安裝完成。同理,若是linux版的php,需安裝Non-Unicode SAP RFCSDK 6.40,不過似乎這個東西不好找。然后修改example_userlist.php里的logindata參數為本公司的sap參數保存,例如
$sap = new saprfc(array( "logindata"=>array( "ASHOST"=>"yourhostip" // application server ,"SYSNR"=>"00" // system number ,"CLIENT"=>"800" // client ,"USER"=>"youruser" // user ,"PASSWD"=>"yourpwd" // password ,"CODEPAGE"=>"8300" //定義字符集,否則會中文亂碼
) ,"show_errors"=>false // let class printout errors ,"debug"=>false)) ; // detailed debugging information
網頁訪問http://xxxxxx/example_userlist.php,若出現以下信息,表示php與sap通信成功。
三、使用saprfc類連接sap。saprfc1.4.1完整版提供了一系列的類連接sap、調用函數、操作內表,以及創建服務接口等。
$params=array( "ASHOST"=>"appip" // application server ,"SYSNR"=>"00" // system number ,"CLIENT"=>"600" // client ,"USER"=>"account" // user ,"PASSWD"=>"pwd" // password //,"LANG"=>"ZH" ,"CODEPAGE"=>"6240" //8400 gbk code ); include_once("sapclasses/sap.class.php"); $sapConn=new SAPConnection(); $sapConn->Connect($params); // set conncet data array $sapConn->Open(); // set/get rfc handle $sapConn->rfc $sapFunc=new SAPFunction(); $sapFunc->Discover($sapConn->rfc,"Z_OA_SIGN");//set/get function handle $sapFunc->fce,z_oa_sign函數名 $para=array( array("EXPORT","TYP"),//默認情況下export參數不用定義,不過定義也沒關系 array("EXPORT","MSG"), array("IMPORT","ZOANUM",$oanum) ); //rfc函數輸入Import,輸出export參數定義 $sapFunc->DefVars($para); //DefVars方法在類里面並沒有,需要手動加入,代碼見下文。 $sapFunc->Call(); //echo $sapFunc->TYP; //echo $sapFunc->MSG; if($sapFunc->TYP=="S")echo "S"; //TYP、MSG為rfc函數的返回值 else echo $sapFunc->MSG; $sapFunc->Close(); $sapConn->Close();
SAPFunction類的DefVars方法:
function DefVars($parameters){ foreach ($parameters as $key => $param) { $type=$param[0]; $name=$param[1]; $value=isset($param[2])?$param[2]:""; switch ($type) { case "IMPORT": $this->$name=$value; break; case "EXPORT": $this->$name=""; break; default: return "saprfc::callFunction() Wrong Parameter-Type. Must be IMPORT, EXPORT or TABLE."; } } }
掌握了以上代碼后,估計使用php連接sap已不是什么難事了。
