RFC - mocná zbraň pro přístup do systému SAP

Téma: SAP | Autor: Karel Korous | Vydáno: 03. 01. 2011 | 8245 přečtení

Na téma informačního systému SAP bylo napsáno pozitivního i negativního ledacos, ale jedna skvělá věc se mu nedá upřít. Rozhraní pro volání funkčních modulů SAPu RFC (Remote Function Call). Existuje i knihovna pro jazyk PHP (saprfc.dll), která nám umožní přímý přístup k funkčním modulům SAPu a vytvářet tak webové aplikace mimo SAP.

Funkční moduly poskytují poměrně širokou variabilitu. Lze používat funkční moduly dodávané SAPem (tzv. BAPI) nebo lze tvořit i vlastní, což v některých případech může být i výhoda.

Pojďme si zkusit napsat jednoduchý export dat standardních cen ze SAPu pro php.

Nejdříve si stáhneme knihovnu saprfc.dll a povolíme v php.ini (extensions), dále je pak potřeba třída saprfc.php umístěná do adresáře se skripty.

Nejprve založíme v transakci SE37 (Function builder) nový funkční modul (FM). Nazveme ho např. ZMBEW (exportovaná tabulka s cenami má název MBEW).

Založení funkčního modulu (FM) SE37

 

Přidáme název a přiřadíme do skupiny funkcí (pokud nemáme musíme založit)

Založení funkčního modulu (FM) SE37 označení

 

V záložce "Vlastnosti" je důležité pole "Modul schopný remote", které umožní, že FM budeme schopni volat externě z PHP.

Založení funkčního modulu (FM) SE37 vlastnosti

 

Na záložce "Import" musíme nadefinovat vstupní parametry FM, v našem případě je to jedna proměnná ZBWKEY. Je vhodné typizovat proměnnou podle stávajícího datového typu v SAPu (v krátkém textu se objeví popis). Je možné navolit i svůj datový typ v tomto případě by to bylo CHAR4. Navrhovaná hodnota je nepovinná, bude se automaticky doplňovat při volání FM.

Založení funkčního modulu (FM) SE37 import

 

Stejný význam má i záložka "Export", ale tu teď potřebovat nebudeme.

V záložce tabulky lze přenášet data jak do, tak ze SAPu. My ji použijeme  pro získání dat ze SAPu.

I zde je typizace podle existující tabulky v SAPu. Když neexistuje námi požadovaná referenční  tabulka v SAPu, musíme si ji založit v transakci SE11. My použijeme SAPovou strukturu tabulky MBEW. Všimněte si, že u tabulek je použitá typizace LIKE na rozdíl od záložek Import/Export, kde používáme TYPE.

Založení funkčního modulu (FM) SE37 tabulky - tables

 

Teď máme ošetřen vstup a výstup a teď k samotnému programu - Záložka "Zdrojový text".

Provádíme jednoduchý select se vstupním kritériem ZBWKEY - což je v tomto případě okruh ocenění (v praxi bývá společný se závodem) do tabulky rozhraní - ZMBEW. Funkci lze samozřejmě otestovat v prostředí SAPu, F8.

FUNCTION ZMBEW.
*"----------------------------------------------------------------------
*"*"Lokální rozhraní:
*"  IMPORTING
*"     VALUE(ZWERKS) TYPE  WERKS DEFAULT 1315
*"  TABLES
*"      ZMBEW STRUCTURE  MBEW
*"----------------------------------------------------------------------
TABLES: MBEW.

SELECT * INTO CORRESPONDING FIELDS OF TABLE ZMBEW
FROM MBEW
WHERE BWKEY EQ ZBWKEY.

ENDFUNCTION.

 

Teď konečně můžeme otestovat funkci z PHP.

Volání se provádí přes třídu saprfc. Základní parametry jsou celkem jasné jako IP adresa systému, číslo systému, jméno a heslo. Případně lze zapnout  zobrazení chyb nebo debugging. V nastavení uživatele, kterým se přihlašujeme so SAPu musí mít ve svém uživatelském profilu SU01 povolenu volbu RFC.

Všechny hodnoty se předávají přes parametry IMPORT, EXPORT, TABLES (lze použít jak pro import i export).

require_once ("saprfc.php");			// načtení třídy pro import-export ze SAP

define("ASHOST","10.0.0.1");               // IP adresa serveru SAP
define("SYSNR","01");                      // číslo systému
define("CLIENT","010");                    // číslo klienta
define("USER","RFC_USER");                 // uživatel SAP
define("PASSWD","heslo");                  // heslo SAP
			
$sap = new saprfc(array("logindata"=>array
		("ASHOST"=>ASHOST,      // IP adresa serveru SAP
		 "SYSNR"=>SYSNR,        // číslo systému
		 "CLIENT"=>CLIENT,      // číslo klienta
		 "USER"=>USER,          // uživatel SAP
		 "PASSWD"=>PASSWD),     // heslo SAP
		 "show_errors"=>true,   // zobrazit chyby true/false
		 "debug"=>false)) ;     // zobrazit debugovací informace true/false

/***************** Volání RFC funkce ********************/																	
$result=$sap->callFunction("ZMBEW", 
		array(	array("IMPORT","ZBWKEY","1310" ),  //záložka import
				array("TABLE","ZMBEW",array())	   //záložka tabulky
			));	 
$i=0;
	
if ($sap->getStatus() == SAPRFC_OK)	{	
	foreach ($result["ZMBEW"] as $zmbew) {	 
		while(list($key, $value) = each($zmbew)) 
			echo $key, $value;		   //Zobrazení pole
		$i++;
		}
	}
	else {
		echo "Chyba při volání RFC funkce systému SAP";
	}
	
echo "Počet záznamů: ".$i;
									

Lze samozřejmě použít i vestavěné BAPI funkce přímo od SAPu, výhodou je, že jsou odladěné a nemusí se hledat všemožné záludnosti, ale v některých případech se vyplatí napsat funkci vlastní, hlavně z výkonnostních důvodů, když chceme optimalizovat rychlost provedení nebo používáme svoji vlastní nadstavbu v SAPu.

NAVRCHOLU.cz