OVH Cloud OVH Cloud

solde entre deux dates

9 réponses
Avatar
anonymous
bonjour

j'ai cree une table access ainsi qu'un formulaire pour=20
rentrer les donn=E9es et je voudrai avoir un solde ou un=20
=E9cart en jour entre par exemple la date du debut du projet=20
et la date de r=E9alisation.
Et si possible aussi pouvoir tenir compte des jours f=E9ri=E9s=20
et weekend pour la valeur du solde.
Merci d'avance...

9 réponses

Avatar
Jessy Sempere [MVP]
Bonjour

Copies le code qui suit dans un module standard de la base
de données, ensuite il te suffit d'utiliser la fonction :
NbOpenDay()

************************************************
Public Function fPaques(wAn%) As Date
'Pâques est le dimanche qui suit le quatorzième jour de la
'Lune qui tombe le 21 mars ou immédiatement après

Dim wA%, wB%, wC%, wD%, wE%, wF%, wG%, wH%
Dim wI%, wJ%, wK%, wL%, wM%, wN%, wP%

wA = wAn Mod 19 'Calcul du rang de l'année dans le cycle lunaire qui a 19 ans
wB = wAn 100 'Calcul du siècle
wC = wAn Mod 100 'Calcul du rang de l'année dans le siècle
wD = wB 4
wE = wB Mod 4
wF = (wB + 8) 25
wG = (wB - wF + 1) 3
wH = (19 * wA + wB - wD - wG + 15) Mod 30
wI = wC 4
wK = wC Mod 4
wL = (32 + 2 * wE + 2 * wI - wH - wK) Mod 7
wM = (wA + 11 * wH + 22 * wL) 451
wN = (wH + wL - 7 * wM + 114) 31 'détermine le mois
wP = (wH + wL - 7 * wM + 114) Mod 31 'détermine le jour

fPaques = DateSerial(wAn, wN, wP + 1)

'** A titre d'info :************'
'** dtVenSaint = fPaques - 2****'
'** dtLunPaq = fPaques + 1******'
'** dtAscension = fPaques + 39**'
'** dtDimPent = fPaques + 49****'
'** dtLunPent = fPaques + 50****'

End Function

Public Function OpenDay(dt As Date) As Boolean

If WeekDay(dt) <> 1 _
And WeekDay(dt) <> 7 _
And JourFérié(dt) = False Then
OpenDay = True
Else
OpenDay = False
End If

End Function
Public Function JourFérié(dtDate As Date) As Boolean

Dim dtPaques As Date
dtPaques = fPaques(Year(dtDate))
Select Case dtDate
Case CDate("01/01/" & Year(dtDate)) 'Jour de l'an
JourFérié = True
Case CDate("01/05/" & Year(dtDate)) 'Fête du travail
JourFérié = True
Case CDate("08/05/" & Year(dtDate)) 'Victoire de 1945
JourFérié = True
Case CDate("14/07/" & Year(dtDate)) 'Fête nationale
JourFérié = True
Case CDate("15/08/" & Year(dtDate)) 'Assomption
JourFérié = True
Case CDate("01/11/" & Year(dtDate)) 'Toussaint
JourFérié = True
Case CDate("11/11/" & Year(dtDate)) 'Armistie 1918
JourFérié = True
Case CDate("25/12/" & Year(dtDate)) 'Noël
JourFérié = True
Case dtPaques + 1 'Lundi de Pâques
JourFérié = True
Case dtPaques + 39 'Ascension
JourFérié = True
Case dtPaques + 50 'Lundi de pentcôte
JourFérié = True
Case Else
JourFérié = False
End Select

End Function

Public Function NbOpenDay(dtDeb As Date, dtFin As Date) As Integer
' Calculer le nombre de jours ouvrables entre deux dates
' Utilise la fonction JourFérié(dtDate As Date)

Dim dblDateDeb As Double
Dim dblDateFin As Double
Dim DateCourante As Date
Dim resultat As Integer

If IsNull(dtDeb) Or IsNull(dtFin) _
Or IsEmpty(dtDeb) Or IsEmpty(dtFin) Then
NbOpenDay = 0
Exit Function
ElseIf Not IsDate(dtDeb) Or Not IsDate(dtFin) Then
NbOpenDay = 0
Exit Function
ElseIf dtDeb > dtFin Then
Dim dhTemp As Date
dhTemp = dtDeb
dtDeb = dtFin
dtFin = dhTemp
End If

dblDateDeb = CDbl(dtDeb)
dblDateFin = CDbl(dtFin)

Do Until dblDateDeb > dblDateFin
DateCourante = CDate(dblDateDeb)
If WeekDay(DateCourante) <> 1 And _
WeekDay(DateCourante) <> 7 And _
JourFérié(DateCourante) = False Then
resultat = resultat + 1
End If
dblDateDeb = dblDateDeb + 1
Loop
NbOpenDay = resultat

End Function
************************************************

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"anonymous" a écrit dans le message news:
2ca2001c46a46$44861770$
bonjour

j'ai cree une table access ainsi qu'un formulaire pour
rentrer les données et je voudrai avoir un solde ou un
écart en jour entre par exemple la date du debut du projet
et la date de réalisation.
Et si possible aussi pouvoir tenir compte des jours fériés
et weekend pour la valeur du solde.
Merci d'avance...
Avatar
-----Message d'origine-----
Bonjour

Copies le code qui suit dans un module standard de la base
de données, ensuite il te suffit d'utiliser la fonction :
NbOpenDay()

-------------------------------------

J'ai bien executé tout ce que tu m'a dit mais j'ai un
problème lorsque je veux utiliser la fonction il me met :
NbreJoursOuvrablesTbl («dhDateDébut»; «dhDateFin») dans la
fenêtre "generateur d'expression" et je n'arrive pas a
mettre ce que je veux de mon formulaire à la place
de "dhdatedebut"... ou alors c'est que je ne peux pas le
faire...
merci

Avatar
-----Message d'origine-----
Bonjour

Copies le code qui suit dans un module standard de la base
de données, ensuite il te suffit d'utiliser la fonction :
NbOpenDay()

-------------------

OOPS je me suis trompé en fait g pris un code dans la
bibliothèque access que j'ai vu dans un autre topic, je te
le met pour que tu puisse essayer de m'aider merci :

---------------
Function NbreJoursOuvrablesTbl(ByVal dhDateDébut As Date,
ByVal dhDateFin As Date) As Integer
' Objectif: Compte le nombre de jours ouvrés entre deux
dates (exclusion des weekends/jours fériés).
' à l'aide d'une table des jours fériés.
' Paramètres en entrée:
' dhDateDébut:
' Date de départ de l'intervalle de temps désiré
au format européen entre guillemets
' dhDateFin:
' Date de fin de l'intervalle de temps désiré au
format européen entre guillemets.
' (les dates seront inversées si nécessaire)
Dim intDiffJours As Integer
Dim intSoustraction As Integer
Dim rst As Recordset, strRubrique As String
Set rst = CurrentDb.OpenRecordset("tblJoursFériés",
DAO.dbOpenDynaset)
strRubrique = "DateJourFérié"
' Test de validité des dates
If IsNull(dhDateDébut) Or IsNull(dhDateFin) Then
NombreJoursOuvrables = 0
Exit Function
ElseIf Not IsDate(dhDateDébut) Or Not IsDate(dhDateFin)
Then
NombreJoursOuvrables = 0
Exit Function
ElseIf dhDateDébut > dhDateFin Then
' Inversion des dates si nécessaire.
Dim dhTemp As Date
dhTemp = dhDateDébut
dhDateDébut = dhDateFin
dhDateFin = dhTemp
End If
' Calcul de la différence en jours entre les deux dates
intDiffJours = dhDateFin - dhDateDébut + 1
' Soustraction des samedis et dimanches. Algorithme:
Calcul du nombre de semaines
' entre les deux dates et multiplication de la différence
par 2.
intSoustraction = (DateDiff("ww", dhDateDébut, dhDateFin)
* 2)
' Il faut maintenant soustraire le total des jours fériés
indiqués par la table
intSoustraction = intSoustraction + CompteJoursFeriés(rst,
strRubrique, _
dhDateDébut, dhDateFin)
NbreJoursOuvrablesTbl = intDiffJours - intSoustraction
End Function
----------------------

Avatar
Jessy Sempere [MVP]
Bonjour

Le problème de ce code c'est qu'il te faut une table contenant
les jours fériés, c'est très génant, il te faut la compléter sans cesse
et ça alourdi inutilement la base...

Sincèrement essais le code que je t'ai donné, tu le copis dans son
intégralité dans un module standard de ta base, ensuite tu n'as
qu'à utiliser la fonction NbOpenDay(), pas besoin de tables avec
les jours fériés vu que c'est le code qui les calculs.

Dans ton formulaire ou même dans une requête, il te suffit de faire
un controle calculé qui a comme source :

=NbOpenDay([ChampDateDebut];[ChampDateFin])

Essais et dis moi ce qu'il en est...

--
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
a écrit dans le message news:
2d59901c46b13$90917920$

-----Message d'origine-----
Bonjour

Copies le code qui suit dans un module standard de la base
de données, ensuite il te suffit d'utiliser la fonction :
NbOpenDay()

-------------------

OOPS je me suis trompé en fait g pris un code dans la
bibliothèque access que j'ai vu dans un autre topic, je te
le met pour que tu puisse essayer de m'aider merci :

---------------
Function NbreJoursOuvrablesTbl(ByVal dhDateDébut As Date,
ByVal dhDateFin As Date) As Integer
' Objectif: Compte le nombre de jours ouvrés entre deux
dates (exclusion des weekends/jours fériés).
' à l'aide d'une table des jours fériés.
' Paramètres en entrée:
' dhDateDébut:
' Date de départ de l'intervalle de temps désiré
au format européen entre guillemets
' dhDateFin:
' Date de fin de l'intervalle de temps désiré au
format européen entre guillemets.
' (les dates seront inversées si nécessaire)
Dim intDiffJours As Integer
Dim intSoustraction As Integer
Dim rst As Recordset, strRubrique As String
Set rst = CurrentDb.OpenRecordset("tblJoursFériés",
DAO.dbOpenDynaset)
strRubrique = "DateJourFérié"
' Test de validité des dates
If IsNull(dhDateDébut) Or IsNull(dhDateFin) Then
NombreJoursOuvrables = 0
Exit Function
ElseIf Not IsDate(dhDateDébut) Or Not IsDate(dhDateFin)
Then
NombreJoursOuvrables = 0
Exit Function
ElseIf dhDateDébut > dhDateFin Then
' Inversion des dates si nécessaire.
Dim dhTemp As Date
dhTemp = dhDateDébut
dhDateDébut = dhDateFin
dhDateFin = dhTemp
End If
' Calcul de la différence en jours entre les deux dates
intDiffJours = dhDateFin - dhDateDébut + 1
' Soustraction des samedis et dimanches. Algorithme:
Calcul du nombre de semaines
' entre les deux dates et multiplication de la différence
par 2.
intSoustraction = (DateDiff("ww", dhDateDébut, dhDateFin)
* 2)
' Il faut maintenant soustraire le total des jours fériés
indiqués par la table
intSoustraction = intSoustraction + CompteJoursFeriés(rst,
strRubrique, _
dhDateDébut, dhDateFin)
NbreJoursOuvrablesTbl = intDiffJours - intSoustraction
End Function
----------------------

Avatar
-----Message d'origine-----
Bonjour

Le problème de ce code c'est qu'il te faut une table
contenant

les jours fériés, c'est très génant, il te faut la
compléter sans cesse

et ça alourdi inutilement la base...

Sincèrement essais le code que je t'ai donné, tu le copis
dans son

intégralité dans un module standard de ta base, ensuite
tu n'as

qu'à utiliser la fonction NbOpenDay(), pas besoin de
tables avec

les jours fériés vu que c'est le code qui les calculs.

Dans ton formulaire ou même dans une requête, il te
suffit de faire

un controle calculé qui a comme source :

=NbOpenDay([ChampDateDebut];[ChampDateFin])

Essais et dis moi ce qu'il en est...

----------------


Je viens juste d'essayer entre 2 dates à savoir 12/07/2004
et 15/07/2004 et le resultat qu'il me donne c'est
02/01/1900 c'est plutôt juste mais je préfère quand meme
que ce soit un nombre.
Merci

Avatar
-----Message d'origine-----
Bonjour

Le problème de ce code c'est qu'il te faut une table
contenant

les jours fériés, c'est très génant, il te faut la
compléter sans cesse

et ça alourdi inutilement la base...

Sincèrement essais le code que je t'ai donné, tu le copis
dans son

intégralité dans un module standard de ta base, ensuite
tu n'as

qu'à utiliser la fonction NbOpenDay(), pas besoin de
tables avec

les jours fériés vu que c'est le code qui les calculs.

Dans ton formulaire ou même dans une requête, il te
suffit de faire

un controle calculé qui a comme source :

=NbOpenDay([ChampDateDebut];[ChampDateFin])

Essais et dis moi ce qu'il en est...

--
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------



J'ai oublié de te dire aussi si c'était possible d'ajouter
aux jours fériés des période de vacances pour avoir
vraiment le solde entre les deux dates.
Et puis ya t'il un moyen pour ne pas faire afficher les
erreurs lorsqu'il n'y a pas de dates ce qui provoque une
erreur dans la formule.
Merci d'avance...

Avatar
Jessy Sempere [MVP]
Re,

Alors soit ton champ est de type Date et c'est pour ça que tu as
le 2/1/1900...

Soit ton résultat est affiché dans un champ calculé de requête ou
un control calculé de formulaire qui a comme format d'affichage
"Format Date"

Donc il te suffit soit de transformer le type de donnée du résultat ou le format
de donnée du résultat en format "Numérique"

Ca marche ?

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
a écrit dans le message news:
2e97901c46b1b$9e806480$

Je viens juste d'essayer entre 2 dates à savoir 12/07/2004
et 15/07/2004 et le resultat qu'il me donne c'est
02/01/1900 c'est plutôt juste mais je préfère quand meme
que ce soit un nombre.
Merci
Avatar
Jessy Sempere [MVP]
Re,

L'astuce serait de calculé le nombre de jours ouvrés entre les 2
dates de vacances (avec la même fonction) et faire la différence
entre le 1er résultat et le 2ème...

Sinon pour le cas où tu n'as pas de date, normalement ça doit être
pris en compte mais bon... au cas où, essais de remplacer les lignes
de code suivante dans la fonction NbOpenDay() :

If IsNull(dtDeb) Or IsNull(dtFin) _
Or IsEmpty(dtDeb) Or IsEmpty(dtFin) Then
NbOpenDay = 0
Exit Function

Par :

If IsNull(dtDeb) Or IsNull(dtFin) _
Or IsEmpty(dtDeb) Or IsEmpty(dtFin) _
Or dtDeb = "" Or dtFin = "" Then
NbOpenDay = 0
Exit Function

C'est bon ???

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
a écrit dans le message news:
2e37d01c46b1c$18cbc400$

J'ai oublié de te dire aussi si c'était possible d'ajouter
aux jours fériés des période de vacances pour avoir
vraiment le solde entre les deux dates.
Et puis ya t'il un moyen pour ne pas faire afficher les
erreurs lorsqu'il n'y a pas de dates ce qui provoque une
erreur dans la formule.
Merci d'avance...
Avatar
-----Message d'origine-----
Re,

L'astuce serait de calculé le nombre de jours ouvrés
entre les 2

dates de vacances (avec la même fonction) et faire la
différence

entre le 1er résultat et le 2ème...

Sinon pour le cas où tu n'as pas de date, normalement ça
doit être

pris en compte mais bon... au cas où, essais de remplacer
les lignes

de code suivante dans la fonction NbOpenDay() :

If IsNull(dtDeb) Or IsNull(dtFin) _
Or IsEmpty(dtDeb) Or IsEmpty(dtFin) Then
NbOpenDay = 0
Exit Function

Par :

If IsNull(dtDeb) Or IsNull(dtFin) _
Or IsEmpty(dtDeb) Or IsEmpty(dtFin) _
Or dtDeb = "" Or dtFin = "" Then
NbOpenDay = 0
Exit Function

C'est bon ???
------------------


Ben maintenant je me retrouve en face d'une big erreur va
falloir que j'enlève le code et que je recommence.Merci de
ton aide.