SAPRFC使用PHP

时间:2017-03-09 05:38:34

标签: php saprfc

我正在开发一个允许使用PHP上传到SAP的项目。

我使用了代码:

//呼叫功能

$parameters = array(

    array("IMPORT", "ZMM_", "*"),
    //array("EXPORT", "*", array()),
    array("TABLE", "IMT_", array())
  );

$result = $sap->callFunction('ZMM_', $parameters);

我想显示表的内容但是收到错误消息 导入参数。有谁可以帮我解决这个问题?

由于

1 个答案:

答案 0 :(得分:4)

似乎你使用这个 - https://github.com/sensational/php-saprfc/blob/php7/saprfc.php - php callFunction实现来调用用户定义的函数ZMM _ (一个位于Z_命名空间中的SAP函数,你在SAP自己 - 对于ZMM_,标准上不存在于系统中并且所有现有的ZMM *都不是远程启用的),它在SAP上通过SAP rfcsdk保存表。 not!!! remote enabled

  1. 您是否远程启用了您自己在SAP中构建的此功能(例如,pic1 RFC_READ_TABLE中显示的功能)?如果不是,它无法与SAP rfcsdk一起使用 rfc remote enabled

  2. 如果是 - 您的参数不正确。这是一个例子,用于在该框架内对SAP中现有的rfc函数进行实际调用,你似乎!!(我只能猜它,因为你不解释它)来使用。

  3. P.S .: 如果你不使用PHP框架来管理E. Koucky的saprfc 1.4.1扩展dll(你似乎!!使用),你可以使用直接调用,这意味着在编译中直接调用分机[php_functions]。我用**** ...... ****表示了直接电话。你可以直接打电话:

     ...
                                // router string 
     $LOGIN = array ("ASHOST"=>"/H/xx.xx.xx.com/S/port/W/xx/H/localhost",   
                   "SYSNR"   =>"00",
                   "CLIENT"  =>"800",
                   "USER"    =>"xxxxxxxx",
                   "PASSWD"  =>"xxxxxxxx",  
                   "LANG"    =>"E");
        ...
        $table="T100";
        $criteria="SPRSL EQ 'E' AND TEXT GE 'Must e' AND TEXT LT 'N'";
        $options=array("TEXT"=>$criteria);
        ...
        $rfc = ****saprfc_open**** ($LOGIN);
        $fce = ****saprfc_function_discover****($rfc,"RFC_READ_TABLE"); 
        ...
        // set import parameters 
        saprfc_import ($fce,"DELIMITER","*");
        saprfc_import ($fce,"NO_DATA","");
        saprfc_import ($fce,"QUERY_TABLE",$table);
        saprfc_import ($fce,"ROWCOUNT","");
        saprfc_import ($fce,"ROWSKIPS","");
    
        saprfc_table_init ($fce,"FIELDS");
        saprfc_table_init ($fce,"OPTIONS");
        saprfc_table_init ($fce,"DATA");
        // options look at the top -> $criteria
        ****saprfc_table_append**** ($fce,"OPTIONS", $options); 
        ...
         for($i=1; $i<=$data_row;$i++)
            {
                $DATA[$i] = ****saprfc_table_read**** ($fce,"DATA",$i);
                $ex = explode("*",$DATA[$i]["WA"]);
        ...
    

    你可以在这里找到一个工作的saprfc扩展名为php-7.1.11-nts-x32和SAPGUI 7.4(rfcsdk 7.4) https://sourceforge.net/projects/saprfcsdk/files/PHP%207.1.11%20NTS%20VC14%20%20SAP%20GUI%207.4%20-%20x32%20%20NUC/

    您可以使用

    获取可直接调用的扩展函数
    $extensions= get_loaded_extensions();
    $functions=array();
    
    foreach($extensions as $ext) 
    {
        if($ext=="saprfc-gimba")
        {
            echo "<font size='4' color='green'>".$ext."</font><font size='2' color='green'> ist geladen<br></font>";
            echo "<font size='1' color='green'>vorhandene Funktionen:<br></font>";
            $functions =  get_extension_funcs($ext);
        }
    }
    foreach($functions as $text) 
    {
        echo "<font size='1' color='green'>$text<br></font>";
    }
    

    然后你得到了那个结果 directly callable php saprfc extension functions

    这里有一个表TFDIR的表查询,它返回系统中的所有RFC_ *函数。如果设置FMODE EQ'R',您将获得可远程调用的系统的所有功能。

    $table="TFDIR";
        $criteria="FUNCNAME GE 'RFC_' AND FUNCNAME LT 'RFC_ZZZZ'";
        $options=array("TEXT"=>$criteria);
    
        $LOGIN = array ("ASHOST"=>"/H/sapx.x.x.com/S/port/W/x/H/localhost",
                   "SYSNR" =>"00",
                   "CLIENT"=>"800",
                   "USER"  =>"xxx",    
                   "PASSWD"=>"xxx",     
                   "LANG"  =>"E");
        $rfc = saprfc_open ($LOGIN);
        $fce = saprfc_function_discover($rfc,"RFC_READ_TABLE");
        if (! $fce )
        {
            echo "Discovering interface of function module failed";
            exit;
        }
        saprfc_import ($fce,"DELIMITER","*");
        saprfc_import ($fce,"NO_DATA","");
        saprfc_import ($fce,"QUERY_TABLE",$table);
        saprfc_import ($fce,"ROWCOUNT","");
        saprfc_import ($fce,"ROWSKIPS","");
        saprfc_table_init ($fce,"FIELDS");
        saprfc_table_init ($fce,"OPTIONS");
        saprfc_table_init ($fce,"DATA");
        saprfc_table_append ($fce,"OPTIONS", $options); 
        $rc = saprfc_call_and_receive ($fce);
        if ($rc != SAPRFC_OK)
        {
            if ($rfc == SAPRFC_EXCEPTION )
            {
                echo ("Exception raised: ".saprfc_exception($fce));
            }
            else
            {
                echo ("Call error: ".saprfc_error($fce));
            }
            exit;
        }
        $data_row = saprfc_table_rows ($fce,"DATA");
        $field_row = saprfc_table_rows ($fce,"FIELDS");
        echo "<div align='center'><p style='font-size:22px;color:midnightblue'>SAP - QUERY TABLE - TFDIR - PHP 7.1.11</p>".
             "<table><tr bgcolor='#dddddd' style='font-size:15px; color:midnightblue;'>".
             "<td>FUNCNAME</td><td>PNAME</td><td>INCLUDE</td><td>FREEDATE</td><td>APPL</td><td>MAND</td><td>FMODE</td><td>HOST</td><td>U_TASK</td><td>PNAME_MAIN</td><td>STEXT</td>";
        for($i=1; $i<=$data_row;$i++)
        {
            $DATA[$i] = saprfc_table_read ($fce,"DATA",$i);
            $ex = explode("*",$DATA[$i]["WA"]);
            echo "<tr style='font-size:12px;'>";
            for ($n=0;$n<=sizeof($ex);$n++)                         
            {
                if($ex[$n] != '')
                {
                    echo "<td id=".$i."_".$n.">".$ex[$n]."</td>";
                }
                if(sizeof($ex) == 4 && $n==3)
                {
                    echo "<td id=".$i."_".$n.">&nbsp;</td>";
                    echo "<td id=".$i."_".$n.">&nbsp;</td>";
                    echo "<td id=".$i."_".$n.">&nbsp;</td>";
                }
            }
            echo "</tr>";
        }
        echo "</table></div>";
        //saprfc_function_debug_info($fce);
        saprfc_function_free($fce);
        saprfc_close($rfc);
    

    结果是: all RFC_* functions

    如果您需要unicode支持,例如德语等,请在此处插入:

    $rfc = saprfc_open ($LOGIN);
    // enabling the same codepage as SAPGUI - unicode - for  ö,ü,ä etc.
    saprfc_set_code_page ($rfc,"4110");
    

    或者如果您使用E. Koucky框架:

    $rfc->SetCodePage("4110");
    

    祝你好运 Axel Arnold Bangert