Нужны все адреса клиентов (с уникальными идентификаторами) из QuickBooks QBFC13

У меня есть приложение, которое подключается к QuickBooks через QBFC13, загружает клиентов (просто имя, идентификатор и некоторые другие данные) и все известные адреса этих клиентов. Кажется, все это работает просто отлично, за исключением того, что нет GUID или другого уникального идентификатора, который, как я вижу, однозначно идентифицирует адрес. Так, например, заказчик меняет адрес в QuickBooks, мне нужно знать, какой изменился в приложении. Или я отправляю информацию в QuickBooks, используя идентификатор адреса, а не весь блок адресов 1-5. Я думал, что имя адреса будет уникальным, но это не так и может быть пустым. Непрактично и нецелесообразно отключать поля адреса. Этот GUID вообще существует? Я пропустил что-то действительно простое? Есть лучший способ это сделать? Документы QB ужасны!

Далее следует VBA, используемый для захвата клиентов и их адресов (некоторые фрагменты кода вырезаны для ясности).

    Dim respType As IResponseType
    Set respType = curResp.Type
    If (respType.getValue = rtCustomerQueryRs) Then
        Dim custList As ICustomerRetList
        Set custList = curResp.Detail

        Dim curCust As ICustomerRet
        Dim i As Integer
        Dim insSQL As String
        For i = 0 To custList.Count - 1
            insSQL = "INSERT INTO " & CustomerTableName _
                & "(CustomerID, QBEditSequence, Name, PhoneNumber, EMailAddress) " _
                & "VALUES " _
                & "("

            Set curCust = custList.GetAt(i)
            If (curCust.Sublevel.getValue = 0) Then
                insSQL = insSQL & "'" & curCust.ListID.getValue & "',"
                insSQL = insSQL & "'" & curCust.EditSequence.getValue & "',"
                insSQL = insSQL & "'" & Replace(curCust.Name.getValue, "'", "''") & "',"
                If (Not curCust.Phone Is Nothing) Then
                    insSQL = insSQL & "'" & curCust.Phone.getValue & "',"
                Else
                    insSQL = insSQL & "'',"
                End If
                If (Not curCust.Email Is Nothing) Then
                    insSQL = insSQL & "'" & curCust.Email.getValue & "');"
                Else
                    insSQL = insSQL & "'');"
                End If
                accessDB.Execute insSQL

                ' Add Bill to address
                If Not curCust.BillAddressBlock Is Nothing Then
                    If curCust.BillAddressBlock.Addr1 Is Nothing = False Then
                        rs.AddNew
                        rs!CustomerID = curCust.ListID.getValue
                        rs!AddressType = "B"
                        rs!Addr1 = curCust.BillAddressBlock.Addr1.getValue
                        If curCust.BillAddressBlock.Addr2 Is Nothing = False Then rs!Addr2 = curCust.BillAddressBlock.Addr2.getValue
                        If curCust.BillAddressBlock.Addr3 Is Nothing = False Then rs!Addr3 = curCust.BillAddressBlock.Addr3.getValue
                        If curCust.BillAddressBlock.Addr4 Is Nothing = False Then rs!Addr4 = curCust.BillAddressBlock.Addr4.getValue
                        If curCust.BillAddressBlock.Addr5 Is Nothing = False Then rs!Addr5 = curCust.BillAddressBlock.Addr5.getValue
                        rs.Update
                    End If
                End If

                ' Add Shipping Addresses
                Dim shpList As IShipToAddressList
                Set shpList = curCust.ShipToAddressList
                If Not shpList Is Nothing Then
                    Dim s As Integer
                    For s = 0 To shpList.Count - 1
                        Dim saddr As IShipToAddress
                        Set saddr = shpList.GetAt(s)

                        rs.AddNew
                        rs!CustomerID = curCust.ListID.getValue
                        rs!AddressType = "S"
                        rs!AddressName = saddr.Name.getValue
                        rs!IsDefault = saddr.DefaultShipTo.getValue
                        rs!Addr1 = saddr.Addr1.getValue
                        If saddr.Addr2 Is Nothing = False Then rs!Addr2 = saddr.Addr2.getValue
                        If saddr.Addr3 Is Nothing = False Then rs!Addr3 = saddr.Addr3.getValue
                        If saddr.Addr4 Is Nothing = False Then rs!Addr4 = saddr.Addr4.getValue
                        If saddr.Addr5 Is Nothing = False Then rs!Addr5 = saddr.Addr5.getValue
                        rs.Update

                    Next s
                End If

            End If

        Next i
    End If
End If

person Justin Tolchin    schedule 01.08.2018    source источник
comment
Я не эксперт QuickBooks, но AFAICT от использования их драйвера ODBC, нет отдельного идентификатора адреса (IIR Address ID - это что-то вроде домашнего адреса или рабочего адреса). По моему опыту, это не редкость. Если вы зеркалируете адреса, одно из решений состоит в том, чтобы хешировать их на своей стороне, а затем сканировать таблицы объектов QB и сравнивать их с вашими сохраненными хэшами.   -  person Comintern    schedule 02.08.2018
comment
Спасибо. Вот чего я боялся. Я просто надеялся, что есть лучший способ.   -  person Justin Tolchin    schedule 02.08.2018


Ответы (1)


использовал qb несколько лет назад и рассмотрел некоторые проекты того периода. заметьте, это было извлечено генератором отчетов qb внутри клиента, который, скорее всего, предоставляет усеченную запись.

нет предопределенного глобально уникального идентификатора адреса в виде отдельного поля для конкретного адреса. имя клиента/поставщика уникально для их соответствующего счета-отправителя, доставки-от/куда, но адрес для выставления счетов может совпадать с адресом доставки, и другие компании могут и используют одни и те же адреса. на самом деле это очень распространено среди нескольких видов бизнеса.

поэтому счет от 1 является уникальным заголовком/именем для поставщика, но сама адресная строка также может появляться в счете от 2, счете от 3 до 5 перед переходом к счету с улицы, улицы 2, города, штата, почтового индекса, страны и всего эти поля объединяются, чтобы создать длинную адресную строку с простым названием bill from.

к сожалению, у меня есть только xlsxm и csv. больше не имею доступа к qb, поэтому я не могу более внимательно изучить, что на самом деле могло бы предоставить полезную информацию

person ProfoundlyOblivious    schedule 02.08.2018