🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych.msaccess
Article #137457

Re: Dni robocze ...

#137457
From: md
Date: Tue, 16 May 2017 04:59
95 lines
4680 bytes
W dniu 11-05-2017 o 16:36, krzysztof.janusz@delkar.pl pisze:
> Witam. Powrócę do dawno poruszanego tematu dni roboczych.Problem polega na poprawności wyliczenia dni roboczych - program którego autorem jest Robert Łowczak znaleziony na stronie access.vis.pl. Uzupełniłem tabelę święta o dwa dni 01-05-2017 i 03-05-2017 - po wprowadzeniu zakresu dat od 28-04-2017 do 04-05-2017 - w wyniku otrzymuję 5 dni roboczych. Sprawdzałem wyliczenia pomiędzy różnymi datami (gdzie nie występują święta) i wtedy dni robocze wyliczane są prawidłowo. Jak może być tego przyczyna ?
> W uzupełnieniu podaję procedurę wyliczającą dni ogółem (z tym nie ma najmniejszego problemu)
>  ----------------------------------------------------------------------
>  Me.txtDniOgolem = (Me.txtDataDo - Me.txtDataOd) + 1
>
>  i wyliczanie dni robocze :
>  ----------------------------------------------------------------------
>  Set rstDAO = CurrentDb.OpenRecordset("SELECT * FROM tblSwieta", dbOpenSnapshot)
>
>  dtStartDate = DateValue(Me.txtDataOd)
>  dtEndDate = DateValue(Me.txtDataDo)
>  dtStartDate = dtStartDate
>  intPolicz = 0
>
>  Do While dtStartDate <= dtEndDate
>
>  rstDAO.FindFirst "[Swieto] = #" & dtStartDate & "#"
>  If Weekday(dtStartDate) <> vbSunday And Weekday(dtStartDate) <> vbSaturday Then
>  If rstDAO.NoMatch Then intPolicz = intPolicz + 1
>  End If
>
>  dtStartDate = dtStartDate + 1
>  Loop
>
>  Me.txtDniRobocze = intPolicz
>
>  rstDAO.Close
>  Set rstDAO = Nothing
>  -------------------------------------------------------------------------
>  Z góry dziękuje za pomoc.
>

proponuje takie rozwiazanie:

Function czy_swieto(dzien As Date) As Boolean
On Error GoTo blad

                 If _
                     Weekday(dzien, vbMonday) = 7 Or _
                     Weekday(dzien, vbMonday) = 6 Or _
                     Month(dzien) = 1 And Day(dzien) = 1 Or _
                     Month(dzien) = 1 And Day(dzien) = 6 Or _
                     Month(dzien) = 5 And Day(dzien) = 1 Or _
                     Month(dzien) = 5 And Day(dzien) = 3 Or _
                     Month(dzien) = 8 And Day(dzien) = 15 Or _
                     Month(dzien) = 11 And Day(dzien) = 1 Or _
                     Month(dzien) = 11 And Day(dzien) = 11 Or _
                     Month(dzien) = 12 And Day(dzien) = 25 Or _
                     Month(dzien) = 12 And Day(dzien) = 26 Or _
                     dzien = Wielkanoc(Year(dzien)) Or _
                     dzien = Wielkanoc(Year(dzien)) + 59 _
                 Then
                     czy_swieto = True
                 Else
                     czy_swieto = False
                 End If

wyjscie:
     DoCmd.SetWarnings -1
     Exit Function
blad:
     MsgBox Err.Description, vbCritical, "Błąd " & Err.Number
     Resume wyjscie
End Function



Public Function Wielkanoc(rok As Integer) As Date
Dim a As Integer, b As Integer, c As Integer, D As Integer, e As 
Integer, f As Integer, g As Integer, h As Integer, i As Integer, l As 
Integer, M As Integer, p As Integer, n As Integer, k As Integer

         a = rok Mod 19
         b = Int(rok / 100)
         c = rok Mod 100
         D = Int(b / 4)
         e = b Mod 4
         f = Int((b + 8) / 25)
         g = Int((b - f + 1) / 3)
         h = (19 * a + b - D - g + 15) Mod 30
         i = Int(c / 4)
         k = c Mod 4
         l = (32 + 2 * e + 2 * i - h - k) Mod 7
         M = Int((a + 11 * h + 22 * l) / 451)
         p = (h + l - 7 * M + 114) Mod 31
         p = p + 1
         n = Int((h + l - 7 * M + 114) / 31)

'poniedziałek
    Wielkanoc = DateSerial(rok, n, p + 1)

End Function

md
Technical Details
Message-ID: <591a8706$0$15201$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin2!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <60168896-416e-4f0e-bbc9-f65e8b146b0c@googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin2!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Subject: Re: Dni robocze ...
Newsgroups: pl.comp.bazy-danych.msaccess
References: <60168896-416e-4f0e-bbc9-f65e8b146b0c@googlegroups.com>
From: md <bmkd@poczta.onet.pl>
Date: Tue, 16 May 2017 06:59:26 +0200
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0
MIME-Version: 1.0
In-Reply-To: <60168896-416e-4f0e-bbc9-f65e8b146b0c@googlegroups.com>
Lines: 96
Message-ID: <591a8706$0$15201$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 95.48.0.238
X-Trace: 1494910726 unt-rea-a-02.news.neostrada.pl 15201 95.48.0.238:52262
X-Complaints-To: abuse@news.neostrada.pl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit