Tuesday, January 8, 2013

SAP ABAP – PHP Connector dan RFC


Kali ini aye mau bahas Interface antara SAP dan PHP. Skenario Applikasinya gini, aye mau bikin semacem ESS untuk employee gunanya untuk employee bisa mengecek sisa cutinya masing-masing melalui WEB, sementara data nye ada di SAP ( background-nye ). Kurang lebih gambarannya gitu aje ye…. Gak usah yg gede-gede dulu nyang penting ketangkep malingnya…… maksudnye idenya. Sebenernya nyang kayak gini sih di SAP versi baru ( netweaver bo ) itu lebih mudah karena udeh ade java nye, atau bisa pake SOAP, atau SOA tapi nyang ini ni sekarang kita coba pake PHP connector karena gratis dan mudah.




Nyang kite butuhin sekarang sih ya mungkin :
  1. SAP, ya emang sebagai background system nya, semua data employee ada di sini, termasuk data cuti employee yang nanti kita butuhkan untuk coba disini ye.
  2. Application Server, nah nanti kite coba pake yang simple aje install aje XAMPP biar cepet ye.
  3. PHP udah include di nomor 2 diatas tuh kalo kite udah install.
  4. PHP Connector bisa di downloaddi google.

Nah kalo nyang kite butuhin udeh ade semua tinggal kita ikutin step-step nye ye, yuk kite mulai, start your engine, get set and …… goooo

Step 1 : Install Application server XAMPP nye, ikutin aje ye, aye anggap udah bisa lah cara install XAMPP ini. Nanti biasenye udan terinstall juga PHP nye disitu.

Step 2 : Taro deh PHP connector DLL nye di PHP server nye. Kalo pake PHP 5 biasenye ada di folder …\xampp\php\ext  kalo di php 4 biasenye ada di folder …\xampp\php\extentions

Step 3 : Edit file php.ini tambahin -> extension=php_saprfc.dll di bagian extention nye ye. Bisa di test Saprfc dll itu jalan ape enggak lewat phpinfo() tau kan ? Kalo keliatan ada berarti udah on tuh.


Step 4 : bikin folder working\cuti di htdocs

Step 5 : taro file saprfc.php di folder working\cuti itu ye (coba baca2 deh saprfc.php nye isinye ye)

Step 6 : bikin file Infocuti.php isinye kayak dibawah ini codingnye.

 <html>  
 <head>  
 </head>  
 <body>  
 <fieldset><legend>Absence Quota</legend>  
 <?  
 $zpernr = '';  
 echo "<form method='POST' action='getcuti.php'>  
 Employee Number : <input type='text' name='zpernr' value='$zpernr' size='8' Maxlength='8'>&nbsp&nbsp<input type='submit' name='submit' value='Submit'>  
 </form>";  
 ?>  
 </fieldset>  
 </body>  
 </html>  

Step 7 : Bikin lagi di folder tadi ye file getcuti.php nyang isi nye dibawah niii.

 <?php   
 include("infocuti.php");  
 require_once("saprfc.php");  
 $zpernr = $_POST["zpernr"];  
 ?>  
 <html>  
 <head>  
 </head>  
 <body>  
 <fieldset><legend>Information</legend>  
 <?  
 //Create Object to login SAP  
 $rfc = new saprfc(array(  
     "logindata"=>array(  
     "ASHOST"=>"10.9.99.11"    // application server  
     ,"SYSNR"=>"00"        // system number  
     ,"CLIENT"=>"805"       // client  
     ,"USER"=>"xuserx"      // user  
     ,"PASSWD"=>"xpasswordx"   // password  
              )  
     ,"show_errors"=>false      // let class printout errors  
     ,"debug"=>false)) ;        // detailed debugging information  
 if ( ! $rfc ){exit;}  
 //set date  
 list($d, $m, $y, ) = split('-', date("d-m-Y"));  
 $zdesta = $y."0101";  
 $zdeend = $y."1231";  
 $zdesta = "18000101";  
 $zdeend = "99991231";  
 // Call-Function  
 $result = $rfc->callFunction("Z_GET_ABSENCE_QUOTA",  
      array(array("IMPORT","ZPERNR","$zpernr"),  
         array("IMPORT","ZSUBTY","01"),  
         array("IMPORT","ZDEDDA","$zdesta"),  
         array("IMPORT","ZDEDEN","$zdeend"),  
         array("EXPORT","ZENAME",""),  
         array("TABLE" ,"ZP2006",array())  
                ));  
 // Call successfull?  
 if ($rfc->getStatus() == SAPRFC_OK) {  
   if ($result["ZENAME"]==''){  
     echo "Employee number not found, please verify...";  
     $rfc->logoff();  
     exit;  
   }  
  echo "<table><tr><td>Employee Number</td><td>:</td><td>",$zpernr,"</td></tr>";  
   echo "<tr><td>Name</td><td>:</td><td>",$result["ZENAME"],"</td></tr></table><br>";  
   ?>  
    <table border='1' bordercolorlight='#000000'>  
    <tr><th>Start</th><th>End</th><th>Deduction Start</th><th>Deduction End</th><th>Quota</th><th>Quota used</th></tr>  
   <?  
   echo "<caption>Quota : ",$zdesta," - ",$zdeend,"</caption>";  
   $zquota = 0;  
   $zused = 0;  
   $zn = 0;  
   foreach ($result["ZP2006"] as $detail) {  
     if ($zn==0){   
       echo "<tr CLASS='a'>"; $zn++; }  
     else{  
       echo "<tr CLASS='b'>"; $zn--; }  
     echo "<td>", $detail["BEGDA"],"</td>  
        <td>", $detail["ENDDA"],"</td>  
                                    <td>", $detail["DESTA"],"</td>  
        <td>", $detail["DEEND"],"</td>  
          <td align='right'>", $detail["ANZHL"]," day(s)</td>  
          <td align='right'>", $detail["KVERB"]," day(s)</td></tr>";  
     $zquota = $zquota + $detail["ANZHL"];  
     $zused = $zused + $detail["KVERB"];  
   }  
   echo "<tr><td colspan=4>Total</td><td align='right'>",$zquota," day(s)</td><td align='right'>",$zused," day(s)</td></tr>";  
   echo "<tr><td colspan=5>Balance</td><td align='right'>",$zquota-$zused," day(s)</td></tr>";  
   ?></table><?  
 } else {  
   // No, print long Version of last Error  
   $rfc->printStatus();  
   // or print your own error-message with the strings received from  
   //           $sap->getStatusText() or $sap->getStatusTextLong()  
 }  
 $rfc->logoff();  
 ?>  
 </fieldset>  
 </body></html>  

Step 8 : Untuk file getcuti.php perhatikan coding nye nyang bagian


  //Create Object to login SAP   
  $rfc = new saprfc(array(   
    "logindata"=>array(   
    "ASHOST"=>"10.9.99.11"  // application server   
    ,"SYSNR"=>"00"    // system number   
    ,"CLIENT"=>"805"    // client   
    ,"USER"=>"xuserx"   // user   
    ,"PASSWD"=>"xpasswordx"  // password   
        )   
    ,"show_errors"=>false   // let class printout errors   
    ,"debug"=>false)) ;    // detailed debugging information   

Harus di sesuaikan dengan login yang nantinye ente pake di SAP nye ye..

Step 9 : Kite bikin Coding RFC di SAP nye ye, lewat SE37 kita bikin function namenye Z_GET_ABSENCE_QUOTA.











































 FUNCTION Z_GET_ABSENCE_QUOTA.  
 *"----------------------------------------------------------------------  
 *"*"Local interface:  
 *" IMPORTING  
 *"   VALUE(ZPERNR) LIKE P2006-PERNR  
 *"   VALUE(ZSUBTY) LIKE P2006-SUBTY  
 *"   VALUE(ZDEDDA) LIKE P2006-DESTA  
 *"   VALUE(ZDEDEN) LIKE P2006-DEEND  
 *" EXPORTING  
 *"   VALUE(ZENAME) LIKE P0002-CNAME  
 *" TABLES  
 *"   ZP2006 STRUCTURE PA2006  
 *"----------------------------------------------------------------------  
 * Get Quota infty 2006  
   SELECT * FROM PA2006 INTO zp2006 WHERE PERNR eq zpernr  
              AND SUBTY eq zsubty  
              AND DESTA ge zdedda  
              AND DESTA le zdeden.  
 *             AND DEEND ge zdeden.  
   APPEND zp2006.  
   CLEAR zp2006.  
  ENDSELECT.  
 * Get Personnal Data Infty 0002  
  INFOTYPES: 0002.  
  CALL FUNCTION 'HR_READ_INFOTYPE'  
     EXPORTING  
       TCLAS   = 'A'  
       PERNR   = zpernr  
       INFTY   = '0002'  
       BEGDA   = zdedda  
       ENDDA   = zdeden  
     TABLES  
       INFTY_TAB = p0002.  
  READ TABLE p0002 INDEX 1.  
  ZENAME = p0002-CNAME.  
 ENDFUNCTION.  

Nanti tinggal di test kurang lebih hasilnye kayak gini. Kalo ade salah salah mohon di koreksi ye…. Namanya juga sama-sama belajar.




2 comments: