2

私はこれに1日苦労しています。x 項目が入力されたリスト ボックスがあります。1 - x

リスト ボックス内のすべての項目を取得し、それらを文字列にフォーマットして、Oracle データベースに送信する必要があります。SQL 側で INLIST を使用しているため、文字列に最大 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

この関数は、送信を実行する必要がある回数を取得するためのものですが、for ループ内で使用する方法について障害が発生しました

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

どんな助けでも大歓迎です。

4

1 に答える 1

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
于 2013-08-15T18:42:44.453 に答える