Quickbook与我期望的qbXML版本不兼容

时间:2018-06-22 15:27:13

标签: quickbooks qbxml

我有一个使用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>

3 个答案:

答案 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.02.1的相同结果。

sdktest代码导入QBXMLRP.dll(见下文),该版本仅支持1.02.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

  1. 在Visual Studio中
  2. 我不得不create a new CLR c++/cli project
  3. 命名为QBXmlConsole
  4. 使用位于的浏览功能,然后从added the referenceInteropt.QBXMLRP2
  5. 在项目的QBXmlConsole.cpp文件中添加了类似于以下简单示例的内容

现在,当我运行QBXmlConsole.exe < "\Program Files (x86)\Intuit\IDN\QBSDK13.0\samples\xmlfiles\HostQueryRq.xml"时,我会得到受支持的版本1.013.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,但这是我没有尝试过的事情