Добавить пункт меню в 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

person Clint Clark    schedule 10.05.2013    source источник
comment
Нет, это короткий ответ, я боюсь...   -  person Rachel Gallen    schedule 10.05.2013
comment
О, это не то, что я хотел услышать.   -  person Clint Clark    schedule 11.05.2013


Ответы (1)


Ответ положительный.

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

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

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

Пример консольного приложения на C# есть в текущей загрузке QBPOSSDK с Intuit. Я бы внимательно прочитал руководство программиста и посмотрел бы на этот образец.

Один из моих рабочих запросов, довольно близкий к образцу 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
person Comivan    schedule 14.05.2013
comment
Здравствуйте, Comivan, у меня проблема с подпиской на меню в файле. Я следую вашему коду, он работает, но не показывает имя моего меню в файле, но если я отмечу «Редактировать» -> «Настройки» -> «Интегрированные приложения» -> настройки компании там он показывает мое имя приложения. я что-то ошибся или есть какая-то модификация .. пожалуйста, помогите мне. Я использую версию QB2013 ... - person Victor Athoti.; 03.05.2014
comment
Что-то, что документация не охватывает (потому что она старше, чем UAC). После вашего запроса на изменение меню вы должны запустить QuickBooks от имени администратора. После того, как он будет изменен, вам больше не нужно запускать его с повышенными правами. - person Comivan; 06.05.2014
comment
@Comivan Я пытаюсь разобраться во всем этом пункте меню, мне было интересно, не могли бы вы указать мне какой-нибудь пример кода того, как нужно настраивать/обрабатывать материалы COM на стороне получателя (у меня есть существующее приложение winforms что я хочу сделать доступным для запуска с помощью опции меню QB, мне не нужны никакие данные, передаваемые туда и обратно в любой момент). Еще один вопрос, который у меня есть относительно COM, должно ли мое приложение работать как служба, чтобы оно могло получать события от QB? или QB запустит его? Любая помощь приветствуется, спасибо. - person effy; 27.02.2019