Hallo Gemeinde,
nach langer Zeit mal wieder ein Problem. Über VBA möchte ich eine ListBox füllen!
Wenn ich nicht Filtere dann klappt alles:
qs = "SELECT anArt_ID, anArt_Nummer & "" "" & anArt_NummerNachPunkt as anNrZusammen, anArt_Artikel, anStG_ID_F_ID FROM tblAnArtikel ORDER BY anArt_ID;"
Jetzt möchte ich die Abfrage filtern aus dem Formular das Textfeld (txtStoffID) die "anStG_ID" filtert "anStG_ID_F_ID" damit ich nur passende Werte angezeigt bekomme.
Hier mein Versuch:
qs = "SELECT anArt_ID, anArt_Nummer & "" "" & anArt_NummerNachPunkt as anNrZusammen, anArt_Artikel, anStG_ID_F_ID FROM tblAnArtikel WHERE anStG_ID_F_ID = me.txtStoffID ORDER BY anArt_ID;"
Leider habe ich keine Ahnung warum er mir einen Fehler auswirft.
Denke aber das ich irgendwelche " oder Klammern nicht eingefügt habe.
Oder kann jemand mir sagen was ich falsch mache???
Hier noch der ganze Block:
Private Sub lv_init(s As String)
Dim lvx As ListView
Dim oitem As ListItem
Dim qs As String
Dim rs As Dao.Recordset
Dim n As String, nn As String, nnn As String
Dim f As Form
n = "anArt_ID"
nn = "Art. Nr." ' Text in der Überschrift
nnn = "Artikelbeschreibung"
'qs = "SELECT anArt_ID, anArt_Nummer & "" "" & anArt_NummerNachPunkt as anNrZusammen, anArt_Artikel, anStG_ID_F_ID FROM tblAnArtikel ORDER BY anArt_ID;"
qs = "SELECT anArt_ID, anArt_Nummer & "" "" & anArt_NummerNachPunkt as anNrZusammen, anArt_Artikel, anStG_ID_F_ID FROM tblAnArtikel WHERE anStG_ID_F_ID = me.txtStoffID ORDER BY anArt_ID;"
Set f = Forms(s)
Set rs = CurrentDb.OpenRecordset(qs, dbOpenSnapshot, dbOpenForwardOnly)
Set lvx = f!LV.Object
With lvx
.ColumnHeaders.Clear
.ListItems.Clear
.View = lvwReport
'
.ColumnHeaders.Add , nn, nn, 1600
.ColumnHeaders.Add , n, n, 0
.ColumnHeaders.Add , , nnn, 9000
Do
Set oitem = .ListItems.Add(, , rs.Fields(1).Value)
oitem.SubItems(1) = rs(0) 'Spalte bereits in den Einstellungen über Header festgelegt.
oitem.ListSubItems.Add , , rs(2) 'die fehlt und muss deshalb hinzugefügt werden
rs.MoveNext
Loop Until rs.EOF
End With
rs.Close
End Sub
Gruß eines Codeschnipselaneinanderreihers :-\ und ich hoffe das ich es brauchbar erklären konnte!
Brallu
Hallo!
Willst du den Wert der Textbox im SQL-Text haben oder einen Bezug zur Textbox?
qs = "SELECT ... FROM tblAnArtikel WHERE anStG_ID_F_ID = " & me.txtStoffID.Value & " ORDER BY anArt_ID;"
' vs
qs = "SELECT ... FROM tblAnArtikel WHERE anStG_ID_F_ID = [txtStoffID] ORDER BY anArt_ID;"
Anm.: Die DBEngine kann mit Me. nichts anfangen, da die SQL-Ausführung nicht zum Klassenmodul des Formulars gehört.
Wenn du weiß, wie der SQL-Text aussehen soll, kannst den zusammengesetzten String aus VBA prüfen.
Ausgabe mit Debug.Print qs und den String im Direktbereich ansehen.
Übrigens: du kannst einer Listbox auch direkt eine SQL-Anweisung übergeben oder ein Recordset zuweisen.
Gruß
Josef
Danke Josef,
WHERE anStG_ID_F_ID = " & me.txtStoffID.Value & "das hat mir gefehlt!
Nur me. musste ich noch aufarbeiten 8)
Gruß
Brallu
Hallo Gemeinde,
leider hatte ich die falsche Vorlage ::)
In dieser Version bekomme ich den Fehler beim Kompiliren: Konstanter Ausdruck erforderlich! für (.Value)
Wenn ich versuche mit WHERE anStG_ID_F_ID = " & f.txtStoffID.Value & " zu filtern.
Ohne WHERE läuft der Code ohne zu murren durch.
Hat einer eine Idee was ich hier schon wieder nicht verstehe???
'alle Normen
Const QRY As String = _
"SELECT anArt_ID, anArt_Nummer & "" "" & anArt_NummerNachPunkt as anNrZusammen, anArt_Artikel, anStG_ID_F_ID FROM tblAnArtikel" & vbLf & _
"WHERE anStG_ID_F_ID = " & f.txtStoffID.Value & " & vbLf & _
"ORDER BY anArt_ID;"
Hier noch der komplette funktionierende Code:
Private Sub SetupListView()
Dim rs As DAO.Recordset 'DAO-Datenbankroutinen
Dim rsmn As DAO.Recordset
'Hier wird die Verbindung zur Datenbank aufgebaut in verbiindung mit Set weiter unten
Dim criteria As String
Dim li As MSComctlLib.ListItem
Dim f As Form
Set f = Forms("frmAnBearbeiten2Artikel")
'die Überschriften des ListView
Const hdr1 = "Art. Nr." ' Text in der Überschrift
Const hdr2 = "anArt_ID"
Const hdr3 = "Artikelbeschreibung"
'alle Normen
Const QRY As String = _
"SELECT anArt_ID, anArt_Nummer & "" "" & anArt_NummerNachPunkt as anNrZusammen, anArt_Artikel, anStG_ID_F_ID FROM tblAnArtikel" & vbLf & _
"ORDER BY anArt_ID;"
' WHERE anStG_ID_F_ID = " & f.txtStoffID.Value & "
With ctlZuordnung
.ColumnHeaders.Clear 'kontrollkästchen leeren
.ListItems.Clear 'alle Einträge löschen
.View = lvwReport 'Die Darstellung erfolgt in der Detailansicht
'
'Überschriften des Listview setzen
.ColumnHeaders.Add , hdr1, hdr1, 1900
.ColumnHeaders.Add , hdr2, hdr2, 0
.ColumnHeaders.Add , , hdr3, 14000
Set rs = db.OpenRecordset(QRY, dbOpenSnapshot, dbForwardOnly)
'öffnen der Daten rs (Abfrage, dbOpenSnapshot=Datensätze einlesen, dbForwardOnly=DS können nur vorwärts durchgeblättert werden)
Set rsmn = db.OpenRecordset("tblAnSatzUndArtikel", dbOpenDynaset, dbReadOnly)
'öffnen der Daten rsmn = "tblAnSatzUndArtikel",
'dbOpenDynaset = Zugriff auf die Daten (inaktueller Datenbank befindliche Tabellen und verknüpfte Tabellen und Abfragen)
'dbReadOnly = Änderungen sind an den Datensätzen nicht möglich.
Do Until rs.EOF
Set li = .ListItems.Add(, , rs("anNrZusammen"))
li.SubItems(1) = rs("anArt_ID") 'Spalte bereits in den Einstellungen über Header festgelegt.
li.ListSubItems.Add , , rs("anArt_Artikel") 'die fehlt und muss deshalb hinzugefügt werden
criteria = BuildCriteria("anArt_ID_F_ID", dbLong, rs("anArt_ID")) & " AND" & vbLf & _
BuildCriteria("anSatz_ID_F_ID", dbLong, Me.ctlAnSatzID)
'Kombination der Tabelle 'tblMatUndNorm' suchen
rsmn.FindFirst criteria
'Listitem ankreuzen, wenn die Suche erfolgreich war
li.Checked = Not rsmn.NoMatch
rs.MoveNext
Loop
'Aufräumen
rsmn.Close
rs.Close
End With
End Sub
Gruß und ich hoffe ihr versteht was ich hier schreibe :)
Brallu
Hallo,
was willst hier mit vbLf ?
eigentlich nix :-[ dachte das brauche ich wenn ich den Code in der nächsten zeile fortsetzen will!?!
Hallo,
man kann sich doch nicht einfach mal so Code zusammensuchen. Du willst doch SQL Code mit VBA zusammenstellen und da können nur Befehle und Funktionen verwendet werden die SQL konform sind. Neue Zeile im Code mit Leerzeichen und Unterstrich, wie Du es ja auch hast. Und das f. vor txtStoffID dürfte auch fehl am Platz sein. Auch das Value braucht man nicht. Versuche es mal so:
Const QRY As String = "SELECT anArt_ID, anArt_Nummer, anArt_NummerNachPunkt as anNrZusammen, anArt_Artikel, anStG_ID_F_ID" _
& " FROM tblAnArtikel WHERE anStG_ID_F_ID = " & Me.txtStoffID & " ORDER BY anArt_ID"
Hallo!
Const QRY As String = ...In diesem Fall muss alles hinter = ein konstanter Ausdruck sein.
=> Ändern von Konstante zur Variablen:
dim QRY As String
QRY = ...
Gruß
Josef
Moin Josef,
das hat mit gefehlt und jetzt läuft alles.
Ist halt schwierig wenn man keine Ahnung hat :)
Also allen die mir geantwortet haben ein dickes DANKE!!!!
Gruß
Brallu