Tipp 0344 Datenbank-Abfrage nach Datum (DAO)
Autor/Einsender:
Datum:
  Dinko Hasanbasic
09.07.2003
Entwicklungsumgebung:   VB 6
Im Zusammenhang mit Datumsabfragen werden immer wieder gern Fehler gemacht. Grundsätzlich hat ein Datum in SQL-Anweisungen das folgende Format: #Monat/Tag/Jahr#
Wird das Datum erst zur Laufzeit als Variable in die SQL-Abfrage eingebaut, führt die Anweisung
 
... WHERE Datum = " & Format$(Date,"#m/d/yy#")
 
zu einem Fehler, da ggf. auf Grund landestypischer Systemeinstellungen die Format-Funktion die Trennstriche konsequent in Punkte umwandelt.
Mit der Anweisung
 
... WHERE Datum = " & Format$(Date, "\#m\/d\/yyyy\#")
 
kann die Format-Anweisung überlistet werden, in dem wie oben ausgeführt, die Trennstriche einfach als normale Zeichen ausgegeben werden.
Folgendes Beispiel führt ein Datumsabfrage nach in einer ComboBox ausgewähltem Datum aus.
 
Option Explicit

Private db As DAO.Database
Private rs As DAO.Recordset

Private Sub Form_Load()
  Dim strPath As String
  Dim strSQL As String

    strPath = App.Path
    If Right(strPath, 1) <> "\" Then strPath = strPath & "\"

    On Error GoTo err_FormLoad

    Set db = OpenDatabase(strPath & "artikel.mdb")

    strSQL = "SELECT DISTINCT Artikel.Datum FROM Artikel;"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly)

    With rs
      If Not (.BOF And .EOF) Then
        .MoveLast
        .MoveFirst
        While Not .EOF
          cboDatum.AddItem rs.Fields(0).Value
          .MoveNext
        Wend
      End If
    End With
    rs.Close
    Set rs = Nothing

    cboDatum.ListIndex = 0

exit_Sub:
    On Error GoTo 0
    Exit Sub

err_FormLoad:
  MsgBox "Fehlernummer " & Err.Number & Chr$(13) & Error$(Err), _
            vbCritical, "Fehler"

  Resume exit_Sub
End Sub

Private Sub cboDatum_Click()
  Dim strList As String
  Dim strSQL As String

  On Error GoTo err_cboClick

  strList = (cboDatum.List(cboDatum.ListIndex))

  strSQL = "SELECT * FROM Artikel WHERE Datum = " & _
           Format$(strList, "\#mm\/dd\/yyyy\#") & ";"

  Set rs = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly)

  If Not (rs.BOF And rs.EOF) Then
    rs.MoveLast
    rs.MoveFirst

    Set datRS.Recordset = rs

    txtFeld(0).DataField = "ArtikelNr"
    txtFeld(1).DataField = "ArtikelName"
    txtFeld(2).DataField = "Preis"
    txtFeld(3).DataField = "Datum"

    datRS.UpdateControls
  End If

exit_Sub:
    On Error GoTo 0
    Exit Sub

err_cboClick:
  MsgBox "Fehlernummer " & Err.Number & Chr$(13) & Error$(Err), _
            vbCritical, "Fehler"

  Resume exit_Sub
End Sub

Private Sub datRS_Reposition()
  With datRS
    .Caption = "  Datensatz " & .Recordset.AbsolutePosition + 1 & _
          " von " & .Recordset.RecordCount
  End With
End Sub

Private Sub Form_Terminate()
  On Error Resume Next

  rs.Close
  Set rs = Nothing

  db.Close
  Set db = Nothing

  On Error GoTo 0
End Sub
 
Hinweis
Um diesen Tipp ausführen zu können, muss die Microsoft DAO 3.x Object Library in das Projekt eingebunden werden.

Windows-Version
95
98/SE
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (10,3 kB) Downloads bisher: [ 1938 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Samstag, 27. August 2011