我有一个使用Quickbooks SDK版本13构建的自制C ++应用程序。 该应用程序的目的是允许我通过从网络端口接收XML字符串来与Quickbooks交谈。我可以使用qbXML 2.1版进行通信。它正在与Quickbooks Enterprise版本16通讯。然后,当我运行主机查询时,我感到很惊讶...
<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="2.1"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<HostQueryRq></HostQueryRq>
</QBXMLMsgsRq>
</QBXML>
...输出是这样的:
<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<HostQueryRs statusCode="0" statusSeverity="Info" statusMessage="Status OK">
<HostRet>
<ProductName>Intuit QuickBooks Enterprise Solutions: Manufacturing and Wholesale 16.0</ProductName>
<MajorVersion>26</MajorVersion>
<MinorVersion>0</MinorVersion>
<SupportedQBXMLVersion>1.0</SupportedQBXMLVersion>
<SupportedQBXMLVersion>1.1</SupportedQBXMLVersion>
<SupportedQBXMLVersion>2.0</SupportedQBXMLVersion>
<SupportedQBXMLVersion>2.1</SupportedQBXMLVersion>
</HostRet>
</HostQueryRs>
</QBXMLMsgsRs>
</QBXML>
SDK的版本13显然应该能够使用qbXML的版本13,而Quickbooks Enterprise 16应该与高于2.1的qbXML兼容。我需要使用qbXML的一个功能,该功能仅在qbXML 2.1之后可用。来自Intuit的These release notes表示Quickbooks Enterprise 14.0与qbXML版本13.0、12.0、11.0、10.0、9.0、8.0、7.0、6.0、5.0、4.1、4.0、3.0、2.1、2.0、1.1和1.0兼容。当然,像16这样的更高版本也将与此兼容。
为什么Quickbooks告诉我只能使用qbXML 2.1?如何使用较新的版本?
编辑:对不起,我忘了提及之前,将<?qbxml version="2.1"?>
更改为<?qbxml version="13.0"?>
或任何高于2.1的值将返回错误80040428
,这表示“当前请求处理器不支持该请求”。另外,如果我使用<?qbxml version="2.0"?>
,我仍然会得到<SupportedQBXMLVersion>2.1</SupportedQBXMLVersion>
。
答案 0 :(得分:0)
为什么Quickbooks告诉我只能使用qbXML 2.1?
因为您只使用2.1。只需使用其他版本。 2.1大约15岁。
更改此:
<?qbxml version="2.1"?>
对于这样的事情:
<?qbxml version="13.0"?>
答案 1 :(得分:0)
如果使用高于2.1的版本时出现80040428错误,则听起来好像计算机上已安装了较旧版本的SDK。您可能需要卸载并重新安装13.0 SDK。我还没有使用HostQueryRq,所以不确定是否是问题所在。这就是我获得受支持的版本的方式:
IRequestProcessor5 rp = new RequestProcessor3();
rp.OpenConnection2("AppID", "AppName", QBXMLRPConnectionType.localQBD);
string ticket = rp.BeginSession("", QBFileMode.qbFileOpenDoNotCare);
string[] versions = (string[])rp.QBXMLVersionsForSession[ticket];
答案 2 :(得分:0)
为什么Quickbooks告诉我只能使用qbXML 2.1?
我有同样的问题。我使用的是从C:\Program Files (x86)\Intuit\IDN\QBSDK13.0\samples\qbdt\cpp\qbxml\sdktest
的SDK中提取的代码,并且得到了受支持的qbXML
版本1.0
至2.1
的相同结果。
sdktest
代码导入QBXMLRP.dll
(见下文),该版本仅支持1.0
至2.1
版本:
/*---------------------------------------------------------------------------
* FILE: SDKTest.cpp
*
* Description:
* QBXMLRP API tester. Run "sdktest -h" to learn how to use it.
*
* Created On: 09/09/2001
*
* Copyright (c) 2001-2013 Intuit Inc. All rights reserved.
* Use is subject to the terms specified at:
* http://developer.intuit.com/legal/devsite_tos.html
*
*/
#include <ctype.h>
#include <ctime>
#include <fstream>
#include <atlbase.h>
#include <iostream>
#include <string>
using namespace std;
#import "QBXMLRP.dll" // this supports only up to v 2.1
QuickBooks SDK Programmer's Guide指出:
从SDK 3.0开始,提供了一个新的请求处理器QBXMLRP2Lib.RequestProcessor2。仅此新的请求处理器支持事件订阅和SDK 3.0的其他新功能。在新的请求处理器中保持了与旧请求处理器的向后兼容性。
要使用较新的QBXMLRP2Lib
:
QBXmlConsole
Interopt.QBXMLRP2
QBXmlConsole.cpp
文件中添加了类似于以下简单示例的内容现在,当我运行QBXmlConsole.exe < "\Program Files (x86)\Intuit\IDN\QBSDK13.0\samples\xmlfiles\HostQueryRq.xml"
时,我会得到受支持的版本1.0
至13.0
。如果遇到问题,请查看SDK的hostquery
示例。希望对您有所帮助。
/** QBXmlConsole.cpp **/
#include "pch.h"
using namespace System;
using namespace Interop::QBXMLRP2; // supports all version of qbXML
int main(array<System::String ^> ^args)
{
String^ ticket;
String^ request;
String^ response;
String^ line;
int err = 0;
while ((line = Console::ReadLine()) != nullptr) {
if (line->StartsWith("<!--")) {
continue;
}
request = request + line + "\n";
}
Console::WriteLine("Processing XML:");
Console::WriteLine(request);
Console::WriteLine("--");
Interop::QBXMLRP2::IRequestProcessor6^ rqPtr = gcnew Interop::QBXMLRP2::RequestProcessor3;
try {
rqPtr->OpenConnection2("123", "QBXmlConsole", Interop::QBXMLRP2::QBXMLRPConnectionType::localQBD);
ticket = rqPtr->BeginSession("", Interop::QBXMLRP2::QBFileMode::qbFileOpenDoNotCare);
response = rqPtr->ProcessRequest(ticket, request);
rqPtr->EndSession(ticket);
rqPtr->CloseConnection();
}
catch (Runtime::InteropServices::COMException^) {
response = "Handled exception: " + rqPtr->GetQBLastError();
err = 1;
}
Console::Write(response);
Console::WriteLine("Query complete");
return err;
}
编辑:我想完全有可能代替导入QBXMLRP.dll
,而可以尝试仅导入Interopt.QBXMLRP2Lib.dll
,但这是我没有尝试过的事情