继续查询Quickbooks数据的最佳方式
Best way to continue to query Quickbooks data
我对 qbxml 有疑问。
我正在尝试将 qb 客户、项目等迁移到 zohobooks。
我想先从 quickbooks 获取 50 个客户,然后调用 zohobooks api 在那里创建联系人。以及来自 quickbooks 和 zohobooks 的另外 50 名客户。
问题是我确定在调用 zohobooks api 后如何继续查询?
当我尝试使用与第一个查询响应相同的 iteratorID 时,我没有从 QB 那里得到任何信息。
我正在使用 .net 构建桌面应用程序,请告诉我跟踪迁移和我所在位置的最佳选项。
假设我有 150 个客户,由于某种原因在 100 个客户后停止迁移,在这种情况下,我下次如何获取最后 50 个客户?
public string customerQueryXml()
{
XmlDocument inputXMLDoc = new XmlDocument();
inputXMLDoc.AppendChild(inputXMLDoc.CreateXmlDeclaration("1.0", null, null));
inputXMLDoc.AppendChild(inputXMLDoc.CreateProcessingInstruction("qbposxml", "version=\"1.0\""));
XmlElement qbXML = inputXMLDoc.CreateElement("QBPOSXML");
inputXMLDoc.AppendChild(qbXML);
XmlElement qbXMLMsgsRq = inputXMLDoc.CreateElement("QBPOSXMLMsgsRq");
qbXML.AppendChild(qbXMLMsgsRq);
qbXMLMsgsRq.SetAttribute("onError", "stopOnError");
XmlElement customerQueryRq = inputXMLDoc.CreateElement("CustomerQueryRq");
qbXMLMsgsRq.AppendChild(customerQueryRq);
//customerQueryRq.SetAttribute("requestID", "1");
//customerQueryRq.SetAttribute("iterator", "Start");
customerQueryRq.SetAttribute("requestID", "2");
customerQueryRq.SetAttribute("iterator", "Continue");
customerQueryRq.SetAttribute("iteratorID", "{A1601C19-C6DC-43C0-AE43-6F45088C39F2}");
// for test only, read 10 customers
XmlElement MaxReturned = inputXMLDoc.CreateElement("MaxReturned");
customerQueryRq.AppendChild(MaxReturned).InnerText = "50";
XmlElement ownerID = inputXMLDoc.CreateElement("OwnerID");
customerQueryRq.AppendChild(ownerID).InnerText = "0";
XmlElement timeModifiedRangeFilter = inputXMLDoc.CreateElement("TimeModifiedRangeFilter");
customerQueryRq.AppendChild(timeModifiedRangeFilter);
XmlElement fromTimeModified = inputXMLDoc.CreateElement("FromTimeModified");
timeModifiedRangeFilter.AppendChild(fromTimeModified).InnerText = "1980-01-01T00:00:00";
XmlElement toTimeModified = inputXMLDoc.CreateElement("ToTimeModified");
timeModifiedRangeFilter.AppendChild(toTimeModified).InnerText = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");
return inputXMLDoc.OuterXml;
}
编辑:
我注意到我必须在同一请求中使用 iteratorID。顺便说一下,我对 qbxml 本身没有任何问题。
我的问题是如何根据另一个请求继续查询客户、物品或其他内容?
- ProcessRequest(第一次)
- 已将 xml 数据迁移到另一个系统
- 然后出于某种原因我停止了请求
- 这里,我可以在另一个ProcessRequest上继续查询吗?
必须在单个 Session
中使用迭代器。例如这将起作用:
- 连接到 QuickBooks(建立会话)
- 请求创建迭代器并获取第一页记录
- 执行另一个请求以继续迭代器
- 执行另一个请求以继续迭代器
虽然这 不会 工作,并且 不会 QuickBooks 支持的东西:
- 连接到 QuickBooks(建立会话)
- 请求创建迭代器并获取第一页记录
- 断开连接
- 请求创建迭代器并获取第一页记录
我对 qbxml 有疑问。
我正在尝试将 qb 客户、项目等迁移到 zohobooks。 我想先从 quickbooks 获取 50 个客户,然后调用 zohobooks api 在那里创建联系人。以及来自 quickbooks 和 zohobooks 的另外 50 名客户。
问题是我确定在调用 zohobooks api 后如何继续查询?
当我尝试使用与第一个查询响应相同的 iteratorID 时,我没有从 QB 那里得到任何信息。
我正在使用 .net 构建桌面应用程序,请告诉我跟踪迁移和我所在位置的最佳选项。
假设我有 150 个客户,由于某种原因在 100 个客户后停止迁移,在这种情况下,我下次如何获取最后 50 个客户?
public string customerQueryXml()
{
XmlDocument inputXMLDoc = new XmlDocument();
inputXMLDoc.AppendChild(inputXMLDoc.CreateXmlDeclaration("1.0", null, null));
inputXMLDoc.AppendChild(inputXMLDoc.CreateProcessingInstruction("qbposxml", "version=\"1.0\""));
XmlElement qbXML = inputXMLDoc.CreateElement("QBPOSXML");
inputXMLDoc.AppendChild(qbXML);
XmlElement qbXMLMsgsRq = inputXMLDoc.CreateElement("QBPOSXMLMsgsRq");
qbXML.AppendChild(qbXMLMsgsRq);
qbXMLMsgsRq.SetAttribute("onError", "stopOnError");
XmlElement customerQueryRq = inputXMLDoc.CreateElement("CustomerQueryRq");
qbXMLMsgsRq.AppendChild(customerQueryRq);
//customerQueryRq.SetAttribute("requestID", "1");
//customerQueryRq.SetAttribute("iterator", "Start");
customerQueryRq.SetAttribute("requestID", "2");
customerQueryRq.SetAttribute("iterator", "Continue");
customerQueryRq.SetAttribute("iteratorID", "{A1601C19-C6DC-43C0-AE43-6F45088C39F2}");
// for test only, read 10 customers
XmlElement MaxReturned = inputXMLDoc.CreateElement("MaxReturned");
customerQueryRq.AppendChild(MaxReturned).InnerText = "50";
XmlElement ownerID = inputXMLDoc.CreateElement("OwnerID");
customerQueryRq.AppendChild(ownerID).InnerText = "0";
XmlElement timeModifiedRangeFilter = inputXMLDoc.CreateElement("TimeModifiedRangeFilter");
customerQueryRq.AppendChild(timeModifiedRangeFilter);
XmlElement fromTimeModified = inputXMLDoc.CreateElement("FromTimeModified");
timeModifiedRangeFilter.AppendChild(fromTimeModified).InnerText = "1980-01-01T00:00:00";
XmlElement toTimeModified = inputXMLDoc.CreateElement("ToTimeModified");
timeModifiedRangeFilter.AppendChild(toTimeModified).InnerText = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");
return inputXMLDoc.OuterXml;
}
编辑: 我注意到我必须在同一请求中使用 iteratorID。顺便说一下,我对 qbxml 本身没有任何问题。 我的问题是如何根据另一个请求继续查询客户、物品或其他内容?
- ProcessRequest(第一次)
- 已将 xml 数据迁移到另一个系统
- 然后出于某种原因我停止了请求
- 这里,我可以在另一个ProcessRequest上继续查询吗?
必须在单个 Session
中使用迭代器。例如这将起作用:
- 连接到 QuickBooks(建立会话)
- 请求创建迭代器并获取第一页记录
- 执行另一个请求以继续迭代器
- 执行另一个请求以继续迭代器
虽然这 不会 工作,并且 不会 QuickBooks 支持的东西:
- 连接到 QuickBooks(建立会话)
- 请求创建迭代器并获取第一页记录
- 断开连接
- 请求创建迭代器并获取第一页记录