You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过PHP的SAPNWRFC连接写入数据?已实现读取功能

Troubleshooting Empty Values When Writing to SAP via php7-sapnwrfc

Hey there! 我知道你已经成功用php7-sapnwrfc读取SAP数据,但写入时SAP端只显示空值的问题确实让人头疼。结合你的环境(PHP 7.0.21、SAPNWRFC 1.1.2、SAP NW RFC SDK 7200.0.33、Windows IIS 2012),咱们可以从这几个方向排查:

1. 确认RFC参数的结构和命名完全匹配

SAP的RFC函数参数是严格区分大小写的(全大写),而且参数的类型(结构、内表、基本类型)必须在PHP数组里准确对应:

  • 如果调用的是BAPI(比如BAPI_MATERIAL_SAVEDATA这类),子结构的层级不能少,得完整嵌套数组对应SAP的结构字段。
  • 举个正确传递参数的例子:
$writeParams = [
    'MATERIAL' => 'TEST_MAT001', // 字段名必须和SAP RFC里的大写字段完全一致
    'PLANT' => '1000',
    // 结构类型的参数要嵌套数组对应SAP的结构
    'MATERIAL_DATA' => [
        'MATL_GROUP' => '01',
        'BASE_UOM' => 'EA'
    ]
];

2. 检查数据类型的兼容性,避免类型不匹配导致空值

SAP的数据类型和PHP原生类型差异不小,不匹配很容易让SAP接收为空:

  • NUMC类型:这种数字文本类型要补前导零到指定长度,比如长度为4的NUMC字段,值12得传'0012',不能直接传12
  • CHAR类型:如果字段有固定长度,要保证传入的字符串长度符合要求,太短的话SAP可能直接截断成空值。
  • 日期/时间类型:必须传入SAP标准格式的字符串,比如日期是'YYYYMMDD',时间是'HHMMSS'

3. 别忘了提交事务(针对需要提交的RFC/BAPI)

很多负责创建、修改数据的BAPI不会自动提交事务,必须单独调用BAPI_TRANSACTION_COMMIT才能完成写入操作:

// 先调用写入的BAPI
$writeResult = $sapConnection->invoke('BAPI_MATERIAL_SAVEDATA', $writeParams);

// 先检查BAPI返回的消息,没有错误再提交
if (empty($writeResult['RETURN']) || $writeResult['RETURN'][0]['TYPE'] !== 'E') {
    $sapConnection->invoke('BAPI_TRANSACTION_COMMIT', ['WAIT' => 'X']);
} else {
    // 有错误就回滚
    $sapConnection->invoke('BAPI_TRANSACTION_ROLLBACK');
    echo "写入失败:" . $writeResult['RETURN'][0]['MESSAGE'];
}

4. 开启RFC跟踪,查看实际传递给SAP的参数

你可以开启SAP NW RFC SDK的跟踪功能,直接确认传递给SAP的参数是否为空:

  • 在PHP的连接配置里加上跟踪设置:
$sapConfig = [
    'ashost' => '你的SAP服务器地址',
    'sysnr' => '00',
    'client' => '100',
    'user' => '你的SAP账号',
    'passwd' => '你的SAP密码',
    'trace' => 3, // 开启详细跟踪,日志会生成在SDK的log目录里
];
$sapConnection = new SAPNWRFC\Connection($sapConfig);
  • 去SDK的log目录找sapnwrfc.log,查看CALL部分的参数内容,就能明确是不是参数没传对。

5. 验证SAP端的RFC函数配置和权限

  • 先确认你的SAP账号有该RFC函数的写入权限,可以用事务码SU01检查对应的权限对象。
  • 用SAP的SE37事务码手动测试这个RFC函数,输入参数看能不能正常写入——如果SAP端手动测试都有问题,那大概率是函数本身的配置问题,和PHP无关。

要是以上步骤都试过还是没解决,把你尝试的代码片段贴出来,咱们能更精准地定位问题~

内容的提问来源于stack exchange,提问作者Vivan Menezes

火山引擎 最新活动