Добавить пункт меню в Quickbooks

Можно ли добавить пункт меню в Quickbooks с помощью QBSDK?

Я нашел пару старых примеров, которые я не могу заставить работать.

Я создал специальное приложение для своей компании и пытаюсь упростить его, сделав пункт меню в Quickbooks.

Любая помощь будет принята с благодарностью.

Вот что я пробовал до сих пор, но я получаю сообщение об ошибке в subAdd.SubscriberID.SetValue(Me.appGUID.ToString).

Ошибка: * Неправильный формат GUID. Необходимо использовать ноль для пользовательских полей или GUID, созданный с помощью GuidGen.exe для расширений личных данных.*

{
    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

1 ответ

Ответ - да.

Единственная цель UIExtensionSubscription - добавить пункты меню в верхние меню. Щелчок по меню запустит ваше приложение, если оно еще не запущено, и передаст ему информацию о текущем окне Quickbooks.

Ваша заявка должна быть доступна и зарегистрирована.

Что касается вашего образца, убедитесь, что вы передаете { } вокруг вашего GUID. Я не использую вызов функции неуверенно, если вам может понадобиться сначала привести к строке или нет.

В текущей загрузке QBPOSSDK из Intuit есть пример консольного приложения на 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
Другие вопросы по тегам