2013-08-15 2 views
2

Я борется с этим в течение дня. У меня есть список, заполненный элементами x. Может быть 1 - xVBA - Зацикливание через x элементов в блоках по 100 раз

Мне нужно взять все элементы в списке и форматировать их в строку , которую я отправляю в базу данных оракула. Я использую INLIST на стороне SQL, и из-за этого в моей строке может содержаться не более 100 элементов.

Так, например, если бы у меня было 547 элементов в списке, я бы перебирал все 547 элементов, но каждые 100 я отправлял в базу данных, возвращая свой результат в мой класс коллекции, заканчивая последними 47

вот что у меня есть. Есть некоторые попытки решить мою проблему в коде, поэтому, если это смущает, я попытаюсь объяснить.

Public Function SearchBMS() 
On Error GoTo HandleError 

    Dim rst As ADODB.Recordset 
    Dim sESN As String 
    Dim i As Integer 
    Dim x As Integer 
    Dim maxrec As Integer 
    Dim itemcnt As Integer 
    Dim iBlockCount As Integer 

    With frmEngineCampaignSearch.lstbxESNNumbers 
     itemcnt = .ListCount - 2 
     'iBlockCount = GetBlockCount(itemcnt) 
      x = 0 
      maxrec = 100 
      Debug.Assert itemcnt = 200 

      For i = 0 To itemcnt 
       For x = i To maxrec 
        MsgBox "test", vbOKOnly 
       i = i + 100 
       Next x 
        If i = itemcnt Then ' if I = last item than we put the closing parenthesis on our string 
         sESN = sESN & "'" & .list(i) & "'" 
        Else 
         sESN = sESN & "'" & .list(i) & "' , " ' otherwise there are more items so we seperate by comma 
        End If 

        If itemcnt <= 100 Then 
         Set rst = Nothing 
         'Set rst = rstGetCustomerInfo(sESN) 
         'LoadRSTToCollection rst 
        elseif 

        While x = maxrec 
         MsgBox "submit first 100", vbOKOnly 
         'Set rst = Nothing 
         'Set rst = rstGetCustomerInfo(sESN) 
         'LoadRSTToCollection rst 
         sESN = gC_sEMPTY_STRING 
         maxrec = maxrec + 100 
        Wend 
        x = x + 1 

      Next i 
    End With 
HandleError: 
If Err.Number > 0 Then 
MsgBox Err.Number & ": " & Err.Description 

End If 

Эта функция, чтобы получить число раз я должен был бы выполнить представление, но я ударил дорожный блок, как использовать его в цикл

Public Function GetBlockCount(ByRef lItemCnt As Long) As Integer 
Dim x As Double 
If lItemCnt <= 100 Then 
    GetBlockCount = 1 
    Exit Function 
ElseIf lItemCnt > 100 Then 
    x = Round(lItemCnt/100) 
    If lItemCnt Mod 100 > 0 Then 
     x = x + 1 
    Else 
    GetBlockCount = x 
    Exit Function 
    End If 
End If 
End Function 

Любая помощь будет много оценили.

+0

не ответ на ваш вопрос, но это может помочь вам: в Oracle, вы можете сделать несколько ВХОДОВ, чтобы обойти ограничение 100 элемента , Например: 'x in (....) или x in (....) или x in (...)'. – Joe

+0

Разве вы не можете разделить свой счет на 100 и определить, является ли результат целым? Это будет только целое число, когда ваш счет равен 100, 200, 300 и т. Д. Затем обработайте код, если результат является целым числом, иначе продолжите добавление. –

ответ

0

Я думаю, вам нужно очистить его и сделать его более читаемым. Тогда посмотрите на это, и решение будет намного яснее.

Вот простой скелет, что он должен выглядеть следующим образом:

I = 100 
Txt = Get100Requests(I) 
Do While Txt <> "" 
    'use txt 
    I = I + 100 
    Txt = Get100Requests(I) 
Loop 

Function Get100Requests(FromItem As Integer) As String 
    If FromItem => frmEngineCampaignSearch.lstbxESNNumbers.ListCount Then Exit Function 
    Dim I As Integer 
    I + FromItem 
    Do While I < FromItem + 99 And I < frmEngineCampaignSearch.lstbxESNNumbers.ListCount 
    Get100Requests = Get100Requests & "'" & frmEngineCampaignSearch.lstbxESNNumbers.list(i) & "', " 
    I = I + 1 
    Loop 
    Get100Requests = Left(Get100Requests, Len(Get100Requests)-2) 
Exit Function 
+0

Спасибо за ответ, я вижу угол, который вы принимаете, и с небольшой настройкой это будет работать отлично. Весьма признателен. – keithD

Смежные вопросы