Skip to Content
Within this weblog I would like to share my first successful attempt to put SAP and PHP working together using SAPRFC.

It is assumed that a properly configured environment (i.e. Apache, MySQL, PHP and SAPRFC) is available. By the way, the one I am working with is composed by: Apache 2.0.50, MySQL 4.0.15, PHP 4.3.8, SAPRFC 1.4-5.0.4, on a MS Windows XP machine. SAP system is release 4.6B.

Let first address the question I was facing, a good excuse to start experimenting a SAP connection from PHP: I needed to make a search among SD sales orders header texts to find out those dealing with a particular customer specification.

In system customizing, header texts appear in the sales order like this:

header texts

while their determination sequence is as follows:

text determination sequence

Needing to look inside the ‘Additional specification’ text above, a SAP Remote Function Call is available: RFC_READ_TEXT.

Testing it under SE37, the following appears:

remote function call RFC_READ_TEXT

Just supplying info about mandant (100), TDOBJECT (VBBK), TDNAME (sales orders number), TDID (Z003) and TDSPRAS (EN), we will get a properly filled-in TDLINE by return.

RFC entries

As far as the MySQL part is concerned, a simple database has been created with two tables, as follows:

database ‘sap’
table ‘sap_import’

table ‘sap_export’

Table ‘sap_import’ is collecting all sales orders numbers that shall be passed to the RFC, while table ‘sap_export’ will receive the relevant texts.

Now, let’s talk about the PHP script: we are going to connect to SAP using SAPRFC extension for PHP, telling it we want to use RFC_READ_TEXT.

We will then supply the RFC with input data (sales orders are read from MySQL table ‘sap_import’).

After calling the RFC, returned data are inserted in the ‘sap_export’ table. Here is the script (rfc_read_text.php):

SAPRFC-Class: Get Sales Orders Header Texts from SAP-System

change it acc. to your settings $login = array ( “ASHOST”=>””, // your host address here “SYSNR”=>”00”, “CLIENT”=>”100”, “USER”=>”CIOTOLA”, // your username here “PASSWD”=>””, // your logon password here “LANG”=>”EN”, “CODEPAGE”=>”1100”); $rfc = saprfc_open ($login ); if (! $rfc ) { echo “RFC connection failed”; exit; } //Discover interface for function module RFC_READ_TEXT $fce = saprfc_function_discover($rfc,”RFC_READ_TEXT”); if (! $fce ) { echo “Discovering interface of function module failed”; exit; } //Set import parameters. You can use function saprfc_optional() to mark parameter as optional. //Fill internal tables saprfc_table_init ($fce,”MESSAGES”); saprfc_table_init ($fce,”OBJECTLINKS”); saprfc_table_init ($fce,”TEXT_LINES”); $sql = “SELECT import_tdname FROM sap_import ORDER BY import_tdname”; $qry = mysql_query($sql) or die(“Problem with the query: “.$sql); while($row = mysql_fetch_array($qry)){ $order_nr = $row[‘import_tdname’]; saprfc_table_append ($fce,”TEXT_LINES”, array (“MANDT”=>”100″,”TDOBJECT”=>”VBBK”,”TDNAME”=>$order_nr,”TDID”=>”Z003″,”TDSPRAS”=>”EN”,”COUNTER”=>””,”TDFORMAT”=>””,”TDLINE”=>””)); } //Do RFC call of function RFC_READ_TEXT, for handling exceptions use saprfc_exception() $rfc_rc = saprfc_call_and_receive ($fce); if ($rfc_rc != SAPRFC_OK) { if ($rfc == SAPRFC_EXCEPTION ) echo (“Exception raised: “.saprfc_exception($fce)); else echo (saprfc_error($fce)); exit; } $rows = saprfc_table_rows ($fce,”TEXT_LINES”); for ($i=1;$i<=$rows;$i++) $TEXT_LINES[] = saprfc_table_read ($fce,”TEXT_LINES”,$i); //Debug info // saprfc_function_debug_info($fce); saprfc_function_free($fce); saprfc_close($rfc); $qry = “TRUNCATE TABLE sap_export”; mysql_query($qry) or die(“Problem with the query: “.$qry); $insert_head = “INSERT INTO sap_export (export_tdname, export_tdline) VALUES “; ?> “; $insert_body .= “(‘$tdname’, ‘$tdline’), “; } $insert .= $insert_head.substr($insert_body, 0, strlen($insert_body)- 2); mysql_query($insert) or die(‘Error performing query.
‘ . $insert . ‘
‘ . mysql_error()); ?>

Run successful OK. OK.
“. $tdname.” “.$tdline.” “.”

As for the config.php script included in the code above, it is just the connection to the MySQL database, something like this:

Running the main script, the result will be shown on the screen (see screenshot below) and inserted into the MySQL table sap_export.

With this data available, we are able to build whatever kind of searches or reporting we need.


This is a very simple but effective example about reading SAP data via a remote function call from an open source environment.

To report this post you need to login first.

1 Comment

You must be Logged on to comment or reply to a post.

  1. Jan Nemec
    I have the problem to connect to test system on another server – connected via SAPRoute
    where to specify it in login params? I tried to google, to test, but I am in my wits end …

Leave a Reply