Search code examples
wpfvb.netsampleintuit-partner-platform

can someone show me a simple sample of vb.net adding customer to quickbooks


I'm trying to write a VB.net WPF program, that will add custom notes to a customer. Intuit has me going in circles with their code examples, that won't convert from C# to VB.net.

Can someone show me a very simple sample that shows adding a customers name only? Leave out any error checking etc, I can figure that out. I just don't know how to write the connection to quickbooks and send the request. Maybe a simple form with a textbox and a button, with the functionality to put the name in the textbox, and click the button to add the customer name.


Solution

  • I have long been disgusted at the poor code samples from Intuit for Quickbooks SDK. Having said that, I still use them; after fixing the code they are quite useful.

    You also need to add a reference to Intuit Quickbooks SDK QBFC7Lib; It might look slightly different depending on the version.

    Here is what you need to do to make the code useful (use Edit > Quick Replace):

    1. Replace // with ' (comments)
    2. Remove all ; (semi-colons)
    3. Replace == with =
    4. Replace For j = 0 with For j as Integer = 0
    5. Replace responseList.GetAt(i) with responseList.GetAt(j)
    6. Remove trailing . (dot)
    7. Replace Integerfor with Integer (next line) for
    8. Replace DataExtRet with DataExtRet. (only when it shows an error)
    9. Check for any other errors
    10. Delete stuff you don't need

    When you run it for the first time you need to have Quickbooks open and be ready to give permissions from Quickbooks. Here is a sample with the errors fixed.

    Imports QBFC7Lib
    
    Module QBSample
    
    Public Class Customer
    
        Public Sub DoCustomerAdd()
            Dim sessionBegun As Boolean
            sessionBegun = False
            Dim connectionOpen As Boolean
            connectionOpen = False
            Dim sessionManager As QBSessionManager
            sessionManager = Nothing
    
            Try
    
                'Create the session Manager object
                sessionManager = New QBSessionManager
    
                'Create the message set request object to hold our request
                Dim requestMsgSet As IMsgSetRequest
                requestMsgSet = sessionManager.CreateMsgSetRequest("US", 7, 0)
                requestMsgSet.Attributes.OnError = ENRqOnError.roeContinue
    
                BuildCustomerAddRq(requestMsgSet)
    
                'Connect to QuickBooks and begin a session
                sessionManager.OpenConnection("", "Your application")
                connectionOpen = True
                sessionManager.BeginSession("", ENOpenMode.omDontCare)
                sessionBegun = True
    
                'Send the request and get the response from QuickBooks
                Dim responseMsgSet As IMsgSetResponse
                responseMsgSet = sessionManager.DoRequests(requestMsgSet)
    
                'End the session and close the connection to QuickBooks
                sessionManager.EndSession()
                sessionBegun = False
                sessionManager.CloseConnection()
                connectionOpen = False
    
                WalkCustomerAddRs(responseMsgSet)
            Catch e As Exception
                MessageBox.Show(e.Message, "Error")
                If (sessionBegun) Then
                    sessionManager.EndSession()
                End If
                If (connectionOpen) Then
                    sessionManager.CloseConnection()
                End If
            End Try
        End Sub
        Private Sub BuildCustomerAddRq(ByVal requestMsgSet As IMsgSetRequest)
            Dim CustomerAddRq As ICustomerAdd
            CustomerAddRq = requestMsgSet.AppendCustomerAddRq()
            'Set field value for Name
            CustomerAddRq.Name.SetValue("Test Customer 2")
            'Set field value for IsActive
            CustomerAddRq.IsActive.SetValue(True)
            'Set field value for CompanyName
            CustomerAddRq.CompanyName.SetValue("ab")
            'Set field value for Salutation
            CustomerAddRq.Salutation.SetValue("ab")
            'Set field value for FirstName
            CustomerAddRq.FirstName.SetValue("ab")
            'Set field value for MiddleName
            CustomerAddRq.MiddleName.SetValue("ab")
            'Set field value for LastName
            CustomerAddRq.LastName.SetValue("ab")
            'Set field value for Addr1
            CustomerAddRq.BillAddress.Addr1.SetValue("ab")
            'Set field value for Addr2
            CustomerAddRq.BillAddress.Addr2.SetValue("ab")
            'Set field value for Addr3
            CustomerAddRq.BillAddress.Addr3.SetValue("ab")
            'Set field value for Addr4
            CustomerAddRq.BillAddress.Addr4.SetValue("ab")
            'Set field value for Phone
            CustomerAddRq.Phone.SetValue("ab")
            'Set field value for AltPhone
            CustomerAddRq.AltPhone.SetValue("ab")
            'Set field value for Fax
            CustomerAddRq.Fax.SetValue("ab")
            'Set field value for Email
            CustomerAddRq.Email.SetValue("ab")
            'Set field value for Contact
            CustomerAddRq.Contact.SetValue("ab")
            'Set field value for AltContact
            CustomerAddRq.AltContact.SetValue("ab")
    
            'May create more than one of these if needed
            CustomerAddRq.IncludeRetElementList.Add("Name")
            CustomerAddRq.IncludeRetElementList.Add("ListID")
    
        End Sub
    
        Private Sub WalkCustomerAddRs(ByVal responseMsgSet As IMsgSetResponse)
            If (responseMsgSet Is Nothing) Then
                Exit Sub
            End If
    
            Dim responseList As IResponseList
            responseList = responseMsgSet.ResponseList
            If (responseList Is Nothing) Then
                Exit Sub
            End If
    
            'if we sent only one request, there is only one response, we'll walk the list for this sample
            For j As Integer = 0 To responseList.Count - 1
                Dim response As IResponse
                response = responseList.GetAt(j)
                'check the status code of the response, 0=ok, >0 is warning
                If (response.StatusCode >= 0) Then
                    'the request-specific response is in the details, make sure we have some
                    If (Not response.Detail Is Nothing) Then
                        'make sure the response is the type we're expecting
                        Dim responseType As ENResponseType
                        responseType = CType(response.Type.GetValue(), ENResponseType)
                        If (responseType = ENResponseType.rtCustomerAddRs) Then
                            ''upcast to more specific type here, this is safe because we checked with response.Type check above
                            Dim CustomerRet As ICustomerRet
                            CustomerRet = CType(response.Detail, ICustomerRet)
                            WalkCustomerRet(CustomerRet)
                        End If
                    End If
                End If
            Next j
        End Sub
    
        Private Sub WalkCustomerRet(ByVal CustomerRet As ICustomerRet)
            If (CustomerRet Is Nothing) Then
                Exit Sub
            End If
    
            'Go through all the elements of ICustomerRet
            'Get value of ListID
            Dim ListID1 As String
            ListID1 = CustomerRet.ListID.GetValue()
            'Get value of Name
            Dim Name5 As String
            Name5 = CustomerRet.Name.GetValue()
    
        End Sub
    
    End Class
    
    End Module
    

    Another problem I often see is the code jumping from a "retlist" to a "ret". This usually happens with queries e.g. ReceivePaymentQuery. It is not a problem with DoCustomerAdd. I only mention it here for reference when you are converting other methods.

    The code from OSR:

    Public Sub WalkReceivePaymentRet(ByVal ReceivePaymentRet As IReceivePaymentRetList)
        If (ReceivePaymentRet Is Nothing) Then
            Exit Sub
        End If
    

    Fix it like this:

    Public Sub WalkReceivePaymentRet(ByVal ReceivePaymentRetList As IReceivePaymentRetList)
    
        For a As Integer = 0 To ReceivePaymentRetList.Count - 1
            Dim ReceivePaymentRet As IReceivePaymentRet
    
            ReceivePaymentRet = ReceivePaymentRetList.GetAt(a)
    
            If (ReceivePaymentRet Is Nothing) Then
                Exit Sub
            End If