如何通过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




