Maximalwert Datum

Hallo liebe Experten!

Bin noch Access-Neuling. Ich möchte aus einer Tabelle mittels Abfrage alle Einträge zu einem bestimmten Datum herausfinden,und zwar das heutige und der letzten 4 Werktage. „Datum()“ ist klar, danach würde ich „Datum()-1“ etc eingeben, funktioniert aber aufgrund Wochenende und Feiertage natürlich nicht. Da aber in der Tabelle sowieso nur die Datumsangaben der Werktage angeführt sind, dachte ich an ein Abfrage mittles Max-Funktion, also Maximaler Wert, Maximaler Wert-1 etc, funktioniert leider auch nicht. Hat jemand eine einfache Idee wie ich meine Daten in die Abfragen bekomme? Mit Dank im voraus.

MfG

Horst

Hallo Horst,

bei klappt das als Feld in einer Abfrage:

 MaxAuftragsdatum: Max([Auftragsdatum])-4

Soll heißen: das letzte Auftragsdatum ist der 28.03.2006, minus 4 Tage ist der 24.03.2006 (Sonn und Feiertage nicht berechnet!)

gruss
moritzbock

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Horst,

bei klappt das als Feld in einer Abfrage:

MaxAuftragsdatum: Max([Auftragsdatum])-4

Soll heißen: das letzte Auftragsdatum ist der 28.03.2006,
minus 4 Tage ist der 24.03.2006 (Sonn und Feiertage nicht
berechnet!)

gruss
moritzbock

Danke für schnelle Antwort, hilft mir leider nicht. Wenn ich dieses neue Feld einfüge, zeigt die Abfrage das Ursprungsdatum -4 Tage, zB 26.04.2006 - 22.04.2006, und das war am Samstag obwohl es den 22.04.2006 in der Tabelle gar nicht gibt. Es sollte der 20.04.2006 (-4Werktage) aufscheinen. Vielleicht noch eine Idee? Trotzdem Danke

Gruß

Horst

Hallo Horst,

und zwar das heutige und der letzten 4 Werktage.
„Datum()“ ist klar, danach würde ich „Datum()-1“ etc eingeben,
funktioniert aber aufgrund Wochenende und Feiertage natürlich
nicht.

klar, weil du nicht definiert hast, was ein Werktag ist.

Mit der Funktion WEEKDAY kannst du den heutigen Tag herausfinden:

Beispiel:
x = weekday(„25.04.2006“,vbMonday) 'deutsche Woche fängt mit Montag an!
Heute ist Dienstag der 25.04, also der 2 Tag in der Woche. (x=2)

Dein Beispiel:
Heute = 25.04.2006 (2. Tag = Werktag)

  • 1 Tag = 24.04.2006 (1. Tag = Werktag)
  • 2 Tag = 23.04.2006 (7. Tag = KEIN Werktag)
  • 3 Tag = 22.04.2006 (6. Tag = KEIN Werktag)
  • 4 Tag = 21.04.2006 (5. Tag = Werktag)

Da ich nun weiß, dass eine Woche sieben Tage hat, kann ich daraus meine Bedingung konstruieren. Da die Tage voneinader abhängig sind hier mal ein Lösungsansatz von mir:

Public Function Test1()
Dim x, d1, d2, d3, d4
Dim dd As Date

dd = „28.04.2006“
x = Weekday(dd, vbMonday)

d1 = dd
d2 = d1 - IIf(((Weekday(d1, vbMonday) + 7) - 1) = 7, 3, 1)
d3 = d2 - IIf(((Weekday(d2, vbMonday) + 7) - 1) = 7, 3, 1)
d4 = d3 - IIf(((Weekday(d3, vbMonday) + 7) - 1) = 7, 3, 1)
d5 = d4 - IIf(((Weekday(d4, vbMonday) + 7) - 1) = 7, 3, 1)

MsgBox x & Chr(10) & Chr(13) & Chr(10) & Chr(13) & _
d1 & " " & Weekday(d1, vbMonday) & Chr(10) & Chr(13) & _
d2 & " " & Weekday(d2, vbMonday) & Chr(10) & Chr(13) & _
d3 & " " & Weekday(d3, vbMonday) & Chr(10) & Chr(13) & _
d4 & " " & Weekday(d4, vbMonday) & Chr(10) & Chr(13) & _
d5 & " " & Weekday(d5, vbMonday) & Chr(10) & Chr(13)

End Function

Du kannst für DD einen beliebigen Tag eingeben :smile:

Grüße aus Essen
Wolfgang

Hallo Horst,

dann wird wohl nichts anderes helfen als ein kleine VBA-Routine zu schreiben und die innerhalb der Abfrage aufzurufen.
z.B.:

Public Function CalcWeekday(inDate as Date) as Date
Dim wkDay as Integer
Dim tmpDate as Date(

tmpDate = inDate - 4 ’ 4 Tage zurueck

wkDay = weekday(inDate,vbMonday) ’ Wochentag berechnen

select Case wkDay
case 6 ’ Samstag
tmpDate = tmpDate - 1 ’ jetzt sind wir bei Freitag
case 7 ’ Sontag
tmpDate = tmpDate - 2 ’ jetzt sind wir bei Freitag
case else
tmpDate = tmpDate ’ kann man weglassen …zur veranschaulichung
end select

CalcWeekday = tmpDate

End Function

Nun kannst du in deiner Abfrage eine Spalte einfuegen und dort folgendes Eintragen:

MaxAuftragsdatum = CalcWeekday([Auftragsdatum])

Diese Vorgehen ist bzgl. der Verarbeitungsgeschwindigkeit alles andere als hochperformant aber es funktioniert.

Hope this helps
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke für Hilfe
Danke an alle für die Hilfe, hab dadurch einiges dazugelernt. Allerdings bleibt das Problem mit den Feiertagen während der Woche, davon gibts aber zu Glück, bzw leider nicht so viele.

Gruß

Horst

Hallo,

also bzgl. der Feiertage gibt es im Netz einige fertige Loesungen ( must du mal Yahoo bemuehen) die dieses Problem behandel, diese kannst du mit meinem oben beschriebenen Loesungsansatz problemlos kombinieren. Ich habe z.Z. eine aehnliche Aufgabenstellung, da geht es um die Planung von Maschinenauslastungen und da habe ich fuer das Feiertagsproblem einige fertige Loesungen gefunden, incl. Ostern und Pfingsten Berchnungen.

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo

Allerdings bleibt das Problem mit den Feiertagen während der
Woche, davon gibts aber zu Glück, bzw leider nicht so viele.

Wenn es an jedem Werktag Einträge gibt, und an Sonn- und Feiertagen keine, dann wüsste ich eine Lösung. Die ist aber bestimmt nicht die bestmögliche und geht nur mit mehreren kleinen Unterabfragen, die auf die Dauer aber nicht stören würden.

Bei Interesse kann ich meine Idee posten.

Viele Grüße
Thea

Jede Hilfe erwünscht
Hallo Thea,

Bin für jede Hilfe dankbar, arbeite im Moment mit einer Hilfstabelle in der ich jeden Tag die letzten Tage eingebe, funktioniert zwar, ist aber auf die Dauer keine Lösung.

Gruß

Horst

Hallo

Bin für jede Hilfe dankbar, arbeite im Moment mit einer
Hilfstabelle in der ich jeden Tag die letzten Tage eingebe,
funktioniert zwar, ist aber auf die Dauer keine Lösung.

Aber bevor ich hier zu umfangreichen Erklärungen ansetze, sag noch mal, ob du an jedem Arbeitstag immer Einträge hast, und Sonn- und Feiertags nie. Wenn nicht, dann funktioniert meine Idee nämlich nicht.

Viele Grüße
Thea

Hallo,

wenn du eine allgemeine Routine zur Feiertags/Wochenendberechnung suchst kuckst du hier:

Das ist nicht von mir, sondern habe ich als Freeware mal im Netz gefunden. Da ist so ziehmlich alles drin enthalten was man zur Loesung des Problems braucht. Funktioniert auch fuer die beweglichen Feiertage wir Ostern, Pfingsten, ChristiHimmelfahrt etc.

http://www.parkbouler.com/demos/Feiertagsberechnunge…
ca 110KB

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Jede Hilfe erwünscht
Ja, es stehen nur die Daten aus allen Werktagen in der Tabelle und es ist unmöglich das ein Feiertag bzw Wochenende darin vorkommt. Bin auf deinen Ansatz schon gespannt, mit Dank im voraus!

Gruß

Horst

Hallo,

leider habe ich ein Problem nicht bedacht, das auftauchen
würde, und es geht leider nicht ganz so, wie ich es mir
vorgestellt hatte.

Ich kriege es im Moment nur so hin, dass du zwar die letzten
vier Arbeitstage hast, aber jeden Arbeitstag in einer anderen
Abfrage. Wäre das schlimm? Ich kriege die vier nicht in eine
Abfrage zusammengepackt, aber eigentlich müsste das gehen,
denke ich. Ich habe mir das halt auch nur irgendwie so selbst
beigebracht und bin da noch nichts sehr weit, ich habe auch
kein richtiges Buch davon. Aber das was ich da habe, geht.

Da ich keine Ahnung habe, was du bei Access kannst, gehe ich
davon aus, dass du das kannst, was aus deiner Anfrage
hervorgeht, also ungefähr so viel wie ich.

Schon vorher als Anmerkung: Manche Feldnamen werden ja
automatisch generiert, und da mein Access in englisch ist,
kann es sein, dass bei dir andere Namen entstehen. Das
betrifft diese Namen wie Expr1 oder MaxOfExpr1. Die könnten
bei dir vielleicht Ausdruck und MaxVonAusdruck oder so heißen,
aber damit kommst du ja bestimmt klar.

  1. Also, du hast eine Tabelle, ein Feld davon heißt
    DATUM (behaupte ich einfach mal, ein anderes
    MITARBEITER (könnte ja sein), und das erste Feld heißt
    natürlich NUMMER und ist ein AutoWert und hat den
    Primärschlüssel. Mehr Felder mach ich jetzt nicht, spielt ja
    prinzipiell keine Rolle. Die Tabelle heißt AlleTage ,
    weil da alle Tage aufgeführt sind.

1a) Jetzt machst du von der Tabelle AlleTage eine
Abfrage, und zwar übernimmst du aber nur das Feld
DATUM. Dann drückst du das Summenzeichen, und stellst
auf Max ein. Als Ergebnis hast du ein Feld mit Namen
MaxOfDATUM mit einem einzigen Datensatz, und darin
müsste das jüngste in der Tabelle verwendete Datum stehen.
Diese Abfrage nennen wir LetzterTag.

  1. Als nächstes machst du eine Abfrage, in der du die Tabelle
    AlleTage und die Abfrage LetzterTag verwendest.
    Der ersten Spalte gibst du die Überschrift:
    Wenn(DATUMMaxOfDATUM;DATUM;"")
    Es sollen hier also alle Daten erscheinen, nur das allerletzte
    nicht. Access macht daraus:
    Expr1: Wenn([DATUM][MaxOfDATUM];[DATUM];"")
    oder so ähnlich, wie gesagt, mein Access ist englisch. Dieses
    Feld heißt jetzt also Expr1 (oder das selbe in Deutsch,
    Ausdruck1 oder was weiß ich)

Dann musst du wieder das Summenzeichen drücken und Gruppieren
oder so ähnlich (bei mir Group by) wählen, das kommt aber von
alleine. Und unten drunter als Kriterium „“, so dass
die Datensätze vom letzten Tag wegfallen.

In den nächsten Spalte übernimmst du einfach alles von der
Tabelle, was du brauchst, und da wir ja nur MITARBEITER
und NUMMER haben, übernehmen wir also die beiden.

Als Ergebnis haben wir dann eine Abfrage, in der alle
Datensätze stehen wie in der Tabelle AlleTage , außer
denen vom letzten Tag. Diese Abfrage nennen wir
OhneLetzten.

2a) Jetzt machen wir eine Abfrage von der Abfrage
OhneLetzten. Wir übernehmen nur Expr1 , worin ja
das Datum ist. Dann Summenzeichen und Max einstellen. Dieses
Feld heißt jetzt (automatisch) MaxOfExpr1. Wir haben
als Ergebnis den vorletzten in der Tabelle aufgeführten Tag
und nennen die Abfrage: VorletzterTag.

  1. Jetzt machen wir eine Abfrage, in der wir die Abfragen
    OhneLetzten und VorletzterTag verwenden.

Schreiben wir in die erste Spaltenüberschrift:
Wenn(VorletzterTag!MaxOfExpr1OhneLetzten!Expr1;OhneLetzten!Expr1;"")
jetzt wird also auch der vorletzte Tag ausgeschlossen. Jetzt
wird wieder nach diesem Feld gruppiert und als Kriterium kommt
wieder „“.

Ansonsten werden wieder alle Felder übernommen, die letzten
Endes noch drin sein sollen, also MITARBEITER und
NUMMER.
Diese Abfrage nennen wir OhneVorletzten.

3a) Jetzt Abfrage von OhneVorletzten , dort Feld
Expr1 übernehmen, Summenzeichen drücken, Max
einstellen. Jetzt haben wir ein Feld, das auch
MaxOfExpr1 heißt, aber die Abfrage nennen wir
VorvorletzterTag.

  1. Jetzt kommt wieder eine Abfrage von den Abfragen
    VorvorletzterTag und OhneVorletzten.

n die este Spaltenüberschrift kommt:
Wenn(VorvorletzterTag!MaxOfExpr1OhneVorletzten!Expr1;OhneVorletzten!Expr1;"")
und wieder Summenzeichen, gruppieren und das Kriterium
„“

In die nächsten beiden Spalten werden wieder
MITARBEITER und NUMMER übernommen.

Die Abfrage heißt jetzt OhneVorvorletzten.

4a) Jetzt wieder eine Abfrage von OhneVorvorletzten ,
dort Expr1 übernehmen, Summenzeichen klicken und Max
einstellen. Wie haben jetzt wieder MaxOfExpr1 , aber die
Abfrage heißt VorvorvorletzterTag.

Bis jetzt haben wir also den letzten, vorletzten,
vorvorletzten und vorvorvorletzten Arbeitstag, also die 4
letzten ermittelt.

Jetzt müssen wir noch diese Arbeitstage mit ihren anderen
Daten zusammenbringen.

Hast du noch Interesse, oder ist dir diese Lösung zu blöd?
Bitte Zwischenrückmeldung, dann folgt der Rest.

Viele Grüße
Thea

Hallo

Ich kriege es im Moment nur so hin, dass du zwar die letzten
vier Arbeitstage hast, aber jeden Arbeitstag in einer anderen
Abfrage.

Ich wüsste aber, wie man das macht, dass sich auf Knopfdruck alle vier öffnen, alle nebeneinander oder zwei oben und zwei unten, und jede nimmt ein Viertel des Bildschirms ein.

Viele Grüße
Thea

Hallo Thea,

Danke erstmal daß du dir so viel Mühe gegeben hast, beschäftige mich auch erst seit kurzer Zeit mit Access und versuche das nötigste zu erlernen. Hab´ mir mit deiner Methode die Daten herausgefiltert, daraus eine Tabelle erstellt, auf die ích nun zugreifen kann. Problem gelöst. Toll daß du auch vor längeren Erklärungen nicht zurückschreckst und diese sehr gut verständlich(für einen Anfänger wie mich) schreibst. Danke

Viele Grüße

Horst

Hallo Horst!

Hab´ mir mit deiner Methode
die Daten herausgefiltert, daraus eine Tabelle erstellt, auf
die ích nun zugreifen kann. Problem gelöst.

Das ist ja super.

Echt, hast du zum Schluss alles in eine einzige Tabelle gekriegt? Klappt das auch, wenn du in die Ursprungstabelle neue Daten eingibst? Wie hast du das denn gemacht? - Na ja, musst du aber nicht schreiben, wenn es zu aufwändig ist.

Viele Grüße
Thea

Richtig ausprobieren (mit aktuellen Daten) werd´ ich es erst morgen in der Arbeit, wenn´s klappt ist ausführliches feedback garantiert (wenn nicht, sowieso)

Echt, hast du zum Schluss alles in eine einzige Tabelle
gekriegt?

Einfach eine Tabellenerstellungsabfrage bestehend aus den 4 Abfragen der einzelnen Tage.

Klappt das auch, wenn du in die Ursprungstabelle

neue Daten eingibst?

Klappt auch!

Wie hast du das denn gemacht? - Na ja,

musst du aber nicht schreiben, wenn es zu aufwändig ist.

Ist nicht zu aufwendig, immerhin bis du sicher auch ganz schön gesessen. Nachdem ich die neue Tabelle erstellt habe, kopiere ich die Tabellenerstellungsabfrage und füge sie zweimal ein, dann in die Entwurfsansicht, aus der ersten Kopie mache ich eine Anfügeabfrage und aus der zweiten Kopie eine Löschabfrage. Um immer aktuelle Daten in der Tabelle zu haben, muß ich nur zuerst die Löschabfrage durchführen (damit ist die Tabelle wieder leer) und danach mit
der Anfügeabfrage die neuen Daten in die Tabelle einfügen.

Viele Grüße

Horst