首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP的SAPRFC

使用PHP的SAPRFC
EN

Stack Overflow用户
提问于 2017-03-09 05:38:34
回答 1查看 6.3K关注 0票数 0

我正在工作一个项目,将允许上传到SAP使用PHP。

我用了密码:

//调用-函数

代码语言:javascript
复制
$parameters = array(

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

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

我想显示表的内容,但正在收到导入参数的错误消息。有人能帮我解决这个问题吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-01-30 10:12:52

您似乎使用这个-- https://github.com/sensational/php-saprfc/blob/php7/saprfc.php - php callFunction实现来调用用户定义的函数ZMM_ ( SAP函数位于Z_命名空间中,由您自己在SAP中实现),因为ZMM_在系统中是不存在的,并且所有现有的ZMM*都不是远程启用的),它在SAP上保存了一个表。

  1. 您是否远程启用了您自己在SAP中构建的函数(例如,pic1 RFC_READ_TABLE中显示的函数)?如果没有,则不能与SAP rfcsdk一起工作。

  1. 如果是-你的参数不可能是对的。这是在SAP框架内对现有rfc函数的一个典型调用,您!似乎!(我只能猜测,因为您没有解释它)使用。

P.S.:如果你不为E.Koucky的saprfc 1.4.1扩展dll使用php框架(你!!看起来!)您可以使用直接调用,这意味着在编译的extensionphp_functions中直接调用。我用*指示了直拨电话。你可以直接这样打:

代码语言:javascript
复制
 ...
                            // 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"]);
    ...

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

可以通过以下方法获取直接可调用的扩展函数

代码语言:javascript
复制
$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>";
}

然后你就会得到这个结果

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

代码语言:javascript
复制
$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);

结果是:

如果您需要unicode支持,例如德语等,可以在这里插入以下内容:

代码语言:javascript
复制
$rfc = saprfc_open ($LOGIN);
// enabling the same codepage as SAPGUI - unicode - for  ö,ü,ä etc.
saprfc_set_code_page ($rfc,"4110");

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

代码语言:javascript
复制
$rfc->SetCodePage("4110");

向Axel Arnold Bangert问好

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42687572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档