🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych.msaccess
6 messages
6 total messages Started by krzysztof.janusz Thu, 11 May 2017 07:36
Dni robocze ...
#133915
Author: krzysztof.janusz
Date: Thu, 11 May 2017 07:36
40 lines
1666 bytes
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.
Re: Dni robocze ...
#133916
Author: Smyk
Date: Mon, 15 May 2017 11:21
7 lines
182 bytes
krzysztof.janusz@delkar.pl wrote at Do 11.05.2017 16:36:

>  dtStartDate = dtStartDate + 1

Tak chyba nie da siê inkrementowaæ zmiennych typu Date.
U¿yj funkcji DateAdd()

Ciao, Smyk
Re: Dni robocze ...
#133918
Author: Krzysiek ZULUS
Date: Mon, 15 May 2017 22:54
64 lines
2288 bytes
Dziękuję :-)

> 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
Re: Dni robocze ...
#133917
Author: md
Date: Tue, 16 May 2017 06:59
95 lines
3631 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
Re: Dni robocze ...
#133919
Author: minfo@onet.pl
Date: Wed, 17 May 2017 00:47
38 lines
784 bytes
Witaj,
Możesz też użyć zmodyfikowanej funkcji Artura Powałki (C) -1999
Powiązałem z napisaną powyżej funkcją czy_swieto


Function WorkingDays(StartDate As Variant, EndDate As Variant) As Long
' Copyright (C) X.1999 Artur Powalka
' funkcja liczy ilosc dni roboczych w zadanym
'przedziale czasu

Dim l As Long           ' licznik
Dim dtData As Date      ' tymczasowa zmienna do daty

' obsluga blednych danych
If IsNull(StartDate) Or IsNull(EndDate) Then
    WorkingDays = 0
    Exit Function
End If

' inicjalizacja zmiennych
l = 0
'dtData = StartDate

For dtData = StartDate To EndDate
    
        If Not czy_swieto(dtData) Then
            l = l + 1
        End If


Next dtData

WorkingDays = l

End Function

/
MF
Re: Dni robocze ...
#133920
Author: Krzysiek ZULUS
Date: Fri, 19 May 2017 02:37
41 lines
1013 bytes
W dniu środa, 17 maja 2017 09:47:51 UTC+2 użytkownik mi...@onet.pl napisał:
> Witaj,
> Możesz też użyć zmodyfikowanej funkcji Artura Powałki (C) -1999
> Powiązałem z napisaną powyżej funkcją czy_swieto
> 
> 
> Function WorkingDays(StartDate As Variant, EndDate As Variant) As Long
> ' Copyright (C) X.1999 Artur Powalka
> ' funkcja liczy ilosc dni roboczych w zadanym
> 'przedziale czasu
> 
> Dim l As Long           ' licznik
> Dim dtData As Date      ' tymczasowa zmienna do daty
> 
> ' obsluga blednych danych
> If IsNull(StartDate) Or IsNull(EndDate) Then
>     WorkingDays = 0
>     Exit Function
> End If
> 
> ' inicjalizacja zmiennych
> l = 0
> 'dtData = StartDate
> 
> For dtData = StartDate To EndDate
>     
>         If Not czy_swieto(dtData) Then
>             l = l + 1
>         End If
> 
> 
> Next dtData
> 
> WorkingDays = l
> 
> End Function
> 
> /
> MF
Dziękuję za odpowiedź.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads