OVH Cloud OVH Cloud

Calcul de durée en hh:mm

9 réponses
Avatar
Jean
Bonjour,
Débutant que je suis je me torture pour trouver la solution. J'ai les champs
:
DateDébut, HeureDébut, DateFin, HeureFin
Je souhaite créer une requête qui me calcule la durée entre ces dates et
heures.
Je sollicite votre aide.
Merci
Jean

9 réponses

Avatar
pgz
Fonction DateDiff.
Bonne chance
pgz


Bonjour,
Débutant que je suis je me torture pour trouver la solution. J'ai les champs
:
DateDébut, HeureDébut, DateFin, HeureFin
Je souhaite créer une requête qui me calcule la durée entre ces dates et
heures.
Je sollicite votre aide.
Merci
Jean





Avatar
Eric
Bonjour Jean,

Tu copies la fonction qui se trouve ici (site de Walter Stucki) :
http://mypage.bluewin.ch/w.stucki/CalculsDates.htm#TempsFormatte
dans un module.

Tu mets en commentaire la ligne
strDelim = TrouverDelimiteurTemps()
en faisant précédé cette instruction par une apostrophe
et tu inscris juste en dessous
strDelim = ":"
(la ligne se trouve sous la longue liste des déclarations : Dim ...)

Dans ta requête, tu mets les champs DateDebut, HeureDebut, DateFin,
HeureFin. Tu rajoutes 3 champs calculés:
DateHeureDebut:[DateDebut]+[HeureDebut]
DateHeureFin: [DateFin]+[HeureFin]
et enfin:
Durée: TempsFormatté([DateHeureDebut];[DateHeureFin];"h:mm")

L'avantage de cette fonction c'est de pouvoir te permettre de choisir le
mode d'affichage de la durée (regardes les commentaires au début de la
fonction)


Bonjour,
Débutant que je suis je me torture pour trouver la solution. J'ai les champs
:
DateDébut, HeureDébut, DateFin, HeureFin
Je souhaite créer une requête qui me calcule la durée entre ces dates et
heures.
Je sollicite votre aide.
Merci
Jean


--

A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Jean
Merci Eric,
Je comprends pourquoi je devais me torturer sans cette fonction. Merci.
Je dois ajouter un point que j'ai omis dans mon énoncé. Il me faut
considérer que la journée de travail est égale à 7 heures pour calculer ma
durée. Où dois-je mettre ce paramêtre ?
Encore merci
Jean
Eric wrote:
Bonjour Jean,

Tu copies la fonction qui se trouve ici (site de Walter Stucki) :
http://mypage.bluewin.ch/w.stucki/CalculsDates.htm#TempsFormatte
dans un module.

Tu mets en commentaire la ligne
strDelim = TrouverDelimiteurTemps()
en faisant précédé cette instruction par une apostrophe
et tu inscris juste en dessous
strDelim = ":"
(la ligne se trouve sous la longue liste des déclarations : Dim ...)

Dans ta requête, tu mets les champs DateDebut, HeureDebut, DateFin,
HeureFin. Tu rajoutes 3 champs calculés:
DateHeureDebut:[DateDebut]+[HeureDebut]
DateHeureFin: [DateFin]+[HeureFin]
et enfin:
Durée: TempsFormatté([DateHeureDebut];[DateHeureFin];"h:mm")

L'avantage de cette fonction c'est de pouvoir te permettre de choisir
le mode d'affichage de la durée (regardes les commentaires au début
de la fonction)


Bonjour,
Débutant que je suis je me torture pour trouver la solution. J'ai
les champs

DateDébut, HeureDébut, DateFin, HeureFin

Je souhaite créer une requête qui me calcule la durée entre ces
dates et heures.
Je sollicite votre aide.
Merci
Jean





Avatar
Eric
re,

là, c'est plus pareil.

Est-ce possible d'avoir dans tes données ce genre d'enregistrements :
une tache A qui commence le 12/07/05 à 6:00 et se termine le 13/07/05 à
11:45 ?
Une tache B qui débute le 22/07/05 à 16:00, s'arrête à 19:00 puis
reprend le 24/07/05 à 8:15 et se termine à 14:45 ?

Tu pourrais mettre une copie d'écran des données de ta table(tous les
champs importants) sur www.cjoint.com et poster ensuite le lien fourni
par cjoint ici.

Merci Eric,
Je comprends pourquoi je devais me torturer sans cette fonction. Merci.
Je dois ajouter un point que j'ai omis dans mon énoncé. Il me faut
considérer que la journée de travail est égale à 7 heures pour calculer ma
durée. Où dois-je mettre ce paramêtre ?
Encore merci
Jean


--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Eric
.../...
Autre idée mais je ne garantis pas le résultat. C'est à tester
Remplacer l'instruction:
sngJours = sngHeures / 24 par sngJours = sngHeures / 7
et celle-ci
intHeures = Int((sngJours - lngFullJours) * 24)
par
intHeures = Int((sngJours - lngFullJours) * 7)

Le champ calculé
Durée: TempsFormatté([DateHeureDebut];[DateHeureFin];"J H M")

Merci Eric,
Je comprends pourquoi je devais me torturer sans cette fonction. Merci.
Je dois ajouter un point que j'ai omis dans mon énoncé. Il me faut
considérer que la journée de travail est égale à 7 heures pour calculer ma
durée. Où dois-je mettre ce paramêtre ?
Encore merci
Jean
Eric wrote:

Bonjour Jean,

Tu copies la fonction qui se trouve ici (site de Walter Stucki) :
http://mypage.bluewin.ch/w.stucki/CalculsDates.htm#TempsFormatte
dans un module.

Tu mets en commentaire la ligne
strDelim = TrouverDelimiteurTemps()
en faisant précédé cette instruction par une apostrophe
et tu inscris juste en dessous
strDelim = ":"
(la ligne se trouve sous la longue liste des déclarations : Dim ...)

Dans ta requête, tu mets les champs DateDebut, HeureDebut, DateFin,
HeureFin. Tu rajoutes 3 champs calculés:
DateHeureDebut:[DateDebut]+[HeureDebut]
DateHeureFin: [DateFin]+[HeureFin]
et enfin:
Durée: TempsFormatté([DateHeureDebut];[DateHeureFin];"h:mm")

L'avantage de cette fonction c'est de pouvoir te permettre de choisir
le mode d'affichage de la durée (regardes les commentaires au début
de la fonction)



Bonjour,
Débutant que je suis je me torture pour trouver la solution. J'ai
les champs

DateDébut, HeureDébut, DateFin, HeureFin
Je souhaite créer une requête qui me calcule la durée entre ces
dates et heures.
Je sollicite votre aide.
Merci
Jean







--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
Jean
eric,
Tout d'abord excuse-moi pour répondre si tard j'ai dû m'absenter.
Je ne me suis pas très bien rendu compte de ce que cela pouvait représenter.
C'est effectivement l'exemple que tu donnes.
J'explique : sachant que le temps passé sur le projet ou chantier doit
figurer ensuite dans le TempsTravail et que le projet peut s'étaller sur
plusieurs jours.
On considére que l'heure de début est habituellement 7:30 et que l'heure de
fin est 15:30 pour une journée normale, moins 1 heure pour le repas. Le
temps travail doit être calculé sur cette base. J'ai rentré en automatique
l'heure de début 7:30. Elle peut être modifié si nécessaire.
Si le chantier dure plus d'1 jour, je ne souhaite pas créer une seconde
ligne de data.
Le champs TempsTravail sera modifié par une requète MAJ après la MAJ des
dates et heures de fin.
Je pense avoir exposé l'esprit de la base.
J'ai créé un lien avec une image de la table sur excel à l'adresse indiquée
dans le message. Elle s'appelle ExempleTable. http://cjoint.com/?hDtSayPXAS
Si tu peux m'aider sur cette table qui me semblait adaptée à mon besoin mais
dont j'ignorais la complexité. Merci.
Jean
Eric wrote:
re,

là, c'est plus pareil.

Est-ce possible d'avoir dans tes données ce genre d'enregistrements :
une tache A qui commence le 12/07/05 à 6:00 et se termine le
13/07/05 à 11:45 ?
Une tache B qui débute le 22/07/05 à 16:00, s'arrête à 19:00 puis
reprend le 24/07/05 à 8:15 et se termine à 14:45 ?

Tu pourrais mettre une copie d'écran des données de ta table(tous les
champs importants) sur www.cjoint.com et poster ensuite le lien fourni
par cjoint ici.

Merci Eric,
Je comprends pourquoi je devais me torturer sans cette fonction.
Merci. Je dois ajouter un point que j'ai omis dans mon énoncé. Il me
faut considérer que la journée de travail est égale à 7 heures pour
calculer ma durée. Où dois-je mettre ce paramêtre ?
Encore merci
Jean




Avatar
Eric
Bonsoir Jean,

[...]
Si le chantier dure plus d'1 jour, je ne souhaite pas créer une seconde
ligne de data.


Je ne suis pas sur que cela soit la meilleure solution.
Il va falloir identifier entre les dates de début et celles
de fin, d'une part, les samedis & dimanches, d'autre part, les
jours fériés (variables ou non) et enfin, les jours chômés pour
intempérie !!!

Il me parait beaucoup plus simple pour calculer la durée d'un
chantier de connaitre toutes les taches réalisées sur ce
chantier, par corps de métier (ou employé) et jour par jour.
De plus, ça te permettrait un meilleur suivi.
Quelle durée prendre en compte pour une tache sur un chantier
qui débute le 13/07/05 à 7:30 (en Fr) et se termine (toujours
en Fr)le 18/07/05 à 15:45 pour un employé ?

Qu'en penses-tu ?

Le champs TempsTravail sera modifié par une requète MAJ après la MAJ des
dates et heures de fin.


En utilisant 2 tables ou + suivant la problématique, il n'est
pas nécessaire de stocker cette info dans une table. Une requête
peut te donner ce résultat.


--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Jean
Bonjour Eric,
Je te remercie de bien vouloir passer tout ce temps à réfléchir sur ce
problème que j'ai soumis dans cette base. En discutant ensemble sur ce
projet, je comprends chaque jour un peu plus de la difficulté que ma
solution n'est peut être pas réalisable ainsi.

Je ne suis pas sur que cela soit la meilleure solution.
Il va falloir identifier entre les dates de début et celles
de fin, d'une part, les samedis & dimanches, d'autre part, les
jours fériés (variables ou non) et enfin, les jours chômés pour
intempérie !!!

Et si en réfléchissant les data hebdomadairement, ce qui reste tout à fait

conforme à ce que j'envisageai.

Quelle durée prendre en compte pour une tache sur un chantier
qui débute le 13/07/05 à 7:30 (en Fr) et se termine (toujours
en Fr)le 18/07/05 à 15:45 pour un employé ?



En fait, les chantiers sont considérés sur une semaine dans mon projet. Si
éventuellement, un travail doit se continuer sur une semaine suivante, une
nouvelle ligne sera enregistrée. Ainsi je résouds les points soulevés
précédemment pour les WE et les jours fériés ou pour les intempéries.

En utilisant 2 tables ou + suivant la problématique, il n'est
pas nécessaire de stocker cette info dans une table. Une requête
peut te donner ce résultat.


En effet tu as raison. La requète suffit.

Je ne souhaite pas mobiliser ton attention trop longtemps. Si cela est trop
long à faire, j'essairai de trouver une autre méthode plus conforme au
traitement informatique.
Je suis conscient que tu ne puisses pas passer ton temps avec moi. Merci en
tout cas pour cette réflexion commune.

Jean
Eric wrote:
Bonsoir Jean,

[...]
Si le chantier dure plus d'1 jour, je ne souhaite pas créer une
seconde ligne de data.


Je ne suis pas sur que cela soit la meilleure solution.
Il va falloir identifier entre les dates de début et celles
de fin, d'une part, les samedis & dimanches, d'autre part, les
jours fériés (variables ou non) et enfin, les jours chômés pour
intempérie !!!

Il me parait beaucoup plus simple pour calculer la durée d'un
chantier de connaitre toutes les taches réalisées sur ce
chantier, par corps de métier (ou employé) et jour par jour.
De plus, ça te permettrait un meilleur suivi.
Quelle durée prendre en compte pour une tache sur un chantier
qui débute le 13/07/05 à 7:30 (en Fr) et se termine (toujours
en Fr)le 18/07/05 à 15:45 pour un employé ?

Qu'en penses-tu ?

Le champs TempsTravail sera modifié par une requète MAJ après la MAJ
des dates et heures de fin.


En utilisant 2 tables ou + suivant la problématique, il n'est
pas nécessaire de stocker cette info dans une table. Une requête
peut te donner ce résultat.



Avatar
Eric
Bonjour Jean,

Bon, après la plage, faut bien un peu réfléchir ;-)
Je te fais passer une fonction qui te retourne le nb de journées, heures
et minutes d'une tâche en tenant compte que la journée normale fait 7
heures de travail.(Plage de 07:30 à 15:30 moins 1 heure de pause)
Si une tâche s'effectue sur une seule journée pas de problème. Par
contre si la tâche se déroule sur 2 ou plusieurs jours, j'ai considéré
que le 1er jour de la période peut commencer à n'importe quelle heure
mais s'arrête *obligatoirement* à 15:30. De même, le dernier jour de
cette période débute *obligatoirement* à 07:30 et se termine quand tu
veux! Pour ne pas tenir compte de ces contraintes, il faudrait avoir une
2e table avec pour chaque tâche, l'heure de début et de fin de chaque
jour. (Pb déjà soulevé)

De plus cette fonction ne tient pas compte des samedis, dimanches et
jours fériés. Que dire pour les journées d'intempéries !

Pour ce qui est des samedis, dimanches et JF, sur les sites conseillés
de MPFA, on trouve des fonctions traitant de cela. En les intégrant, il
devrait être 'possible' de corriger le tir.

La fonction à copier dans un module et à utiliser dans la requête comme
la précédente que je t'avais proposée. Pour l'appeler dans la requête:
Durée:fnEcartSpecial([dateheuredebut];[dateheurefin])

A tester sur tes données pour voir si cela correspond bien à tes caculs
J'ai du supprimer en partie l'identation pour que cela reste lisible sur
le NG. Attention aux éventuels retours à la ligne intempestifs

Public Function fnEcartSpecial(dteDebut As Date, dteFin As Date) As String
'Déclarations
Dim lngEcart As Long, intJour As Integer
Dim intHeure As Integer, intMinute As Integer
Dim dteDate1 As Date, dteDate2 As Date
Dim dteDate1Fin As Date, dteDate2Debut As Date
Dim nbHeures As Integer

If Day(dteDebut) = Day(dteFin) _
And Month(dteDebut) = Month(dteFin) Then
'Période d'un jour
lngEcart = DateDiff("n", dteDebut, dteFin)
If Hour(dteFin) > 13 Then
lngEcart = lngEcart - 60
End If
intHeure = lngEcart 60
intMinute = lngEcart Mod 60
Else
'Période de plus d'un jour
'Définition de la borne supérieure pour le 1er jour de la période
dteDate1 = DateSerial(Year(dteDebut), Month(dteDebut), Day(dteDebut))
dteDate1Fin = CDate(Format(dteDate1 + "15:30", "mm/dd/yy hh:nn"))
'Définition de la borne inférieure pour le dernier jour de la période
dteDate2 = DateSerial(Year(dteFin), Month(dteFin), Day(dteFin))
dteDate2Debut = CDate(Format(dteDate2 + "07:30", "mm/dd/yy hh:nn"))
'Détermination du nb de jours
intJour = DateDiff("d", dteDebut, dteFin) - 1
'Détermination du nb d'heures
' 1 - sur le 1er jour (1h de moins pour la pause)
nbHeures = DateDiff("n", dteDebut, dteDate1Fin) - 60
'2 - pour le dernier jour, correctif pour la pause si nécessaire
If Hour(dteFin) > 13 Then
nbHeures = nbHeures + DateDiff("n", dteDate2Debut, dteFin) - 60
Else
nbHeures = nbHeures + DateDiff("n", dteDate2Debut, dteFin)
End If
intHeure = nbHeures 60
'Correctif nb jours car journée de 7 heures
If intHeure >= 7 Then
intJour = intJour + intHeure 7
intHeure = intHeure Mod 7
End If
intMinute = nbHeures Mod 60
End If
fnEcartSpecial = intJour & " journée(s) " & intHeure _
& " heure(s) " & intMinute & " minutes"

End Function
--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr