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 现在实际上是有效的。
希望这对遇到类似问题的其他人有所帮助!
我在我的 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 现在实际上是有效的。
希望这对遇到类似问题的其他人有所帮助!