私は長い間、Intuit for Quickbooks SDK の貧弱なコード サンプルにうんざりしていました。そうは言っても、私はまだそれらを使用しています。コードを修正した後、それらは非常に便利です。
Intuit Quickbooks SDK QBFC7Lib への参照も追加する必要があります。バージョンによって若干異なる場合があります。
コードを使いやすくするために必要なことは次のとおりです ([編集] > [クイック置換] を使用)。
- (コメント)
//に置き換えます' 
- すべて削除
;(セミコロン) 
==と置き換えます=  
For j = 0と置き換えますFor j as Integer = 0  
responseList.GetAt(i)と置き換えますresponseList.GetAt(j)  
- 末尾
.(ドット)を削除 
- (次の行)
Integerforに置き換えますIntegerfor 
- に置き換えます
DataExtRet(DataExtRet.エラーが表示された場合のみ) 
- 他のエラーがないか確認してください
 
- いらないものは削除
 
初めて実行するときは、Quickbooks を開いて、Quickbooks から許可を与える準備ができている必要があります。エラーを修正したサンプルを次に示します。
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
私がよく目にするもう 1 つの問題は、コードが「retlist」から「ret」にジャンプすることです。これは通常、ReceivePaymentQuery などのクエリで発生します。DoCustomerAdd の問題ではありません。ここでは、他のメソッドを変換するときの参考としてのみ言及します。
OSR からのコード:
Public Sub WalkReceivePaymentRet(ByVal ReceivePaymentRet As IReceivePaymentRetList)
    If (ReceivePaymentRet Is Nothing) Then
        Exit Sub
    End If
次のように修正します。
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