Newsgroup: it.comp.appl.access
Titolo: auguri ed info funzione datediff personalizzata

innanzitutto auguri a tutti
era da moltissimo (1,5 anni) che non sbirciavo il news ed anche il sito
comune
e noto con piacere la costante presenza costante di molte persone che
anche in passato e tutt'oggi
offrono il proprio aiuto (i cosidetti pilastri del news)
anche il sito comune mi sembra in prima battuta ottimo (tra l'altro
interessante il cerca)
ma gli ho dato solo una sbirciatina
ringrazio tutti per l'impegno e la costanza dimostrata
approfittando del ritorno a casa porgo in modo volante 2 questions
(mi auguro che oggi non mi risponda nessuno, altrimenti siete prorpio
drogati da access :-))
1) Volevo realizzare una funzione DateDiff con del mio codice, quindi
totalmente
svincolata da funzioni interne del Pc, ma una procedura di calcolo che
ottenesse lo stesso risultato
2) Idem per DateAdd

innanzitutto auguri a tutti
era da moltissimo (1,5 anni) che non sbirciavo il news ed anche il sito
comune e noto con piacere la  presenza costante di molte persone che
anche in passato e tutt'oggi offrono il proprio aiuto (i cosidetti
pilastri del news)
anche il sito comune mi sembra in prima battuta ottimo (tra l'altro
interessante il cerca) ma gli ho dato solo una sbirciatina, quindi
ipotizzo che č ancora meglio.
ringrazio tutti per l'impegno e la costanza dimostrata nel mantenimento
e sviluppo del sito e del news.
approfittando del ritorno a casa porgo in modo volante 2 questions
(mi auguro che oggi non mi risponda nessuno, altrimenti siete prorpio
drogati da access :-))
1) Volevo realizzare una funzione DateDiff con del mio codice, quindi
totalmente
svincolata da funzioni interne del Pc, ma una procedura di calcolo che
ottenesse lo stesso risultato
2) Idem per DateAdd
(access 97)

 2) Idem per DateAdd
Che intendi per svincolarsi dalle funzioni del pc?
Intendi di access?
Antonio

 Intendi di access?
Probabilmente dall'orologio interno del PC

 Antonio
esatto quelle di access.
cioè con datediff e dateadd io basta che uso le 2 funzioni ed ho il risultato
mentre con del codice mio dovrei elaborare ipotizzo un ciclo che mi va a
contare tutti
i giorni mese per mese tenendo conto degli anni bisestili, insomma abbastanza
complicato.
ma si può vedere qual'è il codice che sta dietro a tale funzioni predefinite di
access?
 ciao
a proposito come è andata a finire la storia del clone?
fatto salvo che sei il doc.

 ha scritto nel messaggio news:3C29C826...@lycos.it...

Ciao,
intendevi qualcosa del genere... ???
Se proprio vuoi eliminare completamente le funzioni DatePart... DateAdd... etc.. devi usare un po'
di api...
che si sa.. con api...
Buone Feste
Dario
----------------------------------------------------------------------------------------------------
----------------------------------
'Dichiarazioni delle costanti e delle strutture necessarie
Option Explicit
Type Orologio
    Ora As Integer
    Minu As Byte
    Sec As Double
End Type
Type Calendario
    Anno As Integer
    Mese As Integer
    Giorno As Integer
    Settim As Integer
    OraGiorno As Orologio
End Type
'Giorni nei mesi
Private Function GiorniMese(Index As Integer) As Integer
    Static giorni(12) As Integer
    giorni(0) = 0
    giorni(1) = 31
    giorni(2) = 28
    giorni(3) = 31
    giorni(4) = 30
    giorni(5) = 31
    giorni(6) = 30
    giorni(7) = 31
    giorni(8) = 31
    giorni(9) = 30
    giorni(10) = 31
    giorni(11) = 30
    giorni(12) = 31
    GiorniMese = giorni(Index)
End Function
'Somma tra Ore in sesagesimale
Private Function SumOre(Add1 As Orologio, Add2 As Orologio) As Orologio
    Dim Res As Orologio
    Res.Ora = Add1.Ora + Add2.Ora
    Res.Minu = Add1.Minu + Add2.Minu
    If Res.Minu >= 60 Then
        Res.Ora = Res.Ora + Int(Res.Minu / 60)
        Res.Minu = Res.Minu Mod 60
    End If
    Res.Sec = Add1.Sec + Add2.Sec
    If Res.Sec >= 60 Then
        Res.Minu = Res.Minu + Int(Res.Sec / 60)
        Res.Sec = Res.Sec - Int(Res.Sec / 60)
    End If
    SumOre = Res
End Function
'Differenza tra Ore in sesagesimale
Private Function DifOre(Dif1 As Orologio, Dif2 As Orologio) As Orologio
    Dim Res As Orologio
    If Dif2.Sec > Dif1.Sec Then
        Dif1.Sec = Dif1.Sec + 60
        Dif1.Minu = Dif1.Minu - 1
    End If
    If Dif2.Minu > Dif1.Minu Then
        Dif1.Minu = Dif1.Minu + 60
        Dif1.Ora = Dif1.Ora - 1
    End If
    Res.Sec = Dif1.Sec - Dif2.Sec
    Res.Minu = Dif1.Minu - Dif2.Minu
    Res.Ora = Dif1.Ora - Dif2.Ora
    DifOre = Res
End Function
Private Function DateToCalendario(ByVal DataRif As Date) As Calendario
    Dim Res As Calendario
    Res.Anno = DatePart("yyyy", DataRif)
    Res.Mese = DatePart("m", DataRif)
    Res.Giorno = DatePart("d", DataRif)
    Res.Settim = Weekday(DataRif) - 1
    Res.OraGiorno.Sec = DatePart("s", DataRif)
    Res.OraGiorno.Minu = DatePart("n", DataRif)
    Res.OraGiorno.Ora = DatePart("h", DataRif)
    DateToCalendario = Res
End Function
Private Function CalendarioToDate(DataRif As Calendario) As Date
    Dim Res As Date
    Res = DateSerial(DataRif.Anno, DataRif.Mese, DataRif.Giorno)
    Res = DateAdd("s", DataRif.OraGiorno.Sec, Res)
    Res = DateAdd("n", DataRif.OraGiorno.Minu, Res)
    Res = DateAdd("h", DataRif.OraGiorno.Ora, Res)
    CalendarioToDate = Res
End Function
'Funzione che ritorna la posizione nella settimana di un giorno di data indicata.
'Il calcolo è basato sulla Congruenza di Zeller
Private Function NumGiorno(ByVal Giorno As Integer, ByVal Mese As Integer, ByVal Anno As Integer) As
Integer
    Dim Index As Integer
    If (Anno < 90) Then
        Anno = Anno + 2000
    ElseIf (Anno < 100) Then
        Anno = Anno + 1900
    End If
    If (Mese > 2) Then
        Mese = Mese - 2
    Else
        Mese = Mese + 10
        Anno = Anno - 1
    End If
    Index = ((13 * Mese - 1) / 5) + Giorno + (Anno Mod 100) + ((Anno Mod 100) / 4) + ((Anno / 100) /
4) - 2 * (Anno / 100) + 77
    Index = Index - 7 * Int(Index / 7)
    NumGiorno = Index
End Function
'Verifica se l'anno considerato è bisestile
Private Function Bisesto(ByVal Anno As Integer) As Integer
    If (Anno Mod 4 = 0) And (Anno Mod 100 <> 0) Or (Anno Mod 400 = 0) Then
        Bisesto = 1
    Else
        Bisesto = 0
    End If
End Function
'Modifica la data passata come argomento al fine di renderla formalmente corretta
'restituisce vero in caso di successo, falso altrimenti.
Private Function AggiustaData(DataRif As Calendario) As Boolean
On Error GoTo AggData_Err
    If DataRif.OraGiorno.Sec > 60 Then
        DataRif.OraGiorno.Minu = DataRif.OraGiorno.Minu + Int(DataRif.OraGiorno.Sec / 60)
        DataRif.OraGiorno.Sec = -Int(DataRif.OraGiorno.Sec / 60) * 60 + DataRif.OraGiorno.Sec
    End If
    If DataRif.OraGiorno.Minu > 60 Then
        DataRif.OraGiorno.Ora = DataRif.OraGiorno.Ora + Int(DataRif.OraGiorno.Minu / 60)
        DataRif.OraGiorno.Minu = -Int(DataRif.OraGiorno.Minu / 60) * 60 + DataRif.OraGiorno.Minu
    End If
    If DataRif.OraGiorno.Ora > 24 Then
        DataRif.Giorno = DataRif.Giorno + Int(DataRif.OraGiorno.Ora / 24)
        DataRif.OraGiorno.Ora = -Int(DataRif.OraGiorno.Ora / 24) * 24 + DataRif.OraGiorno.Ora
    End If
    If DataRif.Giorno > (GiorniMese(DataRif.Mese) + IIf(DataRif.Mese = 2, Bisesto(DataRif.Anno), 0))
Then
        DataRif.Giorno = DataRif.Giorno - GiorniMese(DataRif.Mese)
        DataRif.Mese = DataRif.Mese + 1
    End If
    If DataRif.Mese > 12 Then
        DataRif.Mese = DataRif.Mese - 12
        DataRif.Anno = DataRif.Anno + 1
    End If
    DataRif.Settim = NumGiorno(DataRif.Giorno, DataRif.Mese, DataRif.Anno)
    AggiustaData = True
    Exit Function
AggData_Err:
    AggiustaData = False
End Function
'Determina il numero giuliano per data. Il conteggio include anche il giorno
Private Function Juliano(ByVal Giorno As Integer, ByVal Mese As Integer, ByVal Anno As Integer) As
Integer
    Static SGiorni(13) As Integer
    Dim TotGiorni As Integer
    SGiorni(0) = 0
    SGiorni(1) = 31
    SGiorni(2) = 59
    SGiorni(3) = 90
    SGiorni(4) = 120
    SGiorni(5) = 151
    SGiorni(6) = 181
    SGiorni(7) = 212
    SGiorni(8) = 243
    SGiorni(9) = 273
    SGiorni(10) = 304
    SGiorni(11) = 334
    SGiorni(12) = 365
    TotGiorni = SGiorni(Mese - 1) + Giorno
    If (Mese > 2) Then
        TotGiorni = TotGiorni + Bisesto(Anno)
    End If
    Juliano = TotGiorni
End Function
Private Function OreCmp(Ora1 As Orologio, Criterio As String, Ora2 As Orologio) As Boolean
    On Error GoTo OreCmp_Err
    Dim Local1 As Double
    Dim Local2 As Double
    Local1 = OraToSecondi(Ora1)
    Local2 = OraToSecondi(Ora2)
    Select Case Criterio
        Case "<"
            OreCmp = (Local1 < Local2)
        Case "=<"
            OreCmp = (Local1 <= Local2)
        Case "<="
            OreCmp = (Local1 <= Local2)
        Case ">"
            OreCmp = (Local1 > Local2)
        Case "=>"
            OreCmp = (Local1 >= Local2)
        Case ">="
            OreCmp = (Local1 >= Local2)
        Case "="
            OreCmp = (Local1 = Local2)
        Case "<>"
            OreCmp = (Local1 <> Local2)
        Case "!="
            OreCmp = (Local1 <> Local2)
    End Select
    Exit Function
OreCmp_Err:
    MsgBox Err.Description & " : " & Str(Err.Number), vbOKOnly, "Errore Interno"
    Resume Next
End Function
Private Function SecondiToOra(ByVal NumSecondi As Double) As Orologio
    Dim Comodo As Orologio
    Comodo.Ora = Int(NumSecondi / 3600&)
    NumSecondi = NumSecondi - Comodo.Ora * 3600&
    Comodo.Minu = Int(NumSecondi / 60)
    NumSecondi = NumSecondi - Comodo.Minu * 60&
    Comodo.Sec = Int(NumSecondi)
    SecondiToOra = Comodo
End Function
Private Function OraToSecondi(Comodo As Orologio) As Double
    OraToSecondi = Comodo.Ora * 3600& + Comodo.Minu * 60& + Comodo.Sec
End Function
'Questa funzione verifica se il dato Ora è compreso nei limiti prefissati.
'Se appartiene all'intervallo viene restituito ndEntro.
'Se è < di Limite Inferiore viene restituito ndBasso.
'Se è > al Limite Superiore viene restituito ndAlto.
Private Function IsBetween(Ora As Orologio, LimInf As Orologio, LimSup As Orologio) As Integer
    If OreCmp(Ora, "<", LimInf) Then
        IsBetween = ndBasso
        Exit Function
    End If
    If OreCmp(Ora, ">", LimSup) Then
        IsBetween = ndAlto
        Exit Function
    End If
    If OreCmp(Ora, "<=", LimSup) And OreCmp(Ora, ">=", LimInf) Then
        IsBetween = ndEntro
        Exit Function
    End If
End Function
Private Function InitOra(Ore As Integer, Minuti As Byte, Secondi As Double) As Orologio
    Dim Locale As Orologio
    Locale.Ora = Ore
    Locale.Minu = Minuti
    Locale.Sec = Secondi
    If (Locale.Sec > 60) Then
        Locale.Minu = Locale.Minu + Int(Locale.Sec / 60)
        Locale.Sec = Locale.Sec - Int(Locale.Sec / 60) * 60
    End If
    If (Locale.Minu > 60) Then
        Locale.Ora = Locale.Ora + Int(Locale.Minu / 60)
        Locale.Minu = Locale.Minu - Int(Locale.Minu / 60)
    End If
    InitOra = Locale
End Function

grazie gli darň un'occhiata con calma

 Buone Feste
altrettanto

 a proposito come č andata a finire la storia del clone?
Deve essere crepato dalla rabbia
Antonio


complimenti!
alla faccia dell'aiutino!
Saluti.
Emanuele.

 Antonio


perchè l'editor non lo prevede!?
Saluti.
Emanuele.