Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Brallu am Februar 03, 2023, 19:50:31

Titel: Problem bei sql Abfrage in VBA
Beitrag von: Brallu am Februar 03, 2023, 19:50:31
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
Titel: Re: Problem bei sql Abfrage in VBA
Beitrag von: Josef P. am Februar 03, 2023, 20:08:13
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
Titel: Re: Problem bei sql Abfrage in VBA
Beitrag von: Brallu am Februar 03, 2023, 22:33:17
Danke Josef,
WHERE anStG_ID_F_ID = " & me.txtStoffID.Value & "das hat mir gefehlt!

Nur me. musste ich noch aufarbeiten  8)

Gruß

Brallu
Titel: Re: Problem bei sql Abfrage in VBA
Beitrag von: Brallu am Februar 06, 2023, 18:39:14
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
Titel: Re: Problem bei sql Abfrage in VBA
Beitrag von: MzKlMu am Februar 06, 2023, 19:44:58
Hallo,
was willst hier mit vbLf ?
Titel: Re: Problem bei sql Abfrage in VBA
Beitrag von: Brallu am Februar 06, 2023, 20:41:29
eigentlich nix  :-[  dachte das brauche ich wenn ich den Code in der nächsten zeile fortsetzen will!?!
Titel: Re: Problem bei sql Abfrage in VBA
Beitrag von: MzKlMu am Februar 06, 2023, 23:59:15
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"
Titel: Re: Problem bei sql Abfrage in VBA
Beitrag von: Josef P. am Februar 07, 2023, 08:02:33
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
Titel: Re: Problem bei sql Abfrage in VBA
Beitrag von: Brallu am Februar 07, 2023, 20:20:05
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