我在QBSDK_ProGuid.pdf文件(第117页)上看到了有关iterration的文档。我很困惑如何再次发出相同的查询并将迭代器值设置为Continue,并将IteratorID字段设置为从IteratorID返回的值第一次查询迭代。
<?xml version="1.0" ?>
<?qbxml version="5.0" ?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<CustomerQueryRq requestID="5001" iterator="Continue"
iteratorID="{D7355385-A17B-4f5d-B34D-F34C79C3E6FC}">
<MaxReturned>10</MaxReturned>
<IncludeRetElement>ListID</IncludeRetElement>
</
CustomerQueryRq>
</QBXMLMsgsRq>
</QBXML>
我正在关注由intuit提供的WCWebService示例...并获取客户数据。 任何人都可以提供一个使用迭代概念的样本。 谢谢!
答案 0 :(得分:3)
下面是使用迭代器查询客户的示例,一次获取五(5)个客户。此查询使用以下条件提取客户:
您的初始请求如下所示。请注意,我们声明了iterator =“Start”属性来启动迭代器:
<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="5.0"?>
<QBXML>
<QBXMLMsgsRq onError="continueOnError">
<CustomerQueryRq requestID="1" iterator="Start">
<MaxReturned>5</MaxReturned>
<FromModifiedDate>1984-01-29T22:03:19</FromModifiedDate>
<OwnerID>0</OwnerID>
</CustomerQueryRq>
</QBXMLMsgsRq>
</QBXML>
QuickBooks会向您发回包含前五(5)个客户的回复,如下所示。请注意,QuickBooks已向我们发送了iteratorID="..."
属性和iteratorRemainingCount="..."
属性,指示用于标识迭代器的ID以及迭代器中剩余的项目数。
<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<CustomerQueryRs
requestID="1"
statusCode="0"
statusSeverity="Info"
statusMessage="Status OK"
iteratorRemainingCount="18"
iteratorID="{eb05f701-e727-472f-8ade-6753c4f67a46}">
<CustomerRet>
<ListID>110000-1232697602</ListID>
<TimeCreated>2009-01-23T03:00:02-05:00</TimeCreated>
<TimeModified>2009-01-23T03:00:02-05:00</TimeModified>
<EditSequence>1232697602</EditSequence>
<Name>10th Customer</Name>
<FullName>10th Customer</FullName>
<IsActive>true</IsActive>
<Sublevel>0</Sublevel>
<Balance>0.00</Balance>
<TotalBalance>0.00</TotalBalance>
<SalesTaxCodeRef>
<ListID>10000-1232327562</ListID>
<FullName>Tax</FullName>
</SalesTaxCodeRef>
<ItemSalesTaxRef>
<ListID>10000-1232327661</ListID>
<FullName>Out of State</FullName>
</ItemSalesTaxRef>
<JobStatus>None</JobStatus>
</CustomerRet>
... 4 more customer records will go here ...
</CustomerQueryRs>
</QBXMLMsgsRs>
</QBXML>
然后,您将检查iteratorRemainingCount
属性,如果它大于0,则使用iteratorID
属性发送您的下一个请求。请记住,使用此迭代器的每个后续请求请求必须使用相同的搜索条件,并且必须随每个请求一起发送搜索条件。
因此,在这种情况下,对迭代器的下一部分的每个请求都将重新发送<MaxReturned>
,<FromModifiedDate>
和<OwnerID>
元素。请注意,我们从先前的响应中发送返回的iteratorID="..."
属性,并声明iterator="Continue"
属性,指示我们要继续从现有迭代器中获取:
<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="5.0"?>
<QBXML>
<QBXMLMsgsRq onError="continueOnError">
<CustomerQueryRq
requestID="2"
iterator="Continue"
iteratorID="{eb05f701-e727-472f-8ade-6753c4f67a46}">
<MaxReturned>5</MaxReturned>
<FromModifiedDate>1984-01-29T22:03:19</FromModifiedDate>
<OwnerID>0</OwnerID>
</CustomerQueryRq>
</QBXMLMsgsRq>
</QBXML>
此过程将重复,直到迭代器中没有剩余项目为止。在每个响应中,您将检查iteratorRemainingCount
属性,如果它大于0,您将发出另一个请求以获取迭代器的下一部分。
最终,您会注意到iteratorRemainingCount
属性将减少为零(0),此时您将停止发出请求,因为迭代器没有更多要返回的记录。如果您确实发出了另一个请求,那么您将收到一个错误,因为迭代器此时已过期。
<?xml version=“1.0” ?>
<QBXML>
<QBXMLMsgsRs>
<CustomerQueryRs
requestID="5"
statusCode="0"
statusSeverity="Info"
statusMessage="Status OK"
iteratorRemainingCount="0"
iteratorID="{eb05f701-e727-472f-8ade-6753c4f67a46}">
<CustomerRet>
<ListID>1B0000-1232697643</ListID>
<TimeCreated>2009-01-23T03:00:43-05:00</TimeCreated>
<TimeModified>2009-01-23T03:00:43-05:00</TimeModified>
<EditSequence>1232697643</EditSequence>
<Name>Pat Daniels</Name>
<FullName>Pat Daniels</FullName>
<IsActive>true</IsActive>
<Sublevel>0</Sublevel>
<Balance>0.00</Balance>
<TotalBalance>0.00</TotalBalance>
<SalesTaxCodeRef>
<ListID>10000-1232327562</ListID>
<FullName>Tax</FullName>
</SalesTaxCodeRef>
<ItemSalesTaxRef>
<ListID>10000-1232327661</ListID>
<FullName>Out of State</FullName>
</ItemSalesTaxRef>
<JobStatus>None</JobStatus>
</CustomerRet>
... 4 more customer records will go here ...
</CustomerQueryRs>
</QBXMLMsgsRs>
</QBXML>