VBA-Web JSON Несколько страниц - PullRequest
0 голосов
/ 06 сентября 2018

Я использую библиотеку VBA-Web для обработки входящих вызовов JSON в VBA:

https://github.com/VBA-tools/VBA-Web

Вот небольшой пример ответа (только 1 страница):

JSON Response

Вы можете видеть внизу, что возвращается "TotalPages". Ниже приведен мой код VBA:

Set Response = Client.Execute(Request)

RoutineErrors = 0

If Response.StatusCode = WebStatusCode.Ok Then

DoCmd.SetWarnings (WarningsOff)

TotalCount = Response.Data("TotalCount")

For i = 1 To TotalCount
    For Each Item In Response.Data("Items")(i)
        Select Case Item
            Case "ClientId"
                ClientId = Response.Data("Items")(i)(Item)
            Case "ClientName"
                ClientName = Response.Data("Items")(i)(Item)
                ClientName = Replace(ClientName, "'", "''")
            Case "TalkTimeInSeconds"
                TalkTimeInSeconds = Response.Data("Items")(i)(Item)
            Case "TransferTimeInSeconds"
                TransferTimeInSeconds = Response.Data("Items")(i)(Item)

                SQL = "INSERT INTO Call_Counts_Temp (ClientId,ClientName,TalkTimeInSeconds,TransferTimeInSeconds,DurationInSeconds,HoldTimeInSeconds) " & _
                      "VALUES ('" & ClientId & "','" & ClientName & "','" & TalkTimeInSeconds & "','" & TransferTimeInSeconds & "'" & _
                      ",'" & DurationInSeconds & "','" & TransferTimeInSeconds & "')"

                DoCmd.RunSQL SQL

            Case "DurationInSeconds"
                DurationInSeconds = Response.Data("Items")(i)(Item)
            Case "HoldTimeInSeconds"
                HoldTimeInSeconds = Response.Data("Items")(i)(Item)
        End Select
    Next
Next

End If

При i = 26 ошибок процесса:

Ошибка времени выполнения '9':

Индекс вне диапазона

Полагаю, именно тогда цикл переходит на страницу 2. Есть идеи, как написать код для этого? Это первый раз, когда я работал с вызовом JSON, поэтому я предполагаю, что способ написания моего кода в любом случае не очень эффективен. Спасибо!

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Возможно, попробуйте устранить внутренний цикл. Я думаю, что это наиболее вероятное место, где вы получаете «Индекс вне диапазона». Я думаю, что вы можете получить доступ к элементам JSON, как это:

For i = 1 To TotalCount

    ClientId = Response.Data("Items")(i)("ClientId")
    ClientName = Replace(Response.Data("Items")(i)("ClientName"), "'", "''")
    TalkTimeInSeconds = Response.Data("Items")(i)("TalkTimeInSeconds")
    TransferTimeInSeconds = Response.Data("Items")(i)("TransferTimeInSeconds")
    DurationInSeconds = Response.Data("Items")(i)("DurationInSeconds")
    HoldTimeInSeconds = Response.Data("Items")(i)("HoldTimeInSeconds")

    SQL = "INSERT INTO Call_Counts_Temp (ClientId,ClientName,TalkTimeInSeconds,TransferTimeInSeconds,DurationInSeconds,HoldTimeInSeconds) " & _
          "VALUES ('" & ClientId & "','" & ClientName & "','" & TalkTimeInSeconds & "','" & TransferTimeInSeconds & "'" & _
          ",'" & DurationInSeconds & "','" & TransferTimeInSeconds & "')"

    DoCmd.RunSQL SQL

Next

Еще одна вещь, которая может происходить, это то, что Response.Data("Items")(26) отсутствует один или несколько конкретных элементов, которые вы ищете. Или пусто?

0 голосов
/ 11 сентября 2018

Спасибо всем за помощь. Оказывается, есть параметр, который я могу отправить на страницу #, которую я хочу вернуть. Итак, я делаю первый звонок, чтобы узнать количество страниц, а затем перебираю каждую из них по отдельности.

0 голосов
/ 07 сентября 2018

Вы хотите что-то еще, как это:

For Each Item In Response.Data("Items")

    ClientId = Item("ClientId")
    ClientName = Replace(Item("ClientName"),"'","''")
    TalkTimeInSeconds = Item("TalkTimeInSeconds")
    TransferTimeInSeconds = Item("TransferTimeInSeconds")
    DurationInSeconds = Item("DurationInSeconds")
    HoldTimeInSeconds = Item("HoldTimeInSeconds")

    SQL = "INSERT INTO Call_Counts_Temp (ClientId,ClientName,TalkTimeInSeconds, " & _
           "TransferTimeInSeconds,DurationInSeconds,HoldTimeInSeconds) " & _
           "VALUES ('" & ClientId & "','" & ClientName & "','" & _
           TalkTimeInSeconds & "','" & TransferTimeInSeconds & "','" & _
           DurationInSeconds & "','" & HoldTimeInSeconds & "')"

            DoCmd.RunSQL SQL
 Next

Item - это словарь, поэтому вы можете обращаться к каждому ключу напрямую.

...