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.