Thread View: pl.comp.bazy-danych.msaccess
6 messages
6 total messages
Started by krzysztof.janusz
Thu, 11 May 2017 07:36
Dni robocze ...
Author: krzysztof.janusz
Date: Thu, 11 May 2017 07:36
Date: Thu, 11 May 2017 07:36
40 lines
1666 bytes
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 ...
Author: Smyk
Date: Mon, 15 May 2017 11:21
Date: Mon, 15 May 2017 11:21
7 lines
182 bytes
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 ...
Author: Krzysiek ZULUS
Date: Mon, 15 May 2017 22:54
Date: Mon, 15 May 2017 22:54
64 lines
2288 bytes
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 ...
Author: md
Date: Tue, 16 May 2017 06:59
Date: Tue, 16 May 2017 06:59
95 lines
3631 bytes
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 ...
Author: minfo@onet.pl
Date: Wed, 17 May 2017 00:47
Date: Wed, 17 May 2017 00:47
38 lines
784 bytes
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 ...
Author: Krzysiek ZULUS
Date: Fri, 19 May 2017 02:37
Date: Fri, 19 May 2017 02:37
41 lines
1013 bytes
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