2 Stimmen

Verwendung von Arrays in der WHERE-Klausel einer SQL-Anweisung unter Verwendung von Access VBA

Ich habe ein Array ListBoxContents(), das die Elemente wie '15', '16', '25' enthält bis zu 10 Elemente. Ich versuche, Daten in der Spalte Bnummer abzurufen, bei denen die Datenlänge> 6 beträgt und mit ('15', '16', '25'...) beginnt, d.h. die Elemente, die in der Listbox angegeben sind. Und versuche, diese Listbox-Elemente im WHERE-Teil des SQL-Statements abzufragen

Die Tabellenspalte Bnummer enthält

 Bnumber
152
156
1523
16417
AA454
CC654
18A16
1826
18A16
25A76
54A16
54235A68

Mein VBA-Code

Private Sub arraywhere()
Dim qry As String 
Dim Size As Integer
Size = Form_Input_From.lstdigits.ListCount - 1
ReDim ListBoxContents(0 To Size) As String
ReDim LContents(0 To 30) As String       
Dim m As Integer    
For m = 0 To Size
    ListBoxContents(m) = Form_Input_From.lstdigits.ItemData(m)
Next m  

For m = 0 To Size
     qry = "SELECT col1,col2,Bnumber " & _
    "FROM table WHERE (Len([table].[Bnumber]))>6) AND (Left
     ([table].[Bnumber],2))=(" & ListBoxContents(m) & ");"
Next m   

Debug.Print qry    

Application.CurrentDb.QueryDefs("[arrayqry]").sql = qry
DoCmd.OpenQuery "[arrayqry]"

End Sub

Aber mein WHERE-Teil liest nur das letzte Array-Element. Wie spezifiziere ich das Array im WHERE-Teil?

6voto

Tim Williams Punkte 135514

Probieren Sie etwas Ähnliches aus

" ...  ([table].[Bnummer],2)) in ('" & Join(ListBoxContents,"','") & "');

0voto

Jeremy Cook Punkte 18882

Sie setzen qry bei jeder Iteration Ihrer For-Schleife auf eine neue Anweisung. Stattdessen müssen Sie einen String basierend auf den Inhalten Ihrer List-Box konkatenieren, der wie ("x", "y", "z") aussieht, und = durch in ersetzen.

Beenden Sie, indem Sie Ihre Abfrage einmal festlegen, sie wird ähnlich aussehen wie diese:

qry = "SELECT col1,col2,Bnumber " & _
"FROM table WHERE (Len([table].[Bnumber]))>6) AND (Left
 ([table].[Bnumber],2)) in (" & commaSeperatedContents & ");"

Wo commaSeperatedContents ein String ist, der wie ("x", "y", "z") aussieht, aber natürlich Ihre Werte enthält.

0voto

Dmitry Pavliv Punkte 34885

Versuchen Sie es mit diesem Code:

Dim inTeil As String

For m = 0 To Größe
    inTeil = inTeil & "'" & ListBoxInhalte(m) & "',"
Next m
inTeil = Left(inTeil, Len(inTeil) - 1)

qry = "SELECT col1,col2,Bnummer " & _
   "FROM [Tabelle] WHERE Len([Tabelle].[Bnummer])>6 AND " & _
   "Left([Tabelle].[Bnummer],2) In (" & inTeil & ");"
Debug.Print qry

CurrentDb.QueryDefs("[arrayqry]").SQL = qry
DoCmd.OpenQuery "arrayqry"

0voto

Yawar Punkte 10588

Die Liste der Elemente in Ihrem Array scheint tatsächlich vom Steuerelement Form_Import_From_PMT.lstdigits zu kommen. Ist dieses Steuerelement an eine Datenquelle gebunden? Falls ja, können Sie einfach Ihr table mit dieser Datenquelle mithilfe einer Join-Klausel verknüpfen, die angibt, dass nur Zeilen mit Bnumber-Werten, die mit den Ziffern in der verbundenen Tabelle beginnen, ausgewählt werden sollen:

select col1, col2, Bnumber
from table as t
inner join tblDigits as d
on left(t.Bnumber, 2) = d.Digits
where len(t.Bnumber) > 6

Wenn das Steuerelement nicht an eine Datenquelle gebunden ist, binden Sie es jetzt (indem Sie eine neue Tabelle tblDigits erstellen, um die Ziffern zu speichern, wie oben gezeigt), und Sie werden die obige Abfrage verwenden können.

Kurz gesagt, Datenbindung ist, wie Sie ein Array in einer where-Klausel in Access verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X