Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: newbee_ferdi am Dezember 22, 2018, 12:38:56

Titel: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: newbee_ferdi am Dezember 22, 2018, 12:38:56
Hallo!
Vor geraumer Zeit bekam Mac-Wolf aus seine Frage, wie er denn den aktuellen Monatszeitraum im Formularfilter realisieren kann, die Antwort - so weit, so gut - :
Zitat

    Ich möchte per VBA ein Formular nach dem aktuellen Monat filtern.

Code: [Auswählen]

Me.Filter = "beleg_datum >= DateSerial(Year(Date()), Month(Date()), 1)" & _
      " And beleg_datum < DateSerial(Year(Date()), Month(Date()) + 1, 0)"
Me.FilterOn = True


Nun stehe ich aber vor zwei Herausforderungen, an denen ich mir gerade die Hirnwindungen wund scheuere:
Erstens: wie muß dieser Filter formuliert werden (Syntax-Problem?), damit nach einem beliebigen Monat gefilter werden kann (der wird aus einem Kombi-Feld "cboDatum" gewonnen)?

Zweitens:
Wie sieht dann die Syntax aus, so dass auch "DSum ..." diese verarbeitet (nach: "cboGesamt = DSum("[Betrag]", "[tblBuchungen]", ...)?

Vielen Dank und Gruß von
newbie_ferdi
Titel: Re: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: Beaker s.a. am Dezember 22, 2018, 13:34:22
Hallo,
Me.Filter = "beleg_datum >= DateSerial(Year(Date()), " & DeineMonatsVariable & ", 1)" & _
      " And beleg_datum < DateSerial(Year(Date()), " & DeineMonatsVariable +1 & ", 1)"

gruss ekkehard
Titel: Re: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: Lachtaube am Dezember 22, 2018, 13:56:24
Aus dem VBA-Direktfenster:
Criteria$ = vbNullString
EinDatum  = #2016-11-04#
M%        = Month(EinDatum)
Y%        = Year(EinDatum)

Criteria = BuildCriteria("Buchungsdatum", dbDate, "between " & _
                         DateSerial(Y, M, 1) & " and " & _
                         DateSerial(Y, M + 1, 0))
?Criteria
Buchungsdatum Between #11/1/2016# And #11/30/2016#
Titel: Re: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: newbee_ferdi am Dezember 22, 2018, 14:44:08
Hallo ekkehard,
vielen Dank für deine schnelle Antwort!
Die mich - wie das bei einem VBA-Anfänger wohl so sein muss - vor neue Probleme stellt:
- bei dem von mir so eingegebenen Code werden die Buchstaben im Editor nicht von 'klein' auf 'groß' geändert, wie man das ja erwarten würde "(year(date())" bleibt so .... ???
- und ich bekomme bei der Ausführung die Laufzeitfehlermeldung 3709: "Der Suchschlüssel wurde in keinem Datensatz gefunden." (Der Fehlermarker steht dann beim Programmabbruch aber nicht in der Fehlerzeile, sondern in der darunter, also: "FilterOn = True"

Nun ist also erst recht Fehlersuche angesagt, denn der muss ja woanders liegen.  :(
Gibt es da Tips??? (Code im Debugger kompilieren und DB reparieren hab ich durch - keine Änderung).

@Lauchtaube:
vielen Dank auch dir! ..... sobald ich durchdrungen habe, wie ich deinen Code sinvoll einbinden kann, werd ich es sicher versuchen ...

Gruß,
newbie_ferdi
Titel: Re: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: Lachtaube am Dezember 22, 2018, 15:03:46
Das, was innerhalb der Zeichenkette steht, wird vom Ausdruckdienst ausgeführt und wird von VBA wie jeder andere Text (String) behandelt, ohne darin irgendwelche Schlüsselworte zu erkennen.


Um weiter helfen zu können, müsste man den verwendeten Code kennen und im Fall des Kombifelds wissen, wie es seine Daten bezieht (Datensatzherkunft), wieviele Spalten es hat, welche Spalte die gebundene Spalte ist und auch, ob der Felddatentyp Datum in der Tabelle für besagtes Feld verwendet wird.
Titel: Re: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: Beaker s.a. am Dezember 22, 2018, 16:53:47
Hallo,
Zitatwie ich deinen Code sinvoll einbinden kann
Ganz einfach,
Me.Filter = Criteria
Wobei du "EinDatum" mit einem Tabellen-/Formularfeld füllen musst.
gruss ekkehard
Titel: Re: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: newbee_ferdi am Dezember 22, 2018, 17:10:26
Hallo nochmals - insbesondere an ekkehard und Lachtaube!
Nach diversen weiteren Prüfungen um damit diverse weitere Fehlermeldungen auszu-"knipsen" funzt die Monatsfilterung jetzt!
SUPER - Danke nochmals!
(Schön, wie schmerzhaft langsam man sich VBA durch "learning by doing" annhähert ... LOL)
Frage an die ganze Leserschaft:
Ich hatte ja eine zweite Herausforderung gepostet, die mit dem "DSum" - Aufruf im gleichen Kontext.
Sollte ich die nochmal in einem neuen thread stellen und diesen hier mit "Topic closed" zumachen?
(Für "Forum-Profis" stellt sich die Frage wohl kaum - als Newbie hab ich da mein Bauchgefühl, das mir 'ja' sagt.)
Gruß,
newbie_ferdi
Titel: Re: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: Lachtaube am Dezember 22, 2018, 17:21:54
Deine erarbeitete Lösung sollte doch für beide Zwecke anwendbar sein.
Titel: Re: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: newbee_ferdi am Dezember 22, 2018, 18:01:44
Daran arbeite ich auch mit ungebrochenem Forschergeist weiter ... LOL

Sauber funzt die Summierung für einen (frei gewählten) Tag:
cboGesamt = DSum("[Betrag]", "[tblBuchungen]", "[Buchungsdatum] = " & "cboDatum")

Das bislang beste Ergebnis für einen Monat :

cboGesamt = DSum("[Betrag]", "[tblBuchungen]", "[txtBuchungsdatum] >=" & DateSerial(Year(Date), cboDatum, 1) & " And [txtBuchungsdatum] <" & _
        DateSerial(Year(Date), cboDatum + 1, 0))

bringt mir den Fehler#6: "Überlauf"
(alle anderen Versuche endeten 'schlimmer')
[dass da jetzt 'txtBuchungsdatum' erscheint, geht auf einen weiteren, erfolglosen Versuch zurück. - Spielt also keine Rolle, keine der Varianten funzt.]
sniff .. vorübergehend (wieder mal) ratlos
Titel: Re: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: PhilS am Dezember 22, 2018, 19:00:21
Zitat von: newbee_ferdi am Dezember 22, 2018, 18:01:44
Sauber funzt die Summierung für einen (frei gewählten) Tag:
cboGesamt = DSum("[Betrag]", "[tblBuchungen]", "[Buchungsdatum] = " & "cboDatum")

Das bislang beste Ergebnis für einen Monat :

cboGesamt = DSum("[Betrag]", "[tblBuchungen]", "[txtBuchungsdatum] >=" & DateSerial(Year(Date), cboDatum, 1) & " And [txtBuchungsdatum] <" & _
        DateSerial(Year(Date), cboDatum + 1, 0))

bringt mir den Fehler#6: "Überlauf"

Diese beiden Codebeispiele erscheinen etwas widersprüchlich. Was genau enthält cboDatum? Oder handelt es sich um zwei verschiedene Steuerelemente, die nichts miteinander zu tun haben?
Für das erste Beispiel sollte cboDatum ein vollständiges Datum enthalten, für das zweite nur einen Monat (1-12), Du kannst mit der Month-Funktion auch den Monat aus einem Datum ermitteln.

Generell hast du im zweiten Beispiel das Problem, dass du die Datumswerte im SQL begrenzen (https://codekabinett.com/rdumps.php?Lang=1&targetDoc=vba-sql-string-tutorial#sql-strings-datum) musst.

Titel: Re: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: Lachtaube am Dezember 22, 2018, 20:01:42
Wir können leider Deine Szenerie nicht erraten.
Wenn die Auswertung vom Ausdruckdienst über die Funktion DateSerial() erfolgt (Ekkehards Vorschlag), kommt man ühne Rauten aus. Lässt man sich die beiden Daten jedoch in VBA ermitteln, so müssen Rauten jedes Datumsliteral umschließen. Wenn man ein Datum aus VBA ausgibt, werden die Regional-Einstellungen aus der Windows-Systemeinstellung verwendet, die nur mit US-Einstellungen es erlauben, "#" & Datumsvariable & "#" zu verwenden. Hierzulande verwenden wir aber gewühnlich den Punkt als Datumstrennzeichen und setzen den Tag und nicht den Monat an den Anfang des Ausdrucks. Deshalb muss der String umgeformt werden. Wie schon gezeigt, ist die Verwendung von BuildCriteria() dafür geeignet. Man kann aber auch ganz plump die Sache manuell aneinanderfügen oder sich die Format()-Funktion zur Hilfe rufen.

Hier noch einmal zum Nachvollziehen aus dem VBA-Direktfenster (zum Nachvollziehen im VBA-Editor Strg-G betätigen und hinter jeder Code-Zeile die Eingabetaste drücken)

'in einem allgeinen Modul oben folgende Deklaration verwenden

'Public Const JetDateFmt As String = "\#yyyy-mm-dd\#"

'hier im Direktbereih setze ich zur Demonstration eine Variable dafür ein
JetDateFmt$ = "\#yyyy-mm-dd\#"

'in der Prozedur dann Variablen deklarieren, um Zwischenergebnisse festzuhalten
'Dim Monat      As Integer
'Dim Jahr       As Integer
'Dim StartDatum As Date
'Dim EndDatum   As Date

'ich simuliere ein Datum aus dem Kombifeld
cboDatum = #2018-04-24#

'Jetzt wird der Monat bestimmt
Monar = Month(cboDatum)

'und das Jahr
Jahr = Year(cboDatum)

'jetzt wird der Monatserste ermittelt
StartDatum = DateSerial(Jahr, Monat, 1)
'und danach der letzte Tag des Monats
EndDatum = DateSerial(Jahr, Monat + 1, 0)

'Überprüfung, ob die Aussage stimmt:
?StartDatum
01.12.2017

?EndDatum
31.12.2017

'beide Daten müssen nun so formatiert werden; zur Überprüfung:
?Format$(StartDatum, JetDateFmt)
#2017-12-01#

?Format$(EndDatum, JetDateFmt)
#2017-12-31#

'so, nun ist Funktionsweise bekannt und es kann der Text verklebt werden
'hier mit Zeilenumbruch, damit es im Forum lesbar ist
? "DatumsfeldInTabelle >= " & Format$(StartDatum, JetDateFmt) & " AND " & _
  "DatumsfeldInTabelle <= " & Format$(EndDatum, JetDateFmt)
DatumsfeldInTabelle >= #2017-12-01# AND DatumsfeldInTabelle <= #2017-12-31#

'oder mit BuildCriteria(), welches das US-Datumsformat verwendet:
? BuildCriteria("DatumsfeldInTabelle", dbDate, ">=" & StartDatum) & " AND " & _
  BuildCriteria("DatumsfeldInTabelle", dbDate, "<=" & EndDatum)
DatumsfeldInTabelle>=#12/1/2017# AND DatumsfeldInTabelle<=#12/31/2017#
Titel: Re: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: newbee_ferdi am Dezember 23, 2018, 10:06:37
moin Phil,
um deine Fragen nicht unbeantwortet im Raum stehen zu lassen:
"cboDatum" ist für beide Fälle identisch. Es enthält einen Datumswert (im Datumsformat).
An der Eingrenzung im sql versuche ich mich gerade - bin da aber noch "tritt-unsicherer" als in VBA an und für sich.

Der Kern des Problems besteht ja immer noch darin, diese Eingrenzung in die (ansonsten funktionierende) "DSum ..." - Berechnung zu bekommen.
Titel: Gelöst: Erweiterung der (schon älteren) Frage zu "Datumsfilter für einen Monat"
Beitrag von: newbee_ferdi am Dezember 23, 2018, 11:06:51
Hallo liebe Leute und ....
HEUREKA! - es funzt!

Dank der wertvollen Hinweise, die Datumsformate aus sql "VBA-verdaulich" zu machen (oder umgekehrt) bin ich zu der Lösung meines "DSum"-Problems über einen beliebigen Monat zu der (endlich!!!) funktionierenden Codezeile gekommen:

cboGesamt = DSum("[Betrag]", "[tblBuchungen]", "[Buchungsdatum] >=" & strDateStart & " And [Buchungsdatum] <" & _
        strDateEnd)

wozu ich die Parameter "strDateStart" und "strDateEnd" wie folgt vorbereitet habe:

Dim strDateMod As String
Dim strDateStart As String
Dim strDateEnd As String
strDateMod = Format(cboDatum, "\#yyyy\-mm\-dd\#")
strDateStart = Format(DateSerial(Year(cboDatum), Month(cboDatum), 1), "\#yyyy\-mm\-dd\#")
strDateEnd = Format(DateSerial(Year(cboDatum), Month(cboDatum) + 1, 0), "\#yyyy\-mm\-dd\#")

Womit sich nach dem Durchlauf folgende Variableninhalte ergeben (aus dem Direktfenster):

cboDatum= 26.11.2018
strDateMod= #2018-11-26#
strDateStart= #2018-11-01#
strDateEnd= #2018-11-30#
cboGesamt= -453

Besonderen Dank nochmal an ekkehard, Lachtaube und Phil: ihr habt mir nicht nur zur Lösung verholfen, sondern meinen ACCESS- und VBA Forscherdrang wieder (weiter) belebt!!
--> Problem solved!

greetings,
newbie_ferdi