Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/01/2011, 08h21   #1
Débutant
 
Inscription : avril 2007
Messages : 636
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2007
Messages : 636
Points : 143
Points : 143
Par défaut calcul ecart entre date jour ouvrable

Bonjour,

je doit faire la différence entre deux date : [DEMANDE_FAIT_SAV]-[RECEPTION_DU]

sa c'est super simple sa me renvoi la valeur entre les deux dates.
exemple : 22/01/11-20/01/11=2
Par contre si on fait 24/01/11 (lundi)-21/01/11=3 je doit avoir 1 car je ne doit pas prendre en compte les samedi et dimanche donc je ne prend en compte que les jours ouvrable.

Je n'arrive pas a trouve comment faire.

Qui peux m'aide.
Merci a vous
popofpopof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 10h24   #2
Expert Confirmé
 
Avatar de FreeAccess
 
Homme
Inscription : mars 2006
Messages : 2 309
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 309
Points : 2 847
Points : 2 847
Bonjour,

Citation:
e n'arrive pas a trouve comment faire.
Tout est dans la

Comment savoir si un jour est ouvré ?
Calculer le nombre de jours ouvrables entre 2 dates

....bonne lecture

[EDIT] Attention dans le calcul de tes dates......car pour moi du 21/01/2011 au 24/01/2011..cela fait quatre jours, dont deux ouvrables (le vendredi et le lundi...)
__________________
FreeAccess
"Petit à petit l'araignée tisse sa toile"
FreeAccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 14h15   #3
Débutant
 
Inscription : avril 2007
Messages : 636
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2007
Messages : 636
Points : 143
Points : 143
salut merci pour ta réponse

mais je souhaite faire ce calcul dans une requête et non pas en vba car ensuite le regroupe pour une même opération les nombres trouver, et ensuite le tout envoyer dans un etat.

Donc je cherche a requete pour faire le calcul

voila ma requete actuelle :
Code :
1
2
3
4
SELECT OPERATION.NOM_OPERATION AS Opération, Sum([DEMANDE_FAIT_SAV]-[RECEPTION_DU]) AS [ecart demande]
FROM OPERATION INNER JOIN (LOGEMENT INNER JOIN LOGEMENT_TS_RESERVE ON (LOGEMENT.NUM_OPERATION = LOGEMENT_TS_RESERVE.NUM_OPERATION) AND (LOGEMENT.NUM_LOGEAUTO = LOGEMENT_TS_RESERVE.NUM_LOGEAUTO)) ON OPERATION.NUM_OPERATION = LOGEMENT.NUM_OPERATION
GROUP BY OPERATION.NOM_OPERATION
ORDER BY OPERATION.NOM_OPERATION;
popofpopof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 14h32   #4
Expert Confirmé
 
Avatar de FreeAccess
 
Homme
Inscription : mars 2006
Messages : 2 309
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 309
Points : 2 847
Points : 2 847
Oui ....et où se situe le problème....

Le code proposé correspond à une fonction.......donc également utilisable dans une requête....

Code :
Work_Days (DateDebut,DateFin)
__________________
FreeAccess
"Petit à petit l'araignée tisse sa toile"
FreeAccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 16h33   #5
Débutant
 
Inscription : avril 2007
Messages : 636
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2007
Messages : 636
Points : 143
Points : 143
ok j'ai donc copier le code dans un module
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 
 
' Il faut mettre bAvecJFerie à False pour ne pas tenir compte des jours feriés, rien sinon.
 
Function Work_Days(BegDate As Variant, EndDate As Variant, _
                   Optional bAvecJFerie As Boolean = True) As Variant
    Dim dt As Date
 
On Error GoTo Work_Days_Error
    If IsNull(BegDate) Or IsNull(EndDate) Then Err.Raise vbObjectError + 1
    If Not IsDate(BegDate) Or Not IsDate(EndDate) Then Err.Raise vbObjectError + 2
    If BegDate > EndDate Then Err.Raise vbObjectError + 3
 
    dt = BegDate
    Work_Days = 0
    While dt <= EndDate
        If DatePart("w", dt, vbMonday) < 6 And IIf(bAvecJFerie, Not EstFerie(dt), True) Then
            Work_Days = Work_Days + 1
        End If
        dt = DateAdd("d", 1, dt)
    Wend
    Exit Function
 
Work_Days_Error:
    Select Case Err.Number
        Case vbObjectError + 1: Work_Days = "Les 2 dates sont obligatoires."
        Case vbObjectError + 2: Work_Days = "Format de date incorrect."
        Case vbObjectError + 3: Work_Days = "La date de fin doit être postérieure à la date de début."
        Case Else: Work_Days = Err.DESCRIPTION
    End Select
End Function
 
 
Function EstFerie(ByVal QuelleDate As Date) As Boolean
Dim anneeDate As Integer
Dim joursFeries(1 To 11) As Date
Dim i As Integer
  anneeDate = Year(QuelleDate)
 
  joursFeries(1) = DateSerial(anneeDate, 1, 1)
  joursFeries(2) = DateSerial(anneeDate, 5, 1)
  joursFeries(3) = DateSerial(anneeDate, 5, 8)
  joursFeries(4) = DateSerial(anneeDate, 7, 14)
  joursFeries(5) = DateSerial(anneeDate, 8, 15)
  joursFeries(6) = DateSerial(anneeDate, 11, 1)
  joursFeries(7) = DateSerial(anneeDate, 11, 11)
  joursFeries(8) = DateSerial(anneeDate, 12, 25)
 
  joursFeries(9) = fLundiPaques(anneeDate)
  joursFeries(10) = joursFeries(9) + 38 ' Ascension = lundi de Paques + 38
  joursFeries(11) = joursFeries(9) + 49 ' Lundi Pentecôte = lundi de Paques + 49
 
  For i = 1 To 11
    If QuelleDate = joursFeries(i) Then
      EstFerie = True
      Exit For
    End If
  Next
End Function
 
Private Function fLundiPaques(ByVal Iyear As Integer) As Date
        'Adapté de +ieurs scripts...
        Dim L(6) As Long, Lj As Long, Lm As Long
 
        L(1) = Iyear Mod 19: L(2) = Iyear Mod 4: L(3) = Iyear Mod 7
        L(4) = (19 * L(1) + 24) Mod 30
        L(5) = ((2 * L(2)) + (4 * L(3)) + (6 * L(4)) + 5) Mod 7
        L(6) = 22 + L(4) + L(5)
 
        If L(6) > 31 Then
                Lj = L(6) - 31
                Lm = 4
        Else
                Lj = L(6)
                Lm = 3
        End If
 
        ' Lundi de Pâques = Paques + 1 jour
        fLundiPaques = DateAdd("d", 1, (Lj & "/" & Lm & "/" & Iyear))
 
End Function
et voila pour la requete
Code :
ecart demande: Work_Days([RECEPTION_DU];[DEMANDE_FAIT_SAV];Vrai)
par contre quand j'ai une date 21/01/11 a reception et 21/01/11 a demande_fait il me dit que le resultat fait 1 alors que pour mes besoin sa doit être 0
et pour c'est exemple
19/01/11 reception et 20/01/11 demande_fait je doit avoir 1 et non pas deux.

dans le code je dois modifier quelle valeur pour avoir ce résultat??
popofpopof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 17h00   #6
Expert Confirmé
 
Avatar de FreeAccess
 
Homme
Inscription : mars 2006
Messages : 2 309
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 309
Points : 2 847
Points : 2 847
C'est exactement ce que je te disais dans un de mes post...

Citation:
[EDIT] Attention dans le calcul de tes dates......car pour moi du 21/01/2011 au 24/01/2011..cela fait quatre jours, dont deux ouvrables (le vendredi et le lundi...)
....donc modifie la fonction pour tenir compte de ces spécificités dans ton calcul........
__________________
FreeAccess
"Petit à petit l'araignée tisse sa toile"
FreeAccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 18h15   #7
Expert Confirmé
 
Avatar de FreeAccess
 
Homme
Inscription : mars 2006
Messages : 2 309
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 309
Points : 2 847
Points : 2 847
Une solution possible:
Tu souhaite calculer le nombre de jours ouvrables entre deux dates MAIS sans prendre en compte la date de début [RECEPTION_DU]

Petit analyse rapide:

Si [RECEPTION_DU] égal [DEMANDE_FAIT_SAV] alors l'écart est systématiquement de 0 (zéro)
si [RECEPTION_DU] est compris entre lundi et vendredi ET qu'il n'est pas férié, on doit systématiquement retrancher 1 au calcul final.

A partir de là, on peut envisager de modifier la fonction comme ceci, en y rajoutant ces deux tests:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Function Work_Days(BegDate As Variant, EndDate As Variant, Optional bAvecJFerie As Boolean = True) As Variant
    Dim dt As Date
 
On Error GoTo Work_Days_Error
    If IsNull(BegDate) Or IsNull(EndDate) Then err.Raise vbObjectError + 1
    If Not IsDate(BegDate) Or Not IsDate(EndDate) Then err.Raise vbObjectError + 2
    If BegDate > EndDate Then err.Raise vbObjectError + 3
 
'###  PREMIER TEST   ###
'Test Date début = Date Fin
If (BegDate) = (EndDate) Then
    Work_Days = 0
    Exit Function
End If
 
    dt = BegDate
    Work_Days = 0
    While dt <= EndDate
        If DatePart("w", dt, vbMonday) < 6 And IIf(bAvecJFerie, Not EstFerie(dt), True) Then
            Work_Days = Work_Days + 1
        End If
        dt = DateAdd("d", 1, dt)
    Wend
 
'###          SECOND TEST en fin de calcul            ###
'On retranche 1, si BegDate est un jour de semaine NON férié
    If DatePart("w", BegDate, vbMonday) < 6 And IIf(bAvecJFerie, Not EstFerie(BegDate), True) Then
        Work_Days = Work_Days - 1
    End If
    Exit Function
 
Work_Days_Error:
    Select Case err.Number
        Case vbObjectError + 1: Work_Days = "Les 2 dates sont obligatoires."
        Case vbObjectError + 2: Work_Days = "Format de date incorrect."
        Case vbObjectError + 3: Work_Days = "La date de fin doit être postérieure à la date de début."
        Case Else: Work_Days = err.Description
    End Select
End Function
....voilà, normalement ceci devrait répondre à ton souhait.
Si il y a plus "simple"....le Forum sera là pour te le proposer....
__________________
FreeAccess
"Petit à petit l'araignée tisse sa toile"
FreeAccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 18h26   #8
Débutant
 
Inscription : avril 2007
Messages : 636
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2007
Messages : 636
Points : 143
Points : 143
Merci bcp sa a l'air de marcher super bien je teste sa lundi au bureau

1000 MERCI tu es un roi
popofpopof est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h36.


 
 
 
 
Partenaires

Hébergement Web