Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Kriterein für ein DatSeriell - Feld

Begonnen von GSt, September 23, 2019, 14:09:15

⏪ vorheriges - nächstes ⏩

GSt

Hallo,
danke an alle die hier weiterhelfen!

Ich habe schon einige ähnliche Probleme gefunden - aber nix passt so richtig (wobei ich leider noch nicht alles verstehe)...

Vorab: Ich kenne mich (derzeit) werde mit VBA noch mit SQL aus. Daher wäre es schön, es gäbe eine Lösung "zu Fuß".

...Es soll hier einmal um eine Gebutstagsansicht gehen. Ich möchte beim Aufrufen eines Formulares die Gebutstage der nächsten sieben Tage angezeugt bekommen, um Glückwünsche vorzubereiten oder Präsente zu kaufen...

Mein Lösungsansatz:
1. Geburtsdaten in Jahr, Monat und Tag unterteilen, um eine sinnvolle Sortierung zu ermöglichen.
2. Über DatSeriell die Gebutstage im aktuellen Jahr ermitteln. Diese habe ich zusammengesetz aus dem aktuellen Jahr, sowie dem Monat und Tag aus den Gebutstagen.
3. Die Annahme war jetzt, dass ich für das DatSeriell - Feld ein Kriterium > datum() UND > datum()+ 7 anlegen kann und somit die Auswahl auf diese Tage erhalte.

Leider geht das wohl nicht, denn es werden dann die Parmeter für GebutsMonat, -Jahr, und -Tag abgefragt...

Für diejenigen, die sich auskennen: So sieht mein Veruch in SQL aus.

SELECT tbl_Mitarbeiter.mitarNameAnzeige, tbl_Mitarbeiter.mitarDatumGeburt, Month([mitarDatumGeburt]) AS GeburtsMonat, Day([mitarDatumGeburt]) AS GeburtsTag, Year([mitarDatumGeburt]) AS GeburtsJahr, DateSerial(Year(Date()),[GeburtsMonat],[GeburtsTag]) AS Geb_in_diesem_Jahr
FROM tbl_Mitarbeiter
WHERE (((DateSerial(Year(Date()),[GeburtsMonat],[GeburtsTag]))>Date()<Date()+7))
ORDER BY Month([mitarDatumGeburt]), Day([mitarDatumGeburt]), Year([mitarDatumGeburt]) DESC;

Ich freue mich, wenn jemand einen Ansatz für mich hat, was ich anders machen kann oder womein gedanklicher Feghler liegt. Danke!

MzKlMu

#1
Hallo,
so:
....WHERE DateSerial(Year(Date()),Month([mitarDatumGeburt]),Day([mitarDatumGeburt]))
>=Date() And DateSerial(Year(Date()),Month([mitarDatumGeburt]),Day([mitarDatumGeburt])))<=Date()+7

Oder einfacher und kürzer so:
.... WHERE DateSerial(Year(Date()),Month([mitarDatumGeburt]),Day([mitarDatumGeburt]))
Between Date() And Date()+7

In beiden Fällen fehlt das And.
Wenn Du das heutige Datum und das in 7 Tagen einschließen willst, musst Du >= und <= verwenden.

Gruß Klaus

GSt

Hallo Klaus,
danke für die beiden Offerten, allerdings bekomme ich jetzt eine Fehlermeldung:
Datentypenkonflikt in Kriterienausdruck.

Diese Fehlermeldung hatte ich schon bei verschiedenem, was ich ausprobiert habe...

... und ich verstehe eben auch nicht warum, denn DatSeriell und Datum sind doch Datumsfelder? Oder?

MzKlMu

Gruß Klaus

ebs17

Achtung: Auch bei dann richtiger Syntax wird der Ansatz bei Jahreswechsel nicht ausreichend sein.
Da könnte man sich vergleichend folgenden Ansatz ansehen: Geburtstagsliste sortiert mit Altersberechnung und Hervorhebung von runden Geburtstagen
Mit freundlichem Glück Auf!

Eberhard

GSt

@MzKlMu

na, erst...

SELECT tbl_Mitarbeiter.mitarNameAnzeige, tbl_Mitarbeiter.mitarDatumGeburt, Month([mitarDatumGeburt]) AS GeburtsMonat, Day([mitarDatumGeburt]) AS GeburtsTag, Year([mitarDatumGeburt]) AS GeburtsJahr, DateSerial(Year(Date()),[GeburtsMonat],[GeburtsTag]) AS Geb_in_diesem_Jahr
FROM tbl_Mitarbeiter
WHERE DateSerial(Year(Date()),Month([mitarDatumGeburt]),Day([mitarDatumGeburt]))
>=Date() And DateSerial(Year(Date()),Month([mitarDatumGeburt]),Day([mitarDatumGeburt]))<=Date()+7

(hier war eine Klammer zuviel, die ich gelöscht hatte)

...und dann so:

SELECT tbl_Mitarbeiter.mitarNameAnzeige, tbl_Mitarbeiter.mitarDatumGeburt, Month([mitarDatumGeburt]) AS GeburtsMonat, Day([mitarDatumGeburt]) AS GeburtsTag, Year([mitarDatumGeburt]) AS GeburtsJahr, DateSerial(Year(Date()),[GeburtsMonat],[GeburtsTag]) AS Geb_in_diesem_Jahr
FROM tbl_Mitarbeiter
WHERE DateSerial(Year(Date()),Month([mitarDatumGeburt]),Day([mitarDatumGeburt]))
Between Date() And Date()+7

und beide Male habe ich die gleiche Fehlermeldung

@ebs17
Danke, aber ich verstehe die Funktionsweise noch nicht insbesondere mit der Hilfstabelle... ich schaue mir das aber weiterhin an.

Dank an beide

Gruß Gert

MzKlMu

Hallo,
entweder so:
SELECT mitarNameAnzeige, mitarDatumGeburt,
DateSerial(Year(Date()),Month([mitarDatumGeburt]),Day([mitarDatumGeburt])) AS Geb_in_diesem_Jahr
FROM tbl_Mitarbeiter
WHERE DateSerial(Year(Date()),Month([mitarDatumGeburt]),Day([mitarDatumGeburt]))>=Date()
And
(DateSerial(Year(Date()),Month([mitarDatumGeburt]),Day([mitarDatumGeburt])))<=Date()+7

oder so:
SELECT mitarNameAnzeige, mitarDatumGeburt,
DateSerial(Year(Date()),Month([mitarDatumGeburt]),Day([mitarDatumGeburt])) AS Geb_in_diesem_Jahr
FROM tbl_Mitarbeiter
WHERE DateSerial(Year(Date()),Month([mitarDatumGeburt]),Day([mitarDatumGeburt]))
Between Date() And Date()+7

In beiden Fällen ist es überflüssig den Monat und den Tag extra zu berechnen.

Du solltest aber unbedingt den Vorschlag von Ebs verwenden, weil das hier bei einem Jahreswechsel nicht funktionieren wird.
Z.B. die nächsten 7 Tage ab 28.12.2019.

Gruß Klaus

GSt

DAnke, auch für den erneuten Hinweis mit dem Jahreswechsel...ich will ja brav sein und lernen, aber ich versteh die Abfrage mit der Hilfstabelle noch nicht...schaeun wir mal.

die Fehlermeldung bleibt die gleiche. Ich habe in der Ursprungstabelle jetzt mal nachgeschaut, das ist das Datum so formatiert: tt\.mm\.jjjj   
Liegt es ggf. daran? DatSeriel  ist ja (Jahr; Monat; Tag)
Oder spielt das keine Rolle?

na ja ich probier einfach mal ein wenig rum :D

GSt

leider bleibt das Ergebnis auch mit dem Versuch das Datumsformat (z.B. Standard) in tbl_Mitarbeiter[mitarDatumGeburt] zu ändern das gleiche.

Ich widme mich dann nochmal den Amsatz den ebs17 geraten hat. Bis ich das verstanden habe, bin ich auch für weitere Tipps dankbar.

Gruß Gert

DF6GL

Hallo,



Zitat...das Datumsformat (z.B. Standard) in tbl_Mitarbeiter[mitarDatumGeburt] zu ändern ...

Das Datums"FORMAT" ist unerheblich.  Der DATENTYP (nicht das "Format") des Feldes  "mitarDatumGeburt" muss "Datum/Uhrzeit" sein!

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

ebs17

ZitatBis ich das verstanden habe ...
Du ermittelst Geb_in_diesem_Jahr, bezogen auf genau ein Jahr, abgeleitet von Date.

Im Ansatz wird das Gleiche gemacht, aber für alle Jahre zwischen Geburtsdatum und Date (wahlweise auch ein anderer Stichtag). Daraus filtert man dann die benötigten für den Betrachtungszeitraum und könnte bspw. auch eine saubere Geburtstagsliste über drei Jahre erstellen.
Da hier durch die Vervielfältigung etwas größere Datenmengen entstehen, sollte man damit auch umgehen können (rechtzeitige Datenmengenbegrenzung, Indexnutzung).
Mit freundlichem Glück Auf!

Eberhard

GSt

neben den üblichen Zeitproblemen hatte ich als Newbie einige Probleme die von ebs17 empfohlene Abfrage zu verstehen. von DatDiff und DatAdd hatt ich (neben einigem anderen) noch nix gehört...
Hat aber jetzt sehr schön geklappt. Ixch habe es so umgesetzt:

SELECT tbl_Mitarbeiter.mitarAnrede, tbl_Mitarbeiter.mitarNameVor, tbl_Mitarbeiter.mitarNameNach, tbl_Mitarbeiter.mitarDatumGeburt, DateAdd("yyyy",[tblHilfsTabelleZahlen0Bis200].,[mitarDatumGeburt]) AS [Dieser Gebutstag], DateDiff("yyyy",[mitarDatumGeburt],DateAdd("yyyy",[tblHilfsTabelleZahlen0Bis200].,[mitarDatumGeburt])) AS [Alter Neu], tbl_Mitarbeiter.mitarEmailLZ, tbl_Mitarbeiter.mitarTelefonMobil
FROM tbl_Mitarbeiter, tblHilfsTabelleZahlen0Bis200
WHERE (((DateAdd("yyyy",[tblHilfsTabelleZahlen0Bis200].,[mitarDatumGeburt]))>=Date() And (DateAdd("yyyy",[tblHilfsTabelleZahlen0Bis200].,[mitarDatumGeburt]))<Date()+8))
ORDER BY DateAdd("yyyy",[tblHilfsTabelleZahlen0Bis200].,[mitarDatumGeburt]);


Verstanden habe ich noch nicht, warum man Tabellen in einer Abfrage umbenennt - vor allem in so einer kleinen Abfrage ist das doch ganz schön Schreibarbeit. Da ich mit der grafischen Oberfläche gearbeitet habe, habe ich das nicht umgesetzt. Sollte man?

Danke für Eure Hilfe (ich sehe ich habe noch einen weiten Weg vor mir  ;))

ebs17

Muss man Tabellen umbenennen? Oft nein, desweilen ja.
Wenn man es trotz Nichtmüssen tut, ist das dann auch eine Stilfrage, z.B.
- um Code leserlich zu machen (=> Verstehst Du die von Dir gezeigte Anweisung so wie sie dargestellt ist? Vor dem Verstehen kommt das Lesen können.)
- um Code zu verkürzen (weniger Zeichen),
- um Code schneller ändern zu können. Wenn ich eine Tabellenbezeichnung zu ändern hätte, müsste ich dass dann genau an einer Stelle (FROM-Teil) tun. Das spart Schreibarbeit.

Einige Gedanken zu Aliasen habe ich hier abgelegt: Grundlagen - SQL ist leicht (2) - Alias

ZitatDa ich mit der grafischen Oberfläche gearbeitet habe
Der Abfrageeditor kann das auch:
1) Gewünschte Tabelle durch einfaches Anklicken markieren
2) Eigenschaftsblatt öffnen (falls noch geschlossen)
3) In Zeile Alias die gewünschte Bezeichnung eintragen und Tab-Taste drücken
Mit freundlichem Glück Auf!

Eberhard