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

QBXML - modifying Sales Order line item custom field

我在我的 QB 销售订单行项目中设置了一个名为 Ready QTY 的自定义字段,我想使用 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 连接器的其他 QBXML 请求工作正常(我正在使用 Keith Palmer 很棒的 SDK,感谢 Keith!)。

我想我的要求是对的,至少根据DataExtMod方法下的参考(https://developer-static.intuit.com/qbSDK-current/Common/newOSR/index.html)。然而,QB Web Conenctor returns 这个错误信息:

0x80040400: QuickBooks found an error when parsing the provided XML text stream

XML 验证通过,我似乎无法弄清楚我做错了什么。有没有人尝试过更新销售订单行项目自定义字段?有帮助吗?

上面的问题已经解决了,但是我还有一个相关的问题还没有解决:

我需要把这个 DataExtModRq 放在 SalesOrderModRq 里面吗?当我查看 OSR 时,情况似乎并非如此。 QB 中的数据扩展似乎与其他实体不同,在其他实体中我会以某种方式传递 EditSequence 以便 QB 实际更新任何内容......我只是传递销售订单行的 TxnID 和 TxnLineID项目以及我要更新的数据字段名称。 QBWC 运行 无误地处理了我的请求,并且我在我的响应处理程序中得到了一个很好的 return XML,但是 QB 本身没有在该字段中显示更新的值。 QB中有设置还是我不知道的?

我要修改的Sales Order的TxnID是530C4-1504813938,TxnLineID是530C6-1504813938。我已将这些单独更改为虚假值以测试我的请求,并且 QBWC 确实确实 return 一个错误,正如预期的那样。

这是销售订单本身的样子:

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”。

我还能做些什么来了解为什么它没有更新吗?还是我在这个过程中遗漏了一个步骤?

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

所以解决方案是添加:

<?qbxml version="13.0"?>

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

<?qbxml version="2.0"?>

我从其他地方剪切并粘贴了它,最初并没有意识到版本号如此重要。

我编辑了 OP,因此 QBXML 现在实际上是有效的。

希望这对遇到类似问题的其他人有所帮助!