【问题标题】:Add menu item to Quickbooks将菜单项添加到 Quickbooks
【发布时间】:2013-05-10 19:07:24
【问题描述】:

是否可以使用 QBSDK 向 Quickbooks 添加菜单项?

我发现了一些我无法使用的旧示例。

我为我的公司创建了一个自定义应用程序,并试图通过在 Quickbooks 中创建一个菜单项来简化它。

任何帮助将不胜感激。

这是我迄今为止尝试过的,但我在 subAdd.SubscriberID.SetValue(Me.appGUID.ToString) 处收到一条错误消息。

错误是:* GUID 格式无效。必须为自定义字段使用零,或使用 GuidGen.exe 生成的 GUID 用于私有数据扩展。*

{
    Dim subRq As ISubscriptionMsgSetRequest
    subRq = MySessionManager.CreateSubscriptionMsgSetRequest(4, 0)
    ' Add a UIExtension subscription to our request
    Dim subAdd As IUIExtensionSubscriptionAdd
    subAdd = subRq.AppendUIExtensionSubscriptionAddRq

    '
    ' set up the subscription request with the required information, we're adding to
    ' the file menu in this case, and just for fun, we're making it a cascading menu
    subAdd.SubscriberID.SetValue(Me.appGUID.ToString) "<-----error happens here
    subAdd.COMCallbackInfo.AppName.SetValue(Me.appName)

    subAdd.COMCallbackInfo.ORProgCLSID.ProgID.SetValue("MenuEventContext.QBMenuListener")
    subAdd.MenuExtensionSubscription.AddToMenu.SetValue("atmFile")

    '
    ' For the cascade fun, we're just going to add items to the cascade menu...
    Dim subMenu As IMenuItem
    For i = 1 To 5
        subMenu = subAdd.MenuExtensionSubscription.ORMenuSubmenu.Submenu.MenuItemList.Append
        '
        ' this is the text that the user will see in QuickBooks:
        subMenu.MenuText.SetValue("Sub Item " & i)
        '
        ' this is the tag we'll get in our event handler to know which menu item was
        ' selected:
        subMenu.EventTag.SetValue("SubMenu" & i)
    Next i

    '
    ' Send the request and get the response, since we're sending only one request there
    ' will be only one response in the response list
    Dim subRs As ISubscriptionMsgSetResponse
    subRs = MySessionManager.DoSubscriptionRequests(subRq)
    Dim resp As IResponse

    '
    ' Check the response and display an appropriate message to the user.
    resp = subRs.ResponseList.GetAt(0)
    If (resp.StatusCode = 0) Then
        MsgBox("Successfully added to QuickBooks File menu, restart QuickBooks to see results")
    Else
        MsgBox("Could not add to QuickBooks menu: " & resp.StatusMessage)
    End If
    MySessionManager.CloseConnection()
    MySessionManager = Nothing
    Exit Sub
   handleError:
    MsgBox("Encountered error subscribing: " & Err.Description)
    If Not MySessionManager Is Nothing Then
        MySessionManager.CloseConnection()
    End If


End Sub

【问题讨论】:

  • 不,恐怕是简答...
  • 哦,这不是我想听到的。

标签: quickbooks intuit


【解决方案1】:

答案是肯定的。

UIExtensionSubscription 的唯一目的是将菜单项添加到顶部菜单。如果您的应用尚未运行,则单击菜单将启动您的应用,并向其传递有关当前聚焦的 Quickbooks 窗口的信息。

您的应用程序必须是可访问和注册的。

对于您的示例,请确保您在 GUID 周围传递 { }。我不使用函数调用不确定是否需要先转换为字符串。

从 Intuit 下载的当前 QBPOSSDK 中有一个 C# 示例控制台应用程序。我会彻底阅读程序员指南并查看该示例。

我的一个工作请求,非常接近 intuit 示例:

Private Shared Function GetUIExtensionSubscriptionAddXML(ByVal strMenuName As String, ByVal strMainMenuName As String) As String
        'strMainMenuName would be "Company" for example
        'Create the qbXML request
        Dim requestXMLDoc As New XmlDocument()
        requestXMLDoc.AppendChild(requestXMLDoc.CreateXmlDeclaration("1.0", Nothing, Nothing))
        requestXMLDoc.AppendChild(requestXMLDoc.CreateProcessingInstruction("qbxml", "version=""5.0"""))
        Dim qbXML As XmlElement = requestXMLDoc.CreateElement("QBXML")
        requestXMLDoc.AppendChild(qbXML)

        'subscription Message request
        Dim qbXMLMsgsRq As XmlElement = requestXMLDoc.CreateElement("QBXMLSubscriptionMsgsRq")
        qbXML.AppendChild(qbXMLMsgsRq)

        'UI Extension Subscription ADD request
        Dim uiExtSubscriptionAddRq As XmlElement = requestXMLDoc.CreateElement("UIExtensionSubscriptionAddRq")
        qbXMLMsgsRq.AppendChild(uiExtSubscriptionAddRq)


        'UI Extension Subscription ADD
        Dim uiExtEventSubscriptionAdd As XmlElement = requestXMLDoc.CreateElement("UIExtensionSubscriptionAdd")
        uiExtSubscriptionAddRq.AppendChild(uiExtEventSubscriptionAdd)

        'Add Subscription ID
        uiExtEventSubscriptionAdd.AppendChild(requestXMLDoc.CreateElement("SubscriberID")).InnerText = MySubscriberGUID

        'Add COM CallbackInfo
        Dim comCallbackInfo As XmlElement = requestXMLDoc.CreateElement("COMCallbackInfo")
        uiExtEventSubscriptionAdd.AppendChild(comCallbackInfo)

        'Appname and CLSID
        comCallbackInfo.AppendChild(requestXMLDoc.CreateElement("AppName")).InnerText = App_Name
        comCallbackInfo.AppendChild(requestXMLDoc.CreateElement("CLSID")).InnerText = MyCLSID


        '  MenuEventSubscription
        Dim menuExtensionSubscription As XmlElement = requestXMLDoc.CreateElement("MenuExtensionSubscription")
        uiExtEventSubscriptionAdd.AppendChild(menuExtensionSubscription)

        'Add To menu
        menuExtensionSubscription.AppendChild(requestXMLDoc.CreateElement("AddToMenu")).InnerText = strMainMenuName

        Dim menuItem As XmlElement = requestXMLDoc.CreateElement("MenuItem")
        menuExtensionSubscription.AppendChild(menuItem)

        'Add Menu Name
        menuItem.AppendChild(requestXMLDoc.CreateElement("MenuText")).InnerText = strMenuName
        menuItem.AppendChild(requestXMLDoc.CreateElement("EventTag")).InnerText = "menu_" & strMenuName.Replace(" ", "_")


        Dim displayCondition As XmlElement = requestXMLDoc.CreateElement("DisplayCondition")
        menuItem.AppendChild(displayCondition)

        displayCondition.AppendChild(requestXMLDoc.CreateElement("VisibleIf")).InnerText = "InventoryEnabled"
        displayCondition.AppendChild(requestXMLDoc.CreateElement("EnabledIf")).InnerText = "InventoryEnabled"

        Dim strRetString As String = requestXMLDoc.OuterXml
        WriteLocalLog("GetUIExtensionSubscriptionAddXML: " & strRetString)
        Return strRetString   
End Function

【讨论】:

  • 您好,Comivan,我在订阅文件下的菜单时遇到问题,我让您的代码工作正常,但它不会在文件下显示我的菜单名称,但如果我检查编辑--> 首选项-->集成应用程序--> 公司首选项那里显示我的 appname 。我是不是弄错了什么或者有任何修改..请帮助我。我使用的是QB2013版本...
  • 文档未涵盖的内容(因为它比 UAC 更早)在您请求修改菜单之后,您必须以管理员身份运行 QuickBooks。修改后,您无需再提升运行它。
  • @Comivan 我正在尝试找出整个菜单项的内容,我想知道您是否可以指出一些示例代码,以了解如何在接收器端配置/处理 COM 内容, (我有一个现有的 winforms 应用程序,我想通过 QB 菜单选项启动它,我不需要在任何时候来回传递任何数据)。我对 COM 的另一个问题是,我的应用程序是否需要作为服务运行才能接收来自 QB 的事件?还是QB会推出它?任何帮助表示赞赏,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
相关资源
最近更新 更多