我使用QuickBooks SDK 13.0通过QBXML与我们的QuickBooks Enterprise 14.0连接。由于文档很差,在网上缺乏好的例子,它还不是一条简单的道路,但我已经完成了我的项目,即将自己开发的库存系统集成到QuickBooks Advanced Inventory。但是,我现在无法找到解决问题的痕迹:
任务:从QuickBooks中检索库存物品清单
方法:我正在使用QBXMLRP2.IRequestProcessor5.ProcessRequest()来处理ItemInventoryQueryRq请求文件。
如果我只对所有5,033个库存物品发出一个请求,那么一切都运行正常,但是单个请求需要一段时间才能完成并返回。所以我实现了一个"迭代器"一次获得100个产品,并给予应用时间"呼吸"请求之间。第一个调用工作正常,看起来像这样:
<?xml version="1.0"?>
<?qbxml version="13.0"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<ItemInventoryQueryRq requestID="1" iterator="Start">
<MaxReturned>100</MaxReturned>
<OwnerID>0</OwnerID>
</ItemInventoryQueryRq>
</QBXMLMsgsRq>
</QBXML>
当我处理此请求时,我得到前100个项目,剩下的计数是4933,这是正确的:
...
<ItemInventoryQueryRs requestID="1" statusCode="0" statusSeverity="Info"
statusMessage="Status OK" iteratorRemainingCount="4933"
iteratorID="{ea9ae5fa-d1b5-4719-9f77-dd4ac27e1eed}">
...
从这一点开始,问题就发生了......
下一个请求如下:
<?xml version="1.0"?>
<?qbxml version="13.0"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<ItemInventoryQueryRq requestID="2" iterator="Continue"
iteratorID="{ea9ae5fa-d1b5-4719-9f77-dd4ac27e1eed}">
<MaxReturned>100</MaxReturned>
<OwnerID>0</OwnerID>
</ItemInventoryQueryRq>
</QBXMLMsgsRq>
</QBXML>
此时我预计接下来的100个项目,剩余的数量为4833.但是,处理器跳过了100个项目,给了我下一个100项,并返回了剩余的4733个数:
...
<ItemInventoryQueryRs requestID="2" statusCode="0" statusSeverity="Info"
statusMessage="Status OK" iteratorRemainingCount="4733"
iteratorID="{ea9ae5fa-d1b5-4719-9f77-dd4ac27e1eed}">
...
后续调用也是如此:跳过100,返回下一个100,计数器减少200:
...
<ItemInventoryQueryRs requestID="3" statusCode="0" statusSeverity="Info"
statusMessage="Status OK" iteratorRemainingCount="4533"
iteratorID="{ea9ae5fa-d1b5-4719-9f77-dd4ac27e1eed}">
...
<ItemInventoryQueryRs requestID="4" statusCode="0" statusSeverity="Info"
statusMessage="Status OK" iteratorRemainingCount="4333"
iteratorID="{ea9ae5fa-d1b5-4719-9f77-dd4ac27e1eed}">
...
<ItemInventoryQueryRs requestID="4" statusCode="0" statusSeverity="Info"
statusMessage="Status OK" iteratorRemainingCount="4133"
iteratorID="{ea9ae5fa-d1b5-4719-9f77-dd4ac27e1eed}">
...
等等。看起来处理器每次都发送两次请求,而我只得到最后一次调用的结果。
在解决问题时,我发现每次调用处理器时都会更新以下日志文件:%AppData%\ Local \ Intuit \ QuickBooks \ Log \ 14.0 \ QBWin.log
对于每次对处理器的调用,此文件显示以下两行:
oasdkrequestprocessor.cpp (397) : CHECKPOINT: 5024: Fri Mar 28 13:39:56 returning from ProcessXMLRequest, result = 0
oasdkrequestprocessor.cpp (397) : CHECKPOINT: 5024: Fri Mar 28 13:39:57 returning from ProcessXMLRequest, result = 0
这加强了我对ProcessRequest导致发出重复调用的怀疑。
我在通话中做错了什么或丢失了什么?任何帮助表示赞赏。
====&GT;更新(2014年4月1日):事实证明我测试的第二台机器上没有这种行为,所以我从我的开发PC卸载了所有Intuit产品,使用清理工具来摆脱旧的注册表项和相关的DLL,然后重新安装QuickBooks Enterprise 14.0和SDK 13.0。应用了最新的更新,现在一切都很好。太糟糕了,我失去了生命中的一天,试图弄清楚发生了什么......