Access: Abfrageproblem
Hallo Gemeinschaft,
habe mal wieder ein Abfrageproblem
habe zwei Tabellen
tbl_Betreuer
id_Nachname_Vorname....
tbl_Leistungsnachweis
id_id-Betreuer_Monat_Jahr_Stunden.......
nun möchte ich eine Abfrage haben, die folgendes kann
ich möchte nur die Betreuer angezeigt bekommen, die in den letzten 3 Monaten keinen Leistungsnachweis abgegeben habe
könnt ihr mir bitte dabei helfen
habe mal wieder ein Abfrageproblem
habe zwei Tabellen
tbl_Betreuer
id_Nachname_Vorname....
tbl_Leistungsnachweis
id_id-Betreuer_Monat_Jahr_Stunden.......
nun möchte ich eine Abfrage haben, die folgendes kann
ich möchte nur die Betreuer angezeigt bekommen, die in den letzten 3 Monaten keinen Leistungsnachweis abgegeben habe
könnt ihr mir bitte dabei helfen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 62400474171
Url: https://administrator.de/forum/access-abfrageproblem-62400474171.html
Ausgedruckt am: 22.12.2024 um 10:12 Uhr
43 Kommentare
Neuester Kommentar
Mahlzeit,
beide Tabellen über referentielle Integrität verbunden, dann Abfrage erstellt wie folgt:
unter der Annahme, dass das Feld Monat der Nachweis für den letzten Leistungsnachweis enthält, also dann die Diff zu Heute.
MfG BM
beide Tabellen über referentielle Integrität verbunden, dann Abfrage erstellt wie folgt:
SELECT tbl_Betreuer.id_Nachname_Vorname, tbl_Leistungsnachweis.Monat, tbl_Leistungsnachweis.Jahr, tbl_Leistungsnachweis.Stunden
FROM tbl_Betreuer, tbl_Leistungsnachweis
WHERE ((Month(Now())-[Monat]>3));
unter der Annahme, dass das Feld Monat der Nachweis für den letzten Leistungsnachweis enthält, also dann die Diff zu Heute.
MfG BM
@Blackmann
Du setzt voraus, dass sein Feld "Monat" eine Zahl beinhaltet.
Bei seinen zahlreichen Threads hier meine im Kopf zu haben, dass dort "Januar", "Februar", "März", ..., "Dezember" steht
Und ein "(1 - November) > 3" wird immer auf die Nase fallen.
Ohne Beispieldaten bin ich hier jetzt im übrigen raus, den @jensgebken liefert keine Daten, um sich helfen zu lassen.
Du setzt voraus, dass sein Feld "Monat" eine Zahl beinhaltet.
Bei seinen zahlreichen Threads hier meine im Kopf zu haben, dass dort "Januar", "Februar", "März", ..., "Dezember" steht
Und ein "(1 - November) > 3" wird immer auf die Nase fallen.
Ohne Beispieldaten bin ich hier jetzt im übrigen raus, den @jensgebken liefert keine Daten, um sich helfen zu lassen.
Zitat von @Blackmann:
@em-pie, genau
Ich hätte in einem Feld sogar das komplette letzte Nachweisdatum integriert.
MfG BM
Wie jeder Mensch, der mit Daten (Plural eines Kalenderdatums) arbeitet… nunja…@em-pie, genau
Ich hätte in einem Feld sogar das komplette letzte Nachweisdatum integriert.
MfG BM
SELECT tbl_Betreuer.id_Nachname_Vorname, tbl_Leistungsnachweis.Monat, tbl_Leistungsnachweis.Jahr, tbl_Leistungsnachweis.Stunden, DateDiff('m',Now(),[Monat]) AS MonDif
FROM tbl_Betreuer, tbl_Leistungsnachweis
WHERE (((DateDiff('m',Now(),[Monat]))>3));
Ggfls musst Du die Argumente noch anpassen/tauschen, habe jetzt hier keine Realdaten da.
Aber die Funktion sollte klappen... auf jeden Fall testen, was bleibt auch übrig :>))
BG BM
PS: Anstelle von [Monat] musst Du eventuell Dein Datum aus den Werten in der Tabelle wieder zusammenbasteln,
also einen Datums wert erzeugen ...
Ich kann kein Kalenderdatum nehmen, weil im Leistungsnachweis immer der Monat gemeint ist, in dem gearbeitet wurde
und was hindert dich daran, dann einfach stumpf 01.03.2024
ind das Feld zu setzen, wenn die LEistungsperiode März 2024 gewesen ist?meine nur mit dem jahr - würdest du es dann so bauen jahr & monat - oder wie meinst du es
Ja, du kannst die einen String zusammen setzen CONCAT('01.', MONAT, '.', JAHR)
und das in ein Datum konvertieren:cDate(Format(CONCAT('01.', MONAT, '.', JAHR),"ddd.MM.yyyy"))
und damit kannst du dann rechnen
PS: Anstelle von [Monat] musst Du eventuell Dein Datum aus den Werten in der Tabelle wieder zusammenbasteln,
also einen Datums wert erzeugen ...
also einen Datums wert erzeugen ...
DatSerial setzt ein Datum aus Werten Deiner Tabelle wieder zusammen ... Testen, ich mache das hier als Trockenübung ... :>))
SELECT tbl_Betreuer.id_Nachname_Vorname
FROM tbl_Betreuer, tbl_Leistungsnachweis
WHERE DateDiff('m',Now(),DateSerial([Jahr],[Monat],1)) AS MonDif;
BG BM
OK. Habe kein Access hier, aber du hast das Prinzip ja adaptieren können
Versuch mal
dot ist ein d weniger, im Format.
Alternativ mal
oder
wenn ich es so mache bekomme ich eine Meldung bzgl. Anzahl an Argumenten
Du hast meinen Fehler mitkopiert cDate(Format('01.'& MONAT & '.' & JAHR),"ddd.MM.yyyy") as neu
Versuch mal
cDate(Format('01.' & MONAT & '.' & JAHR),"dd.MM.yyyy") as neu
Alternativ mal
cDate(Format('01/' & MONAT & '/' & JAHR),"dd/MM/yyyy") as neu
cDate(Format('"' & '01.' & MONAT & '.' & JAHR & '"'),"dd.MM.yyyy") as neu
Dann Drösel es auf:
SELECT
p.id_Nachname_Vorname
, Now() as CurDate
, DateSerial(lnw.Jahr, lnw.Monat, 1) as LeistDat
FROM tbl_Leistungsnachweis as lnw
INNER JOIN tbl_Betreuer as p ON lnw.id_Betreuer = p.ID
WHERE lnw.id = 4711
Kommt es immernoch zu einem Fehler, musst du dir Now() bzw. DateSerial anschauen
Danach prüfst du die Kombination beider mittels DateDiff:
, DateDiff('m',Now(),DateSerial([Jahr],[Monat],1)) as Delta
Kommt es zu keinem Fehler, schaue, was mit dem DateDiff() passiert.
Monat und Jahr sind aber gefüllt?
SELECT
p.id_Nachname_Vorname
, lnw.Jahr
, lnw.Monat
, Now() as CurDate
, DateSerial(lnw.Jahr, lnw.Monat, 1) as LeistDat
FROM tbl_Leistungsnachweis as lnw
INNER JOIN tbl_Betreuer as p ON lnw.id_Betreuer = p.ID
WHERE lnw.id = 4711
Zitat von @jensgebken:
... ist vermutlich super trickig oder
weil müsste ja zuerst ermitteln, welcher letzte Monat eines Betreuers der letzte ist um dann ermitteln zu können ob dieser mindestens 3 Monate her ist
... ist vermutlich super trickig oder
weil müsste ja zuerst ermitteln, welcher letzte Monat eines Betreuers der letzte ist um dann ermitteln zu können ob dieser mindestens 3 Monate her ist
Nöö.
Folgendes ungetestet:
SELECT
p.id_Nachname_Vorname
, lnw.Jahr
, lnw.Monat
, Now() as CurDate
, DateSerial(lnw.Jahr, lnw.Monat, 1) as LeistDat
FROM tbl_Leistungsnachweis as lnw
INNER JOIN tbl_Betreuer as p ON lnw.id_Betreuer = p.ID
WHERE lnw.id not in (
SELECT ID
FROM tbl_Leistungsnachweis
WHERE DateDiff("m", Now(), DateSerial(lnw.Jahr, lnw.Monat, 1), vbMonday, 2) <= 3
GROUP by ID)
Mit dem Subselect in der Where-Bedingung holst du dir alle Betreuer, die in den letzten drei Monaten Leistungen erbracht haben und gruppierst das Ergebnis nach der Betreier-ID. Die dort nicht gelistet sind, nutzt du dann für die eigentliche Where-Bedingung..
Teste aber erst, ob das Datediff() die richtigen Datensätze erwischt, kann auch sein, dass "3 Monate" erst angezeigt wird, wenn ganze Monate (also ca. 90 Tage) erreicht wurden...
dann Trage eine eine 2 ein. Steht doch Alles in den Hilfen zu den Funktionen.
Hast du dir mal im WWW die Funktionsbeschreibung(en) angeschaut?
Weil hier in NRW die Woche nicht erst am Mittwoch (oder am Sonntag) beginnt.
Und die KW01 eines Jahres in DE mit der ersten 4Tage Woche beginnt.
Das kannst du auch weglassen, da du ja nicht mit Wochen oder Tagen arbeitest.
Mal in ein VM geöffnet:
pry_Nachweis --> normale Liste alle Deiner verknüpften Daten, ohne Filterung, also Übersicht
pry_Suchanfrage -->wie kommst Du denn hier auf einmal auf die Tabellen mit Name 'p' und 'lnw'
Auch hier sollten Deine Basitabellen: tbl_Betreuer; tbl_Leistungsnachweis; tbl_Patient sein,mit denen musst Du arbeiten.
Schaue Dir mal die Abfrage in meiner DB an, es ist ja nur eine da, die Funktioniert meiner Meinung nach, den WHERE Teil musst Du verstehen: Es werden alle angezeigt mit 0, -1, -2, -3, also aktuelle Monat und 3 Monate davor.
pry_Nachweis --> normale Liste alle Deiner verknüpften Daten, ohne Filterung, also Übersicht
pry_Suchanfrage -->wie kommst Du denn hier auf einmal auf die Tabellen mit Name 'p' und 'lnw'
Auch hier sollten Deine Basitabellen: tbl_Betreuer; tbl_Leistungsnachweis; tbl_Patient sein,mit denen musst Du arbeiten.
Schaue Dir mal die Abfrage in meiner DB an, es ist ja nur eine da, die Funktioniert meiner Meinung nach, den WHERE Teil musst Du verstehen: Es werden alle angezeigt mit 0, -1, -2, -3, also aktuelle Monat und 3 Monate davor.
SELECT tbl_Betreuer.id_Nachname_Vorname, DateDiff('m',Now(),DateSerial([Jahr],[Monat],1)) AS Differenzmonate
FROM tbl_Betreuer INNER JOIN tbl_Leistungsnachweis ON tbl_Betreuer.ID = tbl_Leistungsnachweis.id_Betreuer
WHERE (((DateDiff('m',Now(),DateSerial([Jahr],[Monat],1)))>=-3));
wie kommst Du denn hier auf einmal auf die Tabellen mit Name 'p' und 'lnw'
Vermutlich hat er oben mein Query „blind“ kopiert. Habe dort ja mit entsprechenden Alias gearbeitet…Wenn er das nicht adaptiert hat…
@jensgebken
Hab mir die mdb nicht angeschaut, da kein Access zur Hand…
Stell hier doch Screenshots (geschwärzt) ein…
Und ganz wichtig: lerne komplexe Probleme zu zergliedern. So schwer ist das doch nicht…
1. Natürlich musst Du in Deiner Tabelle die Felddatentypen sauber implementieren --> siehe meine Beispieltabelle.
Das scheint bei Dir noch nicht der Fall zu sein ... Zahl != Text ... das kann man so einfach nicht vergleichen...
2. Mit
bekomme ich alle IN den letzten 3 Monaten
bekomme ich alle VOR den letzten 3 Monaten
Schau dir den Unterschied an, Du findet ihn im WHERE-Abschnitt
N'8 BM
Das scheint bei Dir noch nicht der Fall zu sein ... Zahl != Text ... das kann man so einfach nicht vergleichen...
2. Mit
SELECT tbl_Betreuer.id_Nachname_Vorname, DateDiff('m',Now(),DateSerial([Jahr],[Monat],1)) AS Differenzmonate
FROM tbl_Betreuer INNER JOIN tbl_Leistungsnachweis ON tbl_Betreuer.ID = tbl_Leistungsnachweis.id_Betreuer
WHERE (((DateDiff('m',Now(),DateSerial([Jahr],[Monat],1)))>=-3));
SELECT tbl_Betreuer.id_Nachname_Vorname, DateDiff('m',Now(),DateSerial([Jahr],[Monat],1)) AS Differenzmonate
FROM tbl_Betreuer INNER JOIN tbl_Leistungsnachweis ON tbl_Betreuer.ID = tbl_Leistungsnachweis.id_Betreuer
WHERE (((DateDiff('m',Now(),DateSerial([Jahr],[Monat],1)))<-3));
Schau dir den Unterschied an, Du findet ihn im WHERE-Abschnitt
N'8 BM
Zitat von @jensgebken:
Kann man das vielleicht noch gruppieren bzw. das nur der letzte Monat des Betreuers angezeigt wird
Kann man das vielleicht noch gruppieren bzw. das nur der letzte Monat des Betreuers angezeigt wird
Ja, tausche 3 durch 1
oder arbeite mir
GROUP BY
und im SELECT-Teil mit MAX()