Thread View: pl.comp.bazy-danych.msaccess
6 messages
6 total messages
Started by krzysztof.janusz
Thu, 11 May 2017 14:36
Dni robocze ...
Author: krzysztof.janusz
Date: Thu, 11 May 2017 14:36
Date: Thu, 11 May 2017 14:36
30 lines
2643 bytes
2643 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 ...
Author: Smyk
Date: Mon, 15 May 2017 09:21
Date: Mon, 15 May 2017 09:21
8 lines
1295 bytes
1295 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 ...
Author: md
Date: Tue, 16 May 2017 04:59
Date: Tue, 16 May 2017 04:59
95 lines
4680 bytes
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
Re: Dni robocze ...
Author: Krzysiek ZULUS
Date: Tue, 16 May 2017 05:54
Date: Tue, 16 May 2017 05:54
64 lines
3553 bytes
3553 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 ...
Author: minfo
Date: Wed, 17 May 2017 07:47
Date: Wed, 17 May 2017 07:47
38 lines
2243 bytes
2243 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 ...
Author: Krzysiek ZULUS
Date: Fri, 19 May 2017 09:37
Date: Fri, 19 May 2017 09:37
40 lines
2399 bytes
2399 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