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

VBA Access Discussion :

Calcul du temps écoulé avec critères spécifiques


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut Calcul du temps écoulé avec critères spécifiques
    Bonjour,

    Ce post vient recadrer mon tout dernier faute de précisions.

    On se place donc dans le contexte suivant:
    On considère une villa qui est surveilée par une sentinelle et une vidéo de surveillance. On admet qu'en cas de tentative de vol une alarme est donnée de façon automatique dès que le cambrioleur est dans le champ d'éclairage de la villa.
    Le but est de pouvoir calculer la part du temps d'activité de la sentinelle entre le début et la fin d'une alarme sachant qu'elle pend son service du lundi au vendredi entre 8h30 et 19h00 et les samedis entre 8h30 et 17h00 et est hors services les jours fériés et les dimanches.

    Désignons par TAS ce temps d'activité de la sentinelle;
    t0 :l'instant où l'alarme sonne
    tf : l'instant où l'alarme prend fin
    Début: heure de début du service de la sentinelle
    Fin:heure de fin de service de la sentinelle


    il faut donc que


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TAS =0 si   l'alarme est donnée hors plage de service c-à-d  si  t0 n'appartient pas ([8h30; 19h00] ou [8h30;17h00]) (pour lundi à vendredi ou le samedi)  ou si elle donnée un jour non ouvré (jour férié ou dimanche)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TAS=(tf-t0 )-(Fin-Début)  si l'alarme sonne pendant les heures de service de la sentinelle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Si entre t0 et tf  on a k jours ouvrés alors 
    
    TAS=(tf-t0) -(somme sur j allant  1 à k) (Début_j-Fin_j)
    
    où Début_j est l'heure de début de service  du jième jour ouvré compris entre t0 et tf
     et Fin_j l'heure de fin de service du jième jour ouvré compris entre t0 et tf


    J'ai pu taper le code suivant mais qui malheusement ne marche pas:


    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
    Function TAS(ByVal t0 As Date, ByVal t1 As Date) As Variant
        Dim plagej As Variant
        Dim k As Integer
        fini = Int(DateDiff("d", t0, t1))
        Dim j(1 To 365) As Date
        Dim DPC(0 To 366) As Variant
        hs As Date
                 TAS = 0
           For k = 1 To fini
               j(k) = DateAdd("d", k, t0)
                  If ((t0 < j(k) And t1 > j(k)) And (EstFerie(j(k)) = False)) Or ((Time(j(k) > 8) And (Time(j(k) > 19)))) Then
                    plagej = plageservice(j(k))
                    DPC(k) = (DateDiff("n", t0, j(k)) + DateDiff("n", j(k), t1)) - plagej
                    TAS = TAS + DPC(k)
                  Else
                    TAS = 0
                  End If
           Next k
    End Function
    
     

    plageservice est un sous programe qui calcule la durée de service sur la journée et EstFerie détermine si le jour est 1 jour férié ou pas.



    Merci d'avance pour votre aide.

    N'hésiter pas à me demander des précisions s'il en faut .


    Cordialement,


    Kedmard.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    cela me parait bien complexe comme approche ne peux-tu pas faire :

    • calculer le temps de travail normal de ta sentinelle dans la période voulue (requête de sélection sur tes heures de travail)
    • calculer le temps d'alarme dans la période voulue (requête de sélection sur tes alarmes)
    • soustraire le temps d'alarme du temps de travail dans la période voulue (ou vice versa) (requête de sélection qui combine les 2 précédentes)


    Note que j'ai peut-être manqué quelque chose et ceci suppose que tu as
    • une table des alarmes qui te donne le début et la fin de ton alarme
    • une table des heures de travail qui te donne le début et la fin de tes quarts de travail


    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    Bonjour marot_r, merci pour ta réponse qui m'apporte là une bonne démarche; j'aurais cependant une question par rapport à ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    une table des heures de travail qui te donne le début et la fin de tes quarts de travail

    Qu'est ce tu entends par quarts de travail? moi j'ai pensé aux quart d'heures de travail si c'est le cas,alors pourquoi s'intéresser aux quarts d'heures?



    Salutations,


    Kedmard.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Les périodes de travail de travail de tes sentinelles.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    Voici l e code j'ai pour avoir le nombre de jour ouvré complet

    entre le début et la fin de l'alarme,

    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
    Function jourcomplet(t0 As Date, t1 As Date) As Variant
           Dim fini As Integer
           Dim j(1 To 3660) As Date
           fini = Int(DateDiff("d", t0, t1))
                If fini >= 1 Then
                    jourcomplet = 0
                   For k = 1 To fini
                       j(k) = DateAdd("d", k, t0)
                       If ((EstFerie(j(k)) = False And joursignal(j(k)) <> "dimanche")) Then
                             If ((DateDiff("d", t0, j(k))) > 0) Then
                                 jourcomplet = jourcomplet + Int(DateDiff("d", t0, j(k)))
                              End If
     
                       End If
                    Next k
     
                Else: GoTo 88
                End If
    88  jourcomplet = 0
    End Function
    Je vois pourtant pas d'erreur mais il me renvoit que des 0 même lorsque qu'il plusieurs jours ouvré entre t0 et1.

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Le problème vient probablement de là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fini = Int(DateDiff("d", t0, t1))
    Vérifie ce que voit Access pour FiniJe pense qu'il est peut-être négatif.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    Salut marot_r,

    Après avoir longuement cherché voici ce que j'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     'Nombre total  de jours  ouvrés entre début et fin alarme
     
    Function nbrejrouvre(t0 As Date, t1 As Date) As Integer
    Dim k As Integer
    Dim fin As Integer
    Dim unjour As Date
    fin = DateDiff("d", t0, t1)
    For k = 1 To fin
    unjour = DateAdd("d", k, t0)
       If (EstFerie(unjour) = False) And (joursignal(unjour) <> "dimanche") Then
    nbrejrouvre = nbrejrouvre + 1
    End If
    Next k
    End Function
    J'ai ensuite


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     'Nombre de samedi ouvrés entre début et fin alarme
     
    Function nbresamedi(t0 As Date, t1 As Date) As Integer
    Dim k As Integer
    Dim fin As Integer
    Dim unjour As Date
    fin = Int(DateDiff("d", t0, t1))
    For k = 0 To fin
    unjour = DateAdd("d", k, t0)
     If (EstFerie(unjour) = False) And (joursignal(unjour) = "samedi") Then
     nbresamedi = nbresamedi + 1
     End If
     Next k
    End Function
    Pour avoir le nombre d'heures pris en charge par la sentinelle les jours "incomplets"
    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
     
    '
     
    Function Tresidebut(t0 As Date) As Integer
    If (Hour(t0) >= 8.5 And Hour(t0) < 19) Then
       If (EstFerie(t0) = False) And (joursignal(t0) <> "dimanche") Then
            If (joursignal(t0) = "samedi") Then
                Tresidebut = Abs(18 - Hour(t0))
            Else
                Tresidebut = Abs(19 - Hour(t0))
            End If
       Else
           Tresidebut = 0
       End If
     
    Else
      If (Hour(t0) < 8.5 Or Hour(t0) >= 19) Then
         Tresidebut = 0
      End If
    End If
    End Function

    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
    Function Tresidufin(ByVal t1 As Date) As Double
    If (Hour(t1) >= 8.5 And Hour(t1) < 19) Then
       If (EstFerie(t1) = False) And (joursignal(t1) <> "dimanche") Then
            If (joursignal(t1) = "samedi") Then
                Tresidufin = Abs(18 - Hour(t1))
            Else
                Tresidufin = Abs(19 - Hour(t1))
            End If
       Else
           Tresidufin = 0
       End If
     
    Else
      If (Hour(t1) < 8.5 Or Hour(t1) >= 19) Then
         Tresidufin = 0
     
      End If
    End If
     
    End Function


    Finalement pour le nombre total d'heures de service entre le début et la fin de l'alarme j'ai le code ci-après:

    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
    Function tempservice(date1 As Date, date2 As Date) As Double
    Dim j As Double
    Dim p As Double
    j = Tresidebut(date1)
    p = Tresidufin(date2)
    If ((nbrejrouvre(date1, date2) >= 1)) Then
        tempservice = ((nbrejrouvre(date1, date2) - nbresamedi(date1, date2)) * 11.5 + (nbresamedi(date1, date2) * 8.5)) + j + p
    Else
        If ((nbrejrouvre(date1, date2) = 0)) Then
             tempservice = Maxi(j, p)
        Else
             tempservice = 0
        End If
    End If
    End Function

    Tout ces codes marchent bien seul le dernier pose problème sur le calcul de
    tempservice la valeur renvoyée ne tient pas compte des valeurs de j et p c-à-d (tempservice considère j=0 et p=0) et je ne trouve pas d'explication à cela.

    T'as une idée?

    Merci d'avance.


    A+

    kedmard.

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Met un point d'arret sur la ligne 1 de ta dernière fonction tempservice() et fait la exécuter pas à pas tu devrais voir pourquoi p et j sont ignorées.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 253
    Points : 90
    Points
    90
    Par défaut
    Salut, Après une longue et douloureuse recherche j'ai enfin pu trouver quelque chose.

    On commence par calculer le nombre d'heures pris en charge aucours des jours ouvrés complets entre le début et la fin de l'alarme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function NbrehrComplet(t0 As Date, t1 As Date) As Long
          Dim k As Long
          Dim unjour As Date
          For k = 1 To (DateDiff("d", t0, t1) - 1)
          unjour = DateAdd("d", k, t0)
               If (Estouvre(unjour) = True) Then
                  If (joursignal(unjour) = "samedi") Then
                      NbrehrComplet= NbrehrComplet + (8.5 * 3600)
                  Else
                      NbrehrComplet = NbrehrComplet + (10.5 * 3600)
                  End If
               End If
          Next k
    End Function


    Puis on calcule le temps de prise charge aucours du premier jour de l'alarme ,
    on fait de même pour le dernier jour de l'alarme après on calcule le temps de travail si l'alarme débute et s'arrête le même jour.
    Enfin on calcul le temps de prise en charge qui est la somme des temps calculés en amont.





    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function charge(t0 As Date, t1 As Date) As Long
    If (DateSerial(Year(t0), Month(t0), Day(t0)) = DateSerial(Year(t1), Month(t1), Day(t1))) Then
          charge = Chargememejr(t0, t1)
        Else
           charge = (Tfirsjr(t0) + NbrehrComplet(t0, t1) + TLastjr(t1))
    End If
    End Function


    Avec :
    -Chargememejr le nombre detemps pris en charge si le début et la fin de l'alarme a lieu le même jour

    -Tfirsjr le temps de prise charge aucours du premier jour de l'alarme

    -TLastjr -ll-ll-ll- dernier jour de l'alarme.

    Puis on converti le résultat final en unité de temps voulue.

    Merci à toi marot_r pour l'attention accordée à mon post.
    Bon weekend.

    Voilà.

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

Discussions similaires

  1. [Débutant] Calculer le temps écoulé entre deux heures
    Par amine_angel80 dans le forum Assembleur
    Réponses: 2
    Dernier message: 28/05/2008, 16h23
  2. Calcul de temps écoulé
    Par Amiche dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/01/2008, 19h39
  3. Réponses: 1
    Dernier message: 10/05/2007, 13h22
  4. [XPath] chemin avec critères spécifiques
    Par loic_86 dans le forum XSL/XSLT/XPATH
    Réponses: 21
    Dernier message: 05/03/2007, 11h21
  5. calculer le Temp écoulé
    Par ada_b dans le forum SQL
    Réponses: 1
    Dernier message: 30/11/2004, 09h44

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