Neuigkeiten:

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

Mobiles Hauptmenü

<=Monat im aktuellen Jahr +6Monate

Begonnen von mad, Juli 23, 2020, 17:08:32

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

in einer Abfrage lasse ich folgendes Feld die nächste Prüfung abfragen:
Naechste_Pruefung: Format(DatAdd("m";[tblArtikel].[Pruefintervall];[tblPrüfAufträge].[PA_Datum]);"jjjj\.mm")
Ergebnisse sehen wie folgt aus:
2018.05
2018.11
2019.02
2020.05
2020.08
usw.

Nun lasse ich in einer nächsten Abfrage die nächsten Prüfungen auswerten:
Feld: Naechste_Pruefung
Funktion: Max
Kriterien: <=Format(Datum();"jjjj\.mm")

Alles soweit gut, es kommen nur die Artikel bei denen die Prüfung im Juli2020 spricht 2020.07 oder früher anstehen.

Nun meine Frage, wie muß ich das Kriterium <=Format(Datum();"jjjj\.mm") erweitern um auch noch die folgenden nächsten 6 Monate zu sehen? Wäre wie eine Vorschau!

Hätte jemand eine Idee?


Danke
mad

crystal

Hallo mad,

schlicht und einfach: du kannst Funktionen ja auch verschachteln.

Gestatte mir jedoch, hier auf die oft vernachlässigte und sehr mächtige Möglichkeit hinzuweisen, in Access eigene globale Funktionen auch z. B. für Such-Abfragen einzusetzen. Mit solchen Funktionen sind auch Berechnungen möglich, die etwas über den "Formel-Interpreter" von Access hinausgehen.

Was du dazu brauchst, ist eine Funktion in einem Modul, etwa so (Luftcode)

public function SuchKrit(lngPrimaryKey as Long, datDatum as date, strDiff as string) as string
...
(datdatum und strDiff irgendwie prüfen, ggf. sinnvolle Standardwerte setzen)
... 
SuchKrit = (irgendwas aus datDatum und strDiff berechnet)
end function

Eine solche globale Funktion kannst du dann in einer Such-Abfrage bemühen/benutzen (rechte Maustaste->aufbauen), so wie dort auch fest eingebaute Funktionen/Formeln ansprechbar sind. Wichtig ist "nur", dass diese Funktion "Public" ist und in einem "Modul" steht - dann wird sie von Access im Formel-Editor auch erkannt und angeboten.
Interessant ist die Möglichkeit, innerhalb einer solchen Funktion alles machen zu können, was einem so einfällt, inkl. Abfragen per DAO oder ADO, Dialoge, Zugriff auf externe Dateien, System-Variable, Registry usw. Entscheidend ist nur, dass Access eine solche Funktion akzeptiert. Wie der Rückgabewert der Funktion intern entsteht, ist nicht wichtig und kann auch nicht geprüft werden.

An anderer Stelle hier im Forum wurde allerdings und sehr wichtig/richtig darauf hingewiesen, dass Access innerhalb des Abfrage-Optimierers prüft, ob eine solche Funktion einen konstanten Wert zurückgibt oder sich der Wert von Datensatz zu Datensatz verändern kann, weil ein Datensatz-Wert selbst an die Funktion übergeben wird. Das ist sehr wichtig, denn im ersteren Fall wird die Funktion nur einmal zu Beginn der Abfrage ausgewertet und behält danach ihren Wert. Das kann aber recht einfach gelöst werden, indem man der Funktion z. B. den Primärschlüssel der betrachteten Tabelle übergibt, ohne in der Funktion selbst irgendwas damit zu machen (s.o. im Luftcode).

Oder du versuchst es eben mit einer verschachtelten Funktion mit DateAdd("m";6... und Format(..., indem du zum  ursprünglichen Prüfdatum nochmal 6 Monate hinzurechnest (Ausgabe in einem extra Feld, Bezug auf das zuvor berechnete Feld - oder alles als separate Abfrage "Prüftermine der kommenden 6 Monate").

Du könntest also auch schreiben (erneut Luftcode, nicht probiert)
<=Format(dateAdd("m";6;Datum());"jjjj\.mm")
'addiere 6 Monate zum aktuellen Datum und gebe es in der Form jjjj.mm aus

Ich hoffe, das genügt dir als schnelle Antwort...

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

mad

Hab micht fürs erste auf die einfachere Variante beschränkt:
Zitat<=Format(dateAdd("m";6;Datum());"jjjj\.mm")
Gibt mir das gewünschte Ergebnis aus.

An der umfangreichen Variante werde ich mich später versuchen.


Herzlichen Dank
mad