Newsgroup: it.comp.appl.access
Titolo: CONTEGGIO GIORNI LAVORATIVI , AIUTO!!!!

dovrei trovare la data entro la quale eseguire un lavoro per non incorrere
nella penale:
  14/03/03    ho 180 giorni LAVORATIVI  per eseguire il lavoro,
 mi serve la  data di scadenza senza andare 10 volte al giorno a contare i
giorni lavorativi nel calendario.
Nel sito comune ho trovato questo testo qui sotto ma non so come organizzare
il tutto, mi servirebbe una dritta....anche 2.
                            Chi mi può aiutare.........
Grazie Sauro
Public Function ContaLavorativi(DataIniziale As Date, DataFinale _
           As Date, Settimanacorta As Boolean) As Integer
   'Autore: Silvio Mazzetto
   'Accetta:
   ' DataIniziale = data iniziale del periodo scelto
   ' DataFinale = data finale del periodo scelto
   ' Settimanacorta = True se bisogna considerare la settimana corta
   'Restituisce: numero di giorni lavorativi del periodo
   'La funzione utilizza Festivo() e Pasqua() usabili anche separatamente
   Dim DataDaContare As Date, Conto As Integer
   If Not IsDate(DataIniziale) Or Not IsDate(DataFinale) Or DataIniziale > _
      DataFinale Then
      ContaLavorativi = 0
      Exit Function
   End If
   DataDaContare = DataIniziale - 1
   If Settimanacorta Then
      Do
         DataDaContare = DataDaContare + 1
         If Not Festivo(DataDaContare) And WeekDay(DataDaContare) <> 7 Then
            Conto = Conto + 1
         End IF
      Loop Until DataDaContare = DataFinale
   Else
      Do
         DataDaContare = DataDaContare + 1
         If Not Festivo(DataDaContare) Then Conto = Conto + 1
         Loop Until DataDaContare = DataFinale
   End If
   ContaLavorativi = Conto
End Function
Public Function Festivo(D As Date) As Boolean
   'Autore: Silvio Mazzetto
   'Accetta: una data
   'Restituisce: True se è un giorno festivo
   'Eventualmente inserire anche il Santo Patrono della città
   Dim Anno As Integer, DayMax As Date, DayMin As Date
   Anno = Year(D)
   If WeekDay(D) = 1 Then
      Festivo = True
      Exit Function
   End If
   If Day(D) = 1 And (Month(D) = 1 Or Month(D) = 5 Or Month(D) = 11) Or _
         Day(D) = 6 And Month(D) = 1 Or Day(D) = 25 And (Month(D) = 4 Or _
         Month(D) = 12) Or Day(D) = 15 And Month(D) = 8 Or (Day(D) = 8 Or _
         Day(D) = 26) And Month(D) = 12 Then
      Festivo = True
      Exit Function
   End If
   'intervallo in cui può cadere il Lunedì di Pasqua
   DayMax = DateValue("20/4/" & Anno)
   DayMin = DateValue("20/3/" & Anno)
   If WeekDay(D) = 2 And D <= DayMax And D >= DayMin Then
      If D = (Pasqua(Anno) + 1) Then
         Festivo = True
         Exit Function
      End If
   End If
   Festivo = False
End Function
Public Function Pasqua(Anno As Integer) As Date
   'Autore: G.Paolo Bizzaro
   'Accetta: anno (4 cifre)
   'Restituisce: giorno di Pasqua dell'anno scelto
   'Il metodo è valido per tutti gli anni nel Calendario Gregoriano,
   'ossia dal 1583 in poi
   Dim a%, b%, c%, p%, q%, r%
   a = anno% Mod 19: b = anno% \ 100: c = anno% Mod 100
   p = (19 * a + b - (b \ 4) - ((b - ((b + 8) \ 25) + 1) \ 3) + 15) Mod 30
   q = (32 + 2 * ((b Mod 4) + (c \ 4)) - p - (c Mod 4)) Mod 7
   r = (p + q - 7 * ((a + 11 * p + 22 * q) \ 451) + 114)
   Pasqua = DateSerial(anno%, r \ 31, (r Mod 31) + 1)
End Function

 ha scritto nel messaggio
news:Khwca.14106$7y3.4...@twister1.libero.it...

Per prima cosa nella funzione Festivo di cui sopre devi sostituire la riga
di codice:
DayMax = DateValue("20/4/" & Anno)
con la seguente:
DayMax = DateValue("21/4/" & Anno)
altrimenti quest'anno non ti considera festivo il lunedì di Pasqua che cade
appunto il 21 aprile.
Poi, se vuoi un dato preciso, devi modificare la funzione Festivo per fargli
considerare festivo anche il giorno del Santo Patrono che varia da città a
città.
Ciò premesso, se la data di partenza è contenuta in una casella di testo
chiamata MiaData e la data di scadenza la vuoi in una casella di testo
chiamata DataScadenza, per calcolarti una data scadenza che cada 180 giorni
lavorativi dalla data di partenza e se vuoi considerare la settimana corta
(sabato non lavorativo), esegui il seguente codice VBA:
Me!DataScadenza = Me!MiaData + 180
DoCmd.Hourglass True
Do Until 1 = 2
If ContaLavorativi(Me!MiaData, _
Me!DataScadenza, True) = 180 Then Exit Do
Me!DataScadenza = Me!DataScadenza + 1
Loop
DoCmd.Hourglass False
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 Roberto
ti ringrazio dell' interessamento:
1) ti devo specificare  che i giorni sono variabili da lavoro a lavoro, da 5
minimi di un semplice allaccio a 240 massimi per lavori molto complessi dove
per esempio devo palificare una campagna per portare l'energia elettrica a
una casa isolata ,
2) non so dove devo inserire tutti quei codici qui sopra, cosa devo creare?
    Forse mi sono perso.......se hai tempo spiegami meglio come l'altra
volta con le Classifiche
                Saluti Sauro

 ha scritto nel messaggio
news:5%Pca.16604$7y3.5...@twister1.libero.it...

Io conosco il tuo database quindi faccio una ipotesi di utilizzo.
Se hai una maschera in cui c'è una casella di testo chiamata MiaData dove
digiti la data di inizio lavori.
Se nella maschera hai una casella di testo chiamata Durata dove digiti la
durata del lavoro in giorni lavorativi.
Se nella maschera hai una casella di testo chiamata chiamata DataScadenza in
cui vuoi visualizzare la data massima della fine dei lavori.
A fronte dell'evento "Dopo aggiornamento" sia del controllo MiaData che del
controllo Durata genera il seguente codice VBA:
If Not IsNull(Me!MiaData) And Not IsNull(Me!Durata) Then
Me!DataScadenza = Me!MiaData + Me!Durata
DoCmd.Hourglass True
Do Until 1 = 2
If ContaLavorativi(Me!MiaData, _
Me!DataScadenza, True) = Me!Durata Then Exit Do
Me!DataScadenza = Me!DataScadenza + 1
Loop
DoCmd.Hourglass False
End If
Genera questo codice VBA anche a fronte dell'evento "Su corrente" della
maschera.
Se questa ipotesi è lontana dalla tua realtà, fanne una tu.
