我在名为Ready QTY
的QB销售订单行项目中设置了自定义字段,我想使用QBXML来更新该值。这是一个测试QBXML请求:
<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="13.0"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<DataExtModRq>
<DataExtMod>
<OwnerID>0</OwnerID>
<DataExtName>Ready QTY</DataExtName>
<TxnDataExtType>SalesOrder</TxnDataExtType>
<TxnID>52FC6-1504808512</TxnID>
<TxnLineID>52FC8-1504808512</TxnLineID>
<DataExtValue>3</DataExtValue>
</DataExtMod>
</DataExtModRq>
</QBXMLMsgsRq>
</QBXML>
我对Web Connector的其他QBXML请求工作正常(我正在使用Keith Palmer的真棒SDK,感谢Keith!)。
我认为我的请求是正确的,至少根据DataExtMod
方法下的参考(https://developer-static.intuit.com/qbSDK-current/Common/newOSR/index.html)。但是,QB Web Conenctor会返回以下错误消息:
0x80040400: QuickBooks found an error when parsing the provided XML text stream
XML验证了,我似乎无法弄清楚我做错了什么。有没有人曾尝试更新销售订单行项目自定义字段?有什么帮助吗?
我是否需要将此DataExtModRq
置于SalesOrderModRq
内?当我看到OSR时,它似乎并不那样。并且看起来QB中的数据exts工作方式与其他实体不同,我以某种方式传递EditSequence
以便QB实际更新任何东西......我只是传递销售订单行的TxnID和TxnLineID item以及我想要更新的数据字段名称。 QBWC正在运行我的请求而没有错误,我在我的响应处理程序中得到了一个很好的返回XML,但是QB本身没有在字段中显示更新的值。 QB中有设置或我不知道的事情吗?
我要修改的销售订单的TxnID是530C4-1504813938,TxnLineID是530C6-1504813938。我已将这些单独更改为伪值以测试我的请求,并且QBWC确实返回错误,如预期的那样。
以下是销售订单本身的样子:
IMAGE: Screenshot - Ready QTY field on a Sales Order
这是我正在做的一些相关的PHP代码。
将QuickBooks操作映射到处理函数:
$map = array(
QUICKBOOKS_IMPORT_SALESORDER => array('_quickbooks_salesorder_import_request', '_quickbooks_salesorder_import_response' ),
QUICKBOOKS_MOD_DATAEXT => array( '_quickbooks_salesorder_update_request', '_quickbooks_salesorder_update_response' ),
);
请求本身:
function _quickbooks_salesorder_update_request($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $version, $locale)
{
$xml = '<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="13.0"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<DataExtModRq>
<DataExtMod>
<OwnerID>0</OwnerID>
<DataExtName>Ready QTY</DataExtName>
<TxnDataExtType>SalesOrder</TxnDataExtType>
<TxnID>530C4-1504813938</TxnID>
<TxnLineID>530C6-1504813938</TxnLineID>
<DataExtValue>6</DataExtValue>
</DataExtMod>
</DataExtModRq>
</QBXMLMsgsRq>
</QBXML>';
return $xml;
}
然后我将请求排队:
$Queue = new QuickBooks_WebConnector_Queue($dsn);
$Queue->enqueue(QUICKBOOKS_MOD_DATAEXT);
我运行QBWC并且没有错误。我从响应处理程序接收并打印的响应XML是:
[12-Oct-2017 09:47:56 America/Chicago] <?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<DataExtModRs requestID="252" statusCode="0" statusSeverity="Info" statusMessage="Status OK">
<DataExtRet>
<OwnerID>0</OwnerID>
<DataExtName>Ready QTY</DataExtName>
<DataExtType>STR255TYPE</DataExtType>
<DataExtValue>6</DataExtValue>
</DataExtRet>
</DataExtModRs>
</QBXMLMsgsRs>
</QBXML>
这让我觉得价值已更新...但是,我查看QB中的特定销售订单和订单项,价值仍然是“4”而不是“6”。
我还能做些什么来了解它为什么不更新?或者我在这个过程中缺少一个步骤?
答案 0 :(得分:2)
嗯,我做了一些研究并回答了我自己的问题。我最终使用了Intuit提供的SDK中包含的QBXML验证器作为免费下载。我的问题是我正在指定旧版本的QBXML(“2.0”),而不是更近期的东西。
所以解决方案是添加:
<?qbxml version="13.0"?>
到请求的顶部。它没有正确验证,因为我最初有
<?qbxml version="2.0"?>
我从其他地方剪切并粘贴了它,并且最初没有意识到版本号与它的重要性一样重要。
我编辑了OP,以便QBXML现在实际上有效。
希望这可以帮助遇到类似问题的其他人!