MS Access-VBA-Schleife über die Liste

Ich denke, das sollte einfach sein, aber ich kann nicht den richtigen Weg finden, es zu tun. Ich habe ein paar Beispiele der situation, die ich bin versucht zu lösen, also werde ich beschreiben. Ich denke, dass Sie wahrscheinlich behandelt werden können mit der gleichen Lösung, aber wenn nicht, lass es mich wissen. Ich versuche, eine Schleife durch eine Liste von Werten, und führen Sie eine SQL-Abfrage für jeden. In einer situation, die Werte sind text, und in anderen, sind Sie nicht aufeinander folgenden ganzen zahlen.

Bearbeitet, um hinzufügen: ich habe gesagt, dass die Liste der Werte ist dynamisch, es kommt aus der Liste von ID-Werten in einem Kombinationsfeld gewählten. Jetzt sind diese Wesen werden als durch Komma getrennte Liste in meine variable mit dem Namen item_in_my_text_list und item_in_my_ID_list unten.

Etwas wie dieses:

item_in_my_text_list = "User-defined, mean, upper-bound"
For Each item_in_my_text_list(i)
    'run a query where i is part of the condition
    'I want to run the same query first the user-defined metric, then for the mean, then for the upper-bound
    'SQL should be "select metric, age, value into scenario where metric = 'user-defined'"
          SQL= "Select metric, age, value  into scenario WHERE metric = [i]
      DoCmd.SetWarnings False

          DoCmd.RunSQL SQL

          DoCmd.SetWarnings True

          SQL = ""
          rs.MoveNext

Loop

Die andere situation betrifft eine nicht-sequenzielle numerische Liste von ID-Werten:

item_in_my_ID_list = "7, 9, 15, 88"
For Each item_in_my_ID_list(i)
    'run a query where i is part of the condition
    'I want to run the same query first for 7, then for 9, then 15, and so on
          SQL= "Update thistable set x = y where ID = " & [i]
      DoCmd.SetWarnings False

          DoCmd.RunSQL SQL

          DoCmd.SetWarnings True

          SQL = ""
          rs.MoveNext

Loop

Was ist die richtige syntax für den Aufbau der Schleife? Wenn ich versuche, Split, es scheint, wie es gibt mir die Anzahl der Elemente in der Liste, so dass, wenn ich versuche, verwenden Sie [i] als Teil der Abfrage-Bedingung, die ich bekomme, 1, 2, 3 (je nach Anzahl der Elemente in der Liste), sondern als "Benutzer-definiert" oder die richtige ID-Wert.

Bearbeitet, um hinzufügen meine Lösung. Der Vorschlag von @mehow gab mir was ich brauchte, um diese Arbeit zu machen.

Set db = CurrentDb
'Delete records for algorithms that aren't selected

    Dim DeleteSQL As String
    DeleteSQL = "Delete from Scenario WHERE ID not in (" & Me.ListSelect & ")"

    db.Execute DeleteSQL, dbFailOnError

    DeleteSQL = ""

'for each of the IDs selected, copy the whole scenario
Dim i As Long
For i = 0 To UBound(Split(Me.ListSelect, ","))
    'find the records from the scenario table, and copy them for the "upper bound"
    SQL = "insert into scenario (a, b, c)"
    SQL = SQL & " SELECT a, b, c
    SQL = SQL & " FROM Scenario "
    SQL = SQL & " WHERE Scenario.Id= " & Trim(Split(Me.ListSelect, ",")(i)) 

    db.Execute SQL, dbFailOnError
    SQL = ""

    'reset user-defined values for both mean and upper bound
    Dim allMetrics As String
    allMetrics = "Central tendency, Upper bounding"

    Dim thisMetric As Long
    For thisMetric = 0 To UBound(Split(allMetrics, ","))
         Dim rs As DAO.Recordset
         Set rs = CurrentDb.OpenRecordset("SELECT Parameter FROM AllParameters WHERE Id= " & Trim(Split(Me.ListSelect, ",")(i)))

         Dim DefaultSQL As String
         If Not (rs.EOF And rs.BOF) Then
             Do Until rs.EOF = True
                DefaultSQL = "UPDATE defaults LEFT JOIN scenario ON defaults.Age = Scenario.Age SET Scenario." & rs("Parameter") & " = [defaults].[Value] "
                DefaultSQL = DefaultSQL & " WHERE defaults.ID =" & Trim(Split(Me.ListSelect, ",")(i))
                DefaultSQL = DefaultSQL & " And defaults.metric = '" & Trim(Split(allMetrics, ",")(thisMetric)) & "'"


                db.Execute DefaultSQL, dbFailOnError
                DefaultSQL = ""
                rs.MoveNext
             Loop

         End If

         rs.Close
         Set rs = Nothing
    Next
Next
InformationsquelleAutor kvibbertj | 2014-03-03
Schreibe einen Kommentar