Hallo Zusammen,
ich bin am verzweifeln. Aufgabe scheint trivial, nur funktioniert leider nichts bei mir. Könnt ihr mir helfen?
Ich befinde mich in einem Formular in einem Datumsfeld. Hier selektiere ich ein Steuerelement und möchte mir dazu die zugehörigen Daten in einem Bericht, der auf die gleichen Daten zugreift, anzeigen lassen. Alle Versuche schlagen fehl. Also alle Datensätze im Bericht mit Monat "08" zum Beispiel ...
Dim selectedDate As Date
Dim strSQL As String
' Überprüfen, ob ein Datum ausgewählt wurde
If IsNull(Me.Datum) Then
MsgBox "Bitte wählen Sie ein Datum aus.", vbExclamation, "Fehlende Angaben"
Exit Sub
End If
' Das ausgewählte Datum abrufen
selectedDate = Me.Datum
' SQL-Abfrage für den Bericht erstellen
strSQL = "SELECT * FROM T-Arbeitszeiterfassung WHERE Datum like " & "'""*" & Format(selectedDate, "mm") & "*" & "'"""
Debug.Print strSQL
'Den Bericht mit der erstellten SQL-Abfrage öffnen
DoCmd.OpenReport "B-Arbeitszeiterfassung", acViewPreview, , strSQL
Obwohl der String wie im SQL Statement aussieht, läuft der Code auf einen Fehler.
Gruß Günter
Das "richtige" Sql Statement in der Abfrage sieht richtig so aus:
SELECT [T-Arbeitszeiterfassung].*, Format([Datum],"mm") AS Ausdr1
FROM [T-Arbeitszeiterfassung]
WHERE (((Format([Datum],"mm"))="08"));
Hallo,
das ist alles viel zu umständlich. Dem Druckbefehl kann man dierekt einen Filter übergeben zum Ausdruck der gewünschten Daten. Eine extra Abfrage braucht man da nicht.
Die Abfrage (die es aber nicht braucht) sieht dann so aus:
SELECT * FROM [T-Arbeitszeiterfassung] WHERE Monthk([Datum]) = 8
Aber wie gesagt, die Abfrage braucht es nicht.
Für den Filter im Druckbefehl wird einfach die Where Klausel (ohne das Schlüsselwort Where) verwendet.
Der Code reduziert sich dann wie folgt:
Dim strSQL As String
' Überprüfen, ob ein Datum ausgewählt wurde
If IsNull(Me.Datum) Then
MsgBox "Bitte wählen Sie ein Datum aus.", vbExclamation, "Fehlende Angaben"
Exit Sub
End If
DoCmd.OpenReport "B-Arbeitszeiterfassung", acViewPreview, , "Month(Datum)=8"
Was ist eigentlich mit dem Jahr, so kriegst Du doch den Monat 8 von mehreren Jahren, ist das gewünscht ?
Und warum Du für einen Monat ein Datum wählst erschließt sich mir auch nicht.
Hallo,
das sieht schon mal ganz gut aus! Bin einen Schritt weiter.
Leider klappt der dynamische Aufruf nicht!
Dim selectedDate As Date
Dim aktmonat
' Überprüfen, ob ein Datum ausgewählt wurde
If IsNull(Me.Datum) Then
MsgBox "Bitte wählen Sie ein Datum aus.", vbExclamation, "Fehlende Angaben"
Exit Sub
End If
'Den Monat aus Feld Datum ermitteln
aktmonat = Format(Datum, "mm")
Debug.Print aktmonat
'Hier kommt der gewünschte Wert, in diesem Fall 08 raus.
'DoCmd.OpenReport "B-Arbeitszeiterfassung", acViewPreview, , "Month(Datum)=08" (von dir hart codiert) funzt!
DoCmd.OpenReport "B-Arbeitszeiterfassung", acViewPreview, , "Month(Datum)='" & aktmonat & "'" (klappt leider nicht)
Wie ist die richtige Syntax?
Gruß Günter
Hallo Günther,
Schau dir mal den Datentyp des Rückgabewertes von Month() an.
gruss ekkehard
das ist vermutlich der Grund. Wie ermittele ich den Datentyp?
VBA-Online-Hilfe?
Hallo,
warum verwendest Du jetzt wieder Format für den Monat ?
Der Monat ist eine reine Zahl und der wird mit Month bestimmt.
Erkläre bitte erst mal was Du genau willst.
Warum verwendest Du ein Datum wenn Du einen Monat auswählen willst ?
Warum nimmst Du nicht ein Feld in das Du direkt den gewünschten Monat (1-12) eingibst ?
Was ist der aktMonat ? Für mich wäre der aktMonat der gerade aktuelle Monat, also 8.
Und noch mal die Frage: Was ist mit dem Jahr ?
Nebenbei, das ist auch so nicht ganz richtig. Der Monat hat keine führende 0, ich hatte auch keine drin.
.... "Month(Datum)=8"
Gelöst, der Code sieht nun wie folgt aus:
Private Sub Befehl111_Click()
Dim aktmonat As Integer
' Überprüfen, ob ein Datum ausgewählt wurde
If IsNull(Me.Datum) Then
MsgBox "Bitte wählen Sie ein Datum aus.", vbExclamation, "Fehlende Angaben"
Exit Sub
End If
' Den Monat aus Feld Datum ermitteln
aktmonat = Format(Datum, "mm")
DoCmd.OpenReport "B-Arbeitszeiterfassung", acViewPreview, , "Month(Datum)= '" & aktmonat & "'"
End Sub
Hallo,
oder einfach so:
Private Sub Befehl111_Click()
' Überprüfen, ob ein Datum ausgewählt wurde
If IsNull(Me.Datum) Then
MsgBox "Bitte wählen Sie ein Datum aus.", vbExclamation, "Fehlende Angaben"
Exit Sub
End If
DoCmd.OpenReport "B-Arbeitszeiterfassung", acViewPreview, , "Month(Datum)= " & Month(Datum)
End Sub
Hallo,
An dieser Stelle
aktmonat = Format(Datum, "mm")würde ich einen LZF erwarten, da "aktmonat" als Integer
deklariert ist.
Schlägt da die explizite Typumwandlung von VBA zu?
gruss ekkehard
Ja, aktmonat ist an der Stelle als Integer definiert, und VBA macht viel möglich, SQL selber ist da sturer und weniger fehlertolerant.
Spaßeshalber sollte man probieren: Format(Datum, "mmmm") - ein ausgeschriebener Name ist doch viel übersichtlicher als solch eine dumme Zahl.
Die Verwendung von "Datum" als Bezeichnung tendiert auch zum Spiel mit dem Feuer.
Man tritt in jede nur erreichbare Pfütze und wundert sich dann, wenn ganz plötzlich und überraschend und unbegreiflich die Socken nass werden.
Hallo,
.... "Month(Datum)= '" & aktmonat & "'"Das wird ja auch tolleriert, obwohl es rein objektiv betrachtet falsch ist.
Vergleich einer Zahl mit einer Zahl (Integer) und Verwendung von Hochkomma.
Danke Eberhard, danke Klaus, - dann ist wohl alles gesagt.
Zitatdann ist wohl alles gesagt
Alles? Das ist relativ.
Hier im Thema war der Schwerpunkt das überhaupt Funktionierens, nicht das GUT Funktionieren - Stichwort Indexnutzung und dafür brauchbares Kriterium. Ohne Verständnis von Datentypen führt eine zusätzliche Erläuterung aber vmtl. zu Überforderung.