IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

calcul ecart entre date jour ouvrable [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    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

  2. #2
    Membre Expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Par défaut
    Bonjour,

    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...)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  4. #4
    Membre Expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Par défaut
    Oui ....et où se situe le problème....

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Work_Days (DateDebut,DateFin)

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Par défaut
    ok j'ai donc copier le code dans un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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??

  6. #6
    Membre Expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Par défaut
    C'est exactement ce que je te disais dans un de mes post...

    [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........

  7. #7
    Membre Expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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....

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Par défaut
    Merci bcp sa a l'air de marcher super bien je teste sa lundi au bureau

    1000 MERCI tu es un roi

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 55
    Par défaut
    Bonjour à tous

    je utilisé votre requete qui marche parfaitement, mais je n'arrive pas à la récuperer en import de donnée excel savez vous pourquoi?

    Anthooooony

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Calculer le nombre de jours ouvrables entre 2 dates
    Par sarah12 dans le forum VBA Access
    Réponses: 7
    Dernier message: 06/05/2015, 11h30
  2. Calcul de nombre de jours ouvrable entre deux date
    Par etienneborms dans le forum Débuter
    Réponses: 6
    Dernier message: 30/01/2012, 10h53
  3. [AC-2007] Calculer le nombre de jours ouvrables entre 2 dates
    Par Viggen0020 dans le forum Requêtes et SQL.
    Réponses: 21
    Dernier message: 27/03/2009, 08h59
  4. Réponses: 1
    Dernier message: 11/09/2007, 12h10
  5. [Dates] calculer le nombre de jour ouvrable entre 2 dates
    Par pimpmyride dans le forum Langage
    Réponses: 1
    Dernier message: 20/11/2006, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo