Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Mykis am März 28, 2023, 13:00:13

Titel: Zeiträumliche Abfrage
Beitrag von: Mykis am März 28, 2023, 13:00:13
Hallo,

zur Auswertung der Phänologie verschiedener Arten habe ich eine Abfrage mit der Auswahl von Monaten als Zahl,
also für Januar (01) bis Dezember (12). Ich kann also von Januar bis April problemlos meine Phänologie anzeigen lassen. Nicht gelöst habe ich die Abfrage von z. B. November bis März, also über die Jahreswende. Da werden immer alle Werte angezeigt. Gibt es eine Möglichkeit diesen Zeitraum auszuwerden?

LG
Frank
Titel: Re: Zeiträumliche Abfrage
Beitrag von: ebs17 am März 28, 2023, 13:08:36
Man darf wohl unterstellen, dass Deine Datensätze per Monatsfeld zeitlich verortet werden.
SELECT * FROM TabelleX
WHERE Monatsfeld >= 11 OR Monatsfeld <= 3

Beziehungsweise: Wie hast Du Informationen zu Zeiträumen/-punkten in Deiner Tabelle umgesetzt?
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 28, 2023, 14:19:51
Hallo Eberhard,

vielen Dank. So funktioniert die Abfrage über den Jahreswechsel. Bei Abfragen im gleichen Jahr muss ich dann aber
bei WHERE Monatsfeld >= 3 OR Monatsfeld <= 11 durch AND ersetzen!
Im Formular habe ich aber nur das Auswahlfeld "von" (Monat) und "bis" (Monat). Wie könnte ich da am besten die Abfrageklausel "automatisch" ändern?
In meiner Phänologietabelle sind die Zeiträume als Zahlen für den jeweiligen Monat (o1 bis 12) umgesetzt.

LG
Frank
Titel: Re: Zeiträumliche Abfrage
Beitrag von: MzKlMu am März 28, 2023, 16:17:16
Hallo,
wie genau sieht denn die Tabelle aus (Monatsfelder) ?



PS:
Hast Du jetzt Zahlen oder Text ?
01 ist keine Zahl, sondern Text, es gibt keine Ganzzahlen die eine 0 vorne haben.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 28, 2023, 16:46:13
Hallo Klaus,

das Feld ist Text, da es auf dem Teilstring des Datums basiert. Monat: Teil(Einzelnachweisliste!DATUM;4;2)

LG
Frank
Titel: Re: Zeiträumliche Abfrage
Beitrag von: ebs17 am März 28, 2023, 16:55:53
Zitatdurch AND ersetzen!
Wenn es Dir möglich ist, Zahlen zu haben, die gleichzeitig kleiner 4 und größer 10 sein können, dann tu das.
Zeige bitte solche Zahlen (die momentan außerhalb meiner Vorstellungswelt liegen).

Month(Datumsfeld)... erzeugt die Monatszahl (als Zahl!). Ohne eine Jahresangabe ist das verwendete Jahr unerheblich, sprich es betrifft schlicht alle Jahre, da ja jedes Jahr immer wieder die gleichen Monate hat.

Zahlenvergleich ist effizienter als Textvergleich (Computer erstehen immer noch nur Einsen und Nullen in der tiefsten Ebene).
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Beaker s.a. am März 28, 2023, 17:13:18
ZitatWie könnte ich da am besten die Abfrageklausel "automatisch" ändern?
Mit einem kompletten Datum vom Datentyp "Datum/Uhrzeit" und dem Operator "Between".
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 28, 2023, 17:14:48
Das Feldeigenschaft ist jetzt eine Zahl, der Effekt bleibt der gleiche. Mit der Bedingung

">=[Forms]![artphaenologie_1]![Kombinationsfeld24] Oder <=[Forms]![artphaenologie_1]![Kombinationsfeld26]"

kommen keine Einschänkungen auf die ausgewählten Monate zu Stande, wenn der erste Wert kleiner ist als der zweite.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 28, 2023, 17:21:59
Hallo Beaker,

Zitat von: Beaker s.a. am März 28, 2023, 17:13:18Mit einem kompletten Datum vom Datentyp "Datum/Uhrzeit" und dem Operator "Between".

Im Formular möchte ich nur die Namen der Monate von bis auswählen und kein Datum eingeben müssen.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: MzKlMu am März 28, 2023, 17:23:47
Hallo,
was ist denn das für ein Datumsfeld (Aufgabe/Sinn)?
Oder statt Und kann nicht richtig sein.
Auch wenn du das Datum verwendest kannst du die Monate zum Filtern verwenden.


Titel: Re: Zeiträumliche Abfrage
Beitrag von: ebs17 am März 28, 2023, 17:29:55
Zitatnur die Namen der Monate von bis auswählen
März ist aber etwas anderes als 3 ...

Arbeitest Du so, oder bist Du nur momentan verwirrt?
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Beaker s.a. am März 28, 2023, 17:34:18
Hallo,
In #7 ist die Syntax nicht korrekt
"...
WHERE DatumsFeld>=" & [Forms]![artphaenologie_1]![Kombinationsfeld24] & " OR DatumsFeld<=" & [Forms]![artphaenologie_1]![Kombinationsfeld26] & " ..."
Zu #8
Na und, wie du ein Datum anzeigst bleibt dir doch überlassen
DS-Herkunft der Kombis
SELECT Datumsfeld, Format(Datumfeld,"mmmm")
edit: uups,
SELECT Datumsfeld, Format(Datumfeld,"mmmm") FROM Tabelle1. Spalte gebunden mit Breite 0cm
In der Abfrage muss die Rückgabe der Kombis noch SQL-konform formatiert werden
... & Format$([Forms]![artphaenologie_1]![Kombinationsfeld24], "\#yyyy\-mm\-dd\#") & ...
gruss ekkehard
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 28, 2023, 19:08:04

Zitat von: ebs17 am März 28, 2023, 17:29:55Arbeitest Du so, oder bist Du nur momentan verwirrt?

Der Eindruck, dass ich verwiirt bin, liegt daran, dass ihr meine Fähigkeiten im Access überschätzt. :)
Hier nochmal mein eigentliches Anliegen: Ich wähle in einem Formular über ein Kombifeld eine Gattung aus und über zwei weitere Kombifelder "Monat von" und "Monat bis" und es werden dann die dazugehörigen Arten der Gattung (mit Anzahl) im Unterformular angezeigt. Das kann z.B. Januar bis April sein oder November bis März, wenn ich z. B. alle kälteliebenden Arten anzeigen will. Ich bekomme es aber immer nur bei einem dieser beiden Beispiele hin, ohne die Abfrageklausel umzustellen.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: MzKlMu am März 28, 2023, 19:26:05
Hallo,
wie heißt denn das Datumsfeld ?
Noch mal zu (meinem) Verständnis:
Zitatalle kälteliebenden Arten anzeigen will.
Was steht denn da für ein Datum drin. Ein Datum beinhaltet Tag, Monat und Jahr, macht da Tag und Jahr Sinn ?

Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 28, 2023, 20:19:23
Hallo Klaus,

das Datumsfeld in der Ursprungstabelle heißt "Datum", mit dem Format TT/MM/JJ. und in der Abfrage heißt es "Monat". Daraus wird momentan durch Teilstring (sicherlich unprofessionell!) der Monat (01-12) mit den dazugehörigen Monatsnamen erstellt und das Feld heißt dort "Monat". Tag und Jahr sind dabei völlig unwichtig! Z.B. Kälteliebende Arten wachsen meist zwischen November und April. Die Abfrage soll mir also in diesem Beispiel diese Arten anzeigen. Aber auch innerhalb eines Jahres muss die Phaenologie (welche Art wächst zu welcher Jahreszeit) auswählbar sein.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: ebs17 am März 28, 2023, 21:38:25
ZitatDie Phänologie im Deutschen Wetterdienst befasst sich mit den im Jahresablauf periodisch wiederkehrenden Wachstums- und Entwicklungserscheinungen der Pflanzen. Es werden die Eintrittszeiten charakteristischer Vegetationsstadien (Phasen) beobachtet und festgehalten. Sie stehen in enger Beziehung zur Witterung und zum Klima und eignen sich daher für die verschiedensten Anwendungsgebiete und für vielseitige wissenschaftliche Untersuchungen.
Bezugnehmend auf eine solche Definition erwartete ich keine exakten Datumswerte und keine Jahre, weil sich Jahreszeiten wiederholen.

Rückfrage: Über welchen Zeitraum insgesamt erstrecken sich Deine Datumswerte, vor allem jene, die ausgewertet werden sollen?

Wenn man einen einzelnen zusammenhängenden Zeitraum  betrachtet, würde man den Zeitraum einfach, sicher und variabel über die beiden Grenzwerte filtern:
WHERE Datumswert BETWEEN parVON AND parBISBeispiel:
November - März => zwischen 01.11.2022 und 31.03.2023
Januar - Juni => zwischen 01.01.2023 und 30.06.2023

Mit DateSerial kann man aus einer Monatszahl einen Monatsersten wie auch einen Monatsletzten berechnen, um dann solche Datumswerte in die Abfrage einzusetzen.
DateSerial(2023, 6 + 1, 0) => 30.06.2023
Titel: Re: Zeiträumliche Abfrage
Beitrag von: MzKlMu am März 28, 2023, 21:52:39
Hallo,
welchen Sinn macht hier ein Datumsfeld?
Ein Feld für eine Zahl (1-12) ist doch da völlig ausreichend.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 28, 2023, 23:47:51
Für die Auswertung der Phaenologie brauchen wir z. B. folgendes fiktives Ergebnis:


Frage: Welche Arten und wieviel Funde der Gattung "Agaricus" fruktifizieren von November - April ?

Datenbank-Antwort sollte sein:

Agaricus vernus (100 Funde)

Agaricus vernalis (99 Funde)

Agaricus printempus (88 Funde)

Agaricus praecox (77 Funde)
Titel: Re: Zeiträumliche Abfrage
Beitrag von: MzKlMu am März 29, 2023, 00:11:17
Hallo,
siehe #16.

Ein Datumsfeld ist doch dazu völlig unbrauchbar/ungeeignet.
Es reicht doch einfach nur den Monat als reine Zahl von 1-12 zu erfassen. Wozu ein vollständiges Datum.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: ebs17 am März 29, 2023, 10:37:28
Zwischen FRAGE und DatenbankANTWORT liegt die Tabelle mit Daten. Wie ist die aufgebaut?
Idealerweise so, dass man direkt einfache Abfragen ausführen kann => optimiert auf Verarbeitung, nicht auf Angucken durch Menschen.

Zum Angucken der Tabelleninhalte würde man also vielleicht eine andere Auswertung fahren. In jedem Fall muss man sich bewusst machen, dass die genaue interne Speicherung und eine Darstellung nach außen recht unterschiedlich sein können.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 29, 2023, 19:17:04
Also ich habe nochmal den ganzen Tag "gebastelt". Ein Feld einer Abfrage (egal welche Tabelle sich dahinter verbirgt), das nur die Zahlen 1-12 (meine Monate) enthält, kann man entweder so ">=1 AND <=7" (symbolisch für Januar bis Juni) filtern oder so ">=11 OR <=4" (symbolisch für November bis April) filtern. Das beides in einer Abfrage funktioniert, habe ich nicht hinbekommen.

LG
Frank
Titel: Re: Zeiträumliche Abfrage
Beitrag von: MzKlMu am März 29, 2023, 19:20:40
Hallo,
und noch mal die Frage, warum ist das ein Datum, das macht doch hier keinen Sinn.
Wenn Du hier eine einfache ZAhl (1-12) verwendest, dürfte das Ganze wesentlich einfacher werden.

Und wenn Du schon Beispiele machst, sollten die richtig sein.
Zitatso ">=1 AND <=7" (symbolisch für Januar bis Juni)
Das geht bis Juli.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 29, 2023, 20:24:33
Sorry, natürlich Juli!
Es geht doch nur noch um die einfachen Zahlen 1-12. Das Formular bringt mir entweder die Zahlen 1-12, dann muss ich in der Abfrage mit "AND" arbeiten oder es bringt die Zahlen 12-1, dann muss ich in der Abfrage mit "OR" arbeiten. Vielleicht drücke ich mich als Laie etwas umständlich aus, was man mir bitte verzeihen möge.
Ich könnte eventuell im Formular auch mit "CurrentDb.QueryDefs("Phaenologie_1)").SQL ="....." die SQL-Anweisung ändern, aber ich dachte, es geht eleganter.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: MzKlMu am März 30, 2023, 00:20:30
Hallo,
wenn Du die Monate von und bis gewählt hast, wie wird dann die Abfrage gestartet/aufgerufen?
VBA Code ?
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 30, 2023, 09:37:30
Moin,

die dazugehörige Abfrage ist die Datensatzquelle hinter dem Unterformular und die Monate von ud bis sind dann das Kriterium in dieser Abfrage. Wenn im Formular die entsprechende Auswahl getroffen wird, zeigt das verknüpfte Unterformular sofort das Ergebnis.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: MzKlMu am März 30, 2023, 11:29:02
Hallo,
zeige mal die Abfrage (SQL).
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 30, 2023, 12:01:00
Hier die SQL:

SELECT DISTINCTROW Count(Phaenologie_art2.art_nr) AS AnzahlVonDuplikaten, Phaenologie_art2.art_nr, Haupt.Gattung, [Gattung] & ' ' & [Art] AS artname, Monat.zahl1
FROM Monat INNER JOIN (Phaenologie_art2 INNER JOIN Haupt ON Phaenologie_art2.art_nr = Haupt.art_nr) ON Monat.Zahl = Phaenologie_art2.teil1
GROUP BY Phaenologie_art2.art_nr, Haupt.Gattung, [Gattung] & ' ' & [Art], Monat.zahl1
HAVING (((Haupt.Gattung)=[Forms]![ArtPhaenologie_1]![Auswahlfeld]) AND ((Monat.zahl1)>=[Forms]![ArtPhaenologie_1]![Kombinationsfeld24] And (Monat.zahl1)<=[Forms]![ArtPhaenologie_1]![Kombinationsfeld26]))
ORDER BY Count(Phaenologie_art2.art_nr) DESC;
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 30, 2023, 12:06:16
So sieht das Formular aus:

Phaenologie.png
Titel: Re: Zeiträumliche Abfrage
Beitrag von: ebs17 am März 30, 2023, 13:44:05
Was Du vorher verstehen solltest:
WHERE Monatsfeld >= 11 OR Monatsfeld <= 3
Das sind im Unterschied zum Zwischen-Kriterium ZWEI Kriterien, verknüpft über OR.

Du brauchst hier also zwei Auswahlen, die sich von der bisherigen Auswahl per ComboBoxes unterscheidet. Diese beiden Auswahlen wären dann zu einem Gesamtfilter zusammenzusetzen.
Monat.zahl1>=Forms!ArtPhaenologie_1!Kombinationsfeld24 And Monat.zahl1<=Forms!ArtPhaenologie_1!Kombinationsfeld26So etwas als Direkteintrag ist für die diskutierte Anforderung unbrauchbar.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 30, 2023, 14:35:59
Hallo Eberhard,

Zitat von: ebs17 am März 30, 2023, 13:44:05Du brauchst hier also zwei Auswahlen, die sich von der bisherigen Auswahl per ComboBoxes unterscheidet. Diese beiden Auswahlen wären dann zu einem Gesamtfilter zusammenzusetzen.

genau darum geht es mir.
Ich hatte als SQL oben nur die eine Abfragemöglichkeit kopiert. So wäre das zweite Kriterium definiert:

Monat.zahl1>=Forms!ArtPhaenologie_1!Kombinationsfeld24 OR Monat.zahl1<=Forms!ArtPhaenologie_1!Kombinationsfeld26
Ist denn da ein Gesamtfilter möglich? Ich habe das nicht hinbekommen und deshalb meine Anfrage im Forum.

Gruß
Frank
Titel: Re: Zeiträumliche Abfrage
Beitrag von: ebs17 am März 30, 2023, 15:20:59
ZitatIst denn da ein Gesamtfilter möglich?
Wenn Du den Filter in der Abfrage tauschst, sollte das gehen. Du müsstest aber auch die Kombinationsfelder tauschen.

HAVING (((Haupt.Gattung)=[Forms]![ArtPhaenologie_1]![Auswahlfeld]) AND ((Monat.zahl1)>=[Forms]![ArtPhaenologie_1]![Kombinationsfeld24] And (Monat.zahl1)<=[Forms]![ArtPhaenologie_1]![Kombinationsfeld26]))Diesen Teil wirfst Du aus der Abfrage raus.

Für eine praktische Umsetzung also vielleicht in der GUI:
1. zusätzliche Auswahlmöglichkeit (Optionsgruppe): Zeitraum im Jahr versus Zeitraum über Jahreswechsel

Select Case optAuswahl
   Case 1
      Me.Filter = "Monat.zahl1 >= " & Me.Kombinationsfeld24 & " AND Monat.zahl1 <= " & Me.Kombinationsfeld26
   Case 2
      Me.Filter = "Monat.zahl1 >= " & Me.Kombinationsfeld26 & " OR Monat.zahl1 <= " & Me.Kombinationsfeld24
End Select

Me.Filter = Me.Filter & " AND Haupt.Gattung = '" & Me.Auswahlfeld & "'"
Me.FilterOn = True
Diese Codesequenz in der Ereignisprozedur eines Buttons, der geklickt wird, wenn Deine Auswahl fertig ist.
Titel: Re: Zeiträumliche Abfrage
Beitrag von: Mykis am März 31, 2023, 17:35:27
Vielen Dank für eure Hilfe. Es funktioniert jetzt.

LG
Frank