QBXML - 修改销售订单订单项自定义字段

时间:2017-10-10 02:38:37

标签: quickbooks qbxml

我在名为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”。

我还能做些什么来了解它为什么不更新?或者我在这个过程中缺少一个步骤?

1 个答案:

答案 0 :(得分:2)

嗯,我做了一些研究并回答了我自己的问题。我最终使用了Intuit提供的SDK中包含的QBXML验证器作为免费下载。我的问题是我正在指定旧版本的QBXML(“2.0”),而不是更近期的东西。

所以解决方案是添加:

<?qbxml version="13.0"?>

到请求的顶部。它没有正确验证,因为我最初有

<?qbxml version="2.0"?>

我从其他地方剪切并粘贴了它,并且最初没有意识到版本号与它的重要性一样重要。

我编辑了OP,以便QBXML现在实际上有效。

希望这可以帮助遇到类似问题的其他人!