Newsgroup: it.comp.appl.access
Titolo: Modifica Funzione

Ciao a Tutti,
Vorrei modificare una funzione che mi calcola i giorni di lavoro e non il sabato domenica e festivi, ma se inserisco una variazione, salta tutto.
Nota la funzione la richiamo dalla query.
QUERY:
SELECT Scadenza.ID, Scadenza.Datainizio, Scadenza.Giorni, Scadenza.SabatoFesta, Scadenza.Variazione, GiorniLav3([DataInizio],[Giorni],[SabatoFesta]) AS Scadenza
FROM Scadenza;
FUNZIONE:
Public Function GiorniLav3(ByVal DataInizio As Date, ByVal Giorni As Long, _
     Optional ByVal SabatoFesta As Boolean = True) As Date
 
 
    ' DataInizio considera solo la parte data.
     DataInizio = DateValue(DataInizio)
 
        Do While Giorni
         ' Test se giorno della settimana esclude Sab e Dom
         If Weekday(DataInizio) <> vbSunday And (Weekday(DataInizio) <> vbSaturday _
            Or Not SabatoFesta) And _
            IsNull(DLookup("Data", "Holidays", "Data=" & Format(DataInizio, "\#mm\/dd\/yyyy\#"))) = True Then
            ' I Giorni vanno verso lo zero
            Giorni = Giorni - Sgn(Giorni)
         End If
 
        ' incrementa o decrementa la DataInizio
         DataInizio = DataInizio + Sgn(Giorni)
 
    Loop
 
    GiorniLav3 = DataInizio
 
End Function
Mi aiutate!!!

 
Ti dico subito che questa funzione anch'io ho trovato questa funzione
resa disponibile in rete
 
Private Sub DataInizio_AfterUpdate()
    Dim DataInizio As Date
    Dim DataFine As Date
    Dim DataConsegna As Date
    Dim Giorni_ver As String
    Dim Giorni2 As String
 
 
    If Me.Check = True Then
        Giorni2 = Me.Giorni - 1
        If Me!Giorni > 0 Then
            Giorni_ver = Abs(Giorni2 + 1)
        Else
            Giorni_ver = Abs(Giorni2 - 1)
        End If
    Else
        Giorni2 = Me.Gg
        If Me!Giorni > 0 Then
            Giorni_ver = Abs(Giorni2 + 1)
        Else
            Giorni_ver = Abs(Giorni2 - 1)
        End If
    End If
 
    DataInizio = Me.DataInizio
    DataFine = DataInizio + Giorni2
 
    Do Until 1 = 2
        If Me!Giorni > 0 Then
            If ContaLavorativi(DataInizio, DataFine, True) = Giorni_ver Then
                Exit Do
            End If
        Else
            If ContaLavorativi(DataFine, DataInizio, True) = Giorni_ver Then
                Exit Do
            End If
        End If
        If Me!Giorni > 0 Then
            DataFine = DataFine + 1
        Else
            DataFine = DataFine - 1
        End If
    Loop
 
    Me.DataFine = DataFine
End Sub
 
per� devi anche calcolare anche Natale, capodanno, Pasqua e la festa del
patrono e quindi "Contagiornilavorativi" punta ad altre funzioni:
1� funzione
Public Function ContaLavorativi(DataIniziale As Date, DataFinale As
Date, Settimanacorta As Boolean) As Integer
   '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
   Dim Conto As Integer
 
 
   'DataIniziale = DataInizioProduzione
   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
 
2� funzione
Public Function Festivo(D As Date) As Boolean
   'Restituisce: True se � un giorno festivo
   'Eventualmente inserire anche il Santo Patrono della citt�
   'Modificato da Roberto
   Dim Anno As Integer
   Dim DayMax As Date
   Dim 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 Or Day(D) = 21 And Month(D) = 1 Then
      Festivo = True
      Exit Function
   End If
 
   'intervallo in cui pu� cadere il Luned� di Pasqua
   DayMax = DateValue("21/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
 
3� funzione
Public Function Pasqua(Anno As Integer) As Date
   '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
 
Ringrazio chi ha condiviso questo lavoro
-- 
      maurizio56
 
 
browser: FireFox 17.01
mailreader: ThunderBird 17





Il giorno sabato 1 dicembre 2012 18:50:22 UTC+1, Gianf ha scritto:

  Scusa ho fatto un pasticcio con i post..
Ma allora devo fare una query da cui faccio riferimento alla funzione?
Scusa mi faresti un esempio con SQL.
Gianfranco