Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Bericht mit bestimmten Werten öffnen

Begonnen von Gueco315, August 23, 2023, 16:03:07

⏪ vorheriges - nächstes ⏩

Gueco315

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

Gueco315

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"));

MzKlMu

#2
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.
Gruß Klaus

Gueco315

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



Beaker s.a.

Hallo Günther,

Schau dir mal den Datentyp des Rückgabewertes von Month() an.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Gueco315

das ist vermutlich der Grund. Wie ermittele ich den Datentyp?

Beaker s.a.

Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

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"
Gruß Klaus

Gueco315

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

MzKlMu

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
Gruß Klaus

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ebs17

#11
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.
Mit freundlichem Glück Auf!

Eberhard

MzKlMu

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.
Gruß Klaus

Beaker s.a.

Danke Eberhard, danke Klaus, - dann ist wohl alles gesagt.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard