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.
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):
//
with '
(comments);
(semi-colons) ==
with =
For j = 0
with For j as Integer = 0
responseList.GetAt(i)
with responseList.GetAt(j)
.
(dot) Integerfor
with Integer
(next line) for
DataExtRet
with DataExtRet.
(only when it shows an error)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