Neuigkeiten:

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

Mobiles Hauptmenü

Datum tage zurück rechnen.

Begonnen von alfini, September 22, 2025, 15:24:11

⏪ vorheriges - nächstes ⏩

alfini

Hallo Forum,

es gibt ein Lieferdatum z.B. 06.10.2025 zu einem Produkt.
Für dieses Produkt werden z.B. 6 Tage Fertigungszeit gebraucht.
Jetzt möchte errechnen wann mit der Fertigung begonnen muss um den Liefertermin einzuhalten.
Es sollen aber die Wochenenden nicht berücksichtigt werden genau so die Feiertage. Für die Feiertage ist eine Tabelle vorhanden.
Wie kann ich das lösen?
Für eure Mühe bedanke ich mich im voraus.
Gruß alfini


MzKlMu

allo,
erstelle eine Kalendertabelle mit allen Tagen eines ausreichend großen Zeitraums. Das können auch 20 und mehr Jahre sein, es sind ja nur max. 366 Datensätze je Jahr.
In diese Kalendertabelle sollten auch die Feiertagen markiertsein.

Dann lässt sich Dein Vorhaben relativ einfach realisieren.
Gruß Klaus

Doming

Hallo,

kann man nicht einfach mit einer Schleife 6 Tage zurückrechnen und je nach Wochentag in der Schleife den Tag überspringen? (also die Anzahl der abgezogenen Tage erhöhen)

PhilS

Zitat von: Doming am September 22, 2025, 19:03:50kann man nicht einfach mit einer Schleife 6 Tage zurückrechnen und je nach Wochentag in der Schleife den Tag überspringen? (also die Anzahl der abgezogenen Tage erhöhen)
Das kann man. Wenn es nur um Werktag/Wochenende geht, wäre das bei einer überschaubaren Anzahl an Tagen auch meine Lösung. 
Da hier aber auch Feiertage berücksichtigt werden sollen, die man irgendwo explizit definieren muss, würde ich dann einheitlich nur die Kalendertabelle verwenden.


Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Knobbi38

Hallo,

in einer Schleife 6 Tage zurück rechnen, ist weniger gut, weil a) sich für einige Produkte die Fertigungszeit auch mal ändern könnte und b) die Feiertage sich durchaus je nach Bundesland unterscheiden können - man denke z.B. mal an verschiedene Fertigungsstätten oder verschiedene Standorte für die Anlieferung.

Das ist ein gutes Beispiel für den Einsatz eine entsprechenden Kalendertabelle.

Knobbi38

MzKlMu

Hallo,
auf Dauer ist die Kalendertabelle die einfachste Lösung.
Im Anhang ein Beispiel das Du auf Dein Vorhaben anpassen kannst.
Da gibt es auch ein Formular zum automatischen Erstellen der Kalendertabelle mit den Wochentagszahlen )1-7) in einer extra Spalte.

DB als Zip anbei.
Gruß Klaus

AHeyne

Man kann so eine Tabelle bei Bedarf dann z.B. auch noch mit einer Firmenspezifischen Tabelle joinen in der wichtige Termine stehen.

alfini

Hallo Forum,

habe eine Tab. tblKalender erstellt.Mit folgenden Feldern.
Tagesdatum, Feiertagsname, Wochentag kurz, istFeiertage als Checkbox.
Das Startdatum konnte ich herausfinden.
Jetzt geht es nur um das Enddatum.Vom Startdatum plus z.B. 6 Tage ohne die Wochenenden und Feiertage.
Vieleicht hat jemand einen Hinweis wie es gelöst werden kann.
Gruß alfini

alfini

Hallo Forum,

habe das Problem mit KI gelöst bekommen.
Gruß Alfini

Knobbi38

Hallo Alfini,

wäre schön, wenn du die Lösung hier auch veröffentlichen könntest, so daß andere auch etwas davon haben.

alfini

Hallo,

hier sind die beiden Funktionen für die Berechnung der Tage mit Feiertagen.
Tab. mit Feiertagen anlegen.
Dann Lieferdatum bestimmen und Fertigungstage festlegen.
Erst Fertigungsbeginn berechnen. Dann die Fertigungstage dazurechnen.
Müsste soweit verständlich sein.
Gruß alfini


Function AddWerktageMitFeiertagen(StartDatum As Date, AnzahlTage As Integer) As Date
    Dim ErgebnisDatum As Date
    Dim TageHinzugefügt As Integer
    Dim rs As DAO.Recordset
    Dim db As DAO.Database

    ErgebnisDatum = StartDatum
    TageHinzugefügt = 0
    Set db = CurrentDb

    Do While TageHinzugefügt < AnzahlTage
        ' Feiertag prüfen
        Set rs = db.OpenRecordset("SELECT istFeiertag FROM tblKalender WHERE Tagesdatum = #" & Format(ErgebnisDatum, "yyyy-mm-dd") & "#", dbOpenSnapshot)
       
        If rs.RecordCount > 0 Then
            rs.MoveFirst
            If rs!istFeiertag = False Then
                ' Kein Feiertag ? Werktag prüfen
                If Weekday(ErgebnisDatum, vbMonday) <= 5 Then
                    TageHinzugefügt = TageHinzugefügt + 1
                End If
            End If
        Else
            ' Kein Eintrag im Kalender ? nur Wochenende prüfen
            If Weekday(ErgebnisDatum, vbMonday) <= 5 Then
                TageHinzugefügt = TageHinzugefügt + 1
            End If
        End If

        rs.Close
        Set rs = Nothing

        If TageHinzugefügt < AnzahlTage Then
            ErgebnisDatum = ErgebnisDatum + 1
        End If
    Loop

    AddWerktageMitFeiertagen = ErgebnisDatum
End Function

Function BerechneFertigungsbeginnMitFeiertagen(Lieferdatum As Date, FertigungsTage As Integer) As Date
    Dim Arbeitstage As Integer
    Dim AktuellesDatum As Date
    Dim FeiertagDatum As Variant
    Dim Feiertage As DAO.Recordset
   
    AktuellesDatum = Lieferdatum
    Arbeitstage = 0
   
    ' Feiertage laden
    Set Feiertage = CurrentDb.OpenRecordset("SELECT Ftg_Datum FROM tblFeiertage", dbOpenSnapshot)
   
    Do While Arbeitstage < FertigungsTage
        AktuellesDatum = AktuellesDatum - 1
       
        ' Wochenende prüfen
        If Weekday(AktuellesDatum, vbMonday) <= 5 Then
            ' Feiertag prüfen
            Feiertage.MoveFirst
            FeiertagDatum = DLookup("Ftg_Datum", "tblFeiertage", "Ftg_Datum = #" & Format(AktuellesDatum, "yyyy-mm-dd") & "#")
           
            If IsNull(FeiertagDatum) Then
                Arbeitstage = Arbeitstage + 1
            End If
        End If
    Loop
   
    Feiertage.Close
    Set Feiertage = Nothing
   
    BerechneFertigungsbeginnMitFeiertagen = AktuellesDatum
End Function



Knobbi38

#11
Hallo Alfini,

so wird eine Feiertagstabelle aber nicht verwendet!  :o 

Für das was du da veranstaltest bräuchte man überhaupt keine Tabelle, Schleife über eine Tabelle und innerhalb der Schleife auch noch Prüfungen und ein Dlookup().  ::)
Du solltest das Thema mal etwas systematischer angehen. Klaus hatte in dem Modul doch schon etwas vorbereitet.

Du suchst den 6. Arbeitstag nach einem Startdatum?
Hier mal ein erster Ansatz für dich, die Feinarbeit und Anpassung überlasse ich jetzt mal dir:
SELECT Max(ATag) As Lieferdatum
FROM (
  SELECT Top 7 tdatum as ATag
  FROM alleArbeitstage
  WHERE tdatum >= #09/29/2025#
)   

 

Gruß Knobbi38

PS:
Zum Testen noch den 3.10. als Feiertag eintragen.

Knobbi38

Hallo Alfini,

es geht natürlich auch noch etwas einfacher:
SELECT TOP 1 TDatum
FROM tblAlleTage
WHERE TDatum > #09/29/2025# +6  AND WT < 6 AND Feiertag = 0

Knobbi38