Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
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 05/01/2011, 15h00   #1
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Par défaut Calcul de durées supérieures à 24h

Bonjour à tous,

Je voudrais connaitre le format à appliquer à un champ pour que celui-ci accepte des durées du type 42h20mn et que les données entrées soient récupérables pour formatage et additions.

Vu que Access n'accepte pas les formats heures supérieurs à 24h sur un champ au format "Heure abrégé", comment permettre à l'utilisateur de rentrer dans un seul champ directement cette donnée ? (je ne parle pas de faire de Datediff mais de pouvoir rentrer par ex : 123 heures et 17 minutes et de récupérer cette donnée pour la formater ensuite grâce à un module...)

Merci d'avance pour toute réponse !
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h14   #2
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Bonjour, j'aurais tendance à te dire de faire au plus simple :
  • Un champ [Heures] Numérique
  • Un champ [Minutes] Numérique
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h53   #3
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 204
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 204
Points : 5 255
Points : 5 255
Salut,

Tu peux faire une saisie du style 25:00 ou 25h00 dans un champ de type texte et après utiliser une fonction avec split pour faire des calculs sur ce champ:

exemple:

si champ1 contient la valeur "25:00" tu peux utiliser la fonction split pour séparer les heures des minutes:

Code :
1
2
3
4
5
6
Dim H as integer, M as Integer
 
H=Split(champ1, ":")(0)
M=Split(champ1, ":")(1)
...
...
Tu peux aussi sortir le résultat sous la forme d'une date ou d'1 réel double, avec une fonction dans un module:


Code :
1
2
3
4
5
Function HourSup24(h As String) As Date
 
HourSup24 = TimeSerial(Split(h, ":")(0), Split(h, ":")(1), 0)
 
End Function
et après utiliser cette fonction dans une requête ou 1 module:

La fonction inverse est dans la faq.

A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 18h07   #4
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par paidge Voir le message
Bonjour, j'aurais tendance à te dire de faire au plus simple :
  • Un champ [Heures] Numérique
  • Un champ [Minutes] Numérique
Tu viens de me démontrer que rien ne sert de se casser la tête parfois ! tu avais raison !!!!

J'explique la démarche pour ceux qui en auraient besoin :

J'ai fait des champs calculés :
[Heure] en numérique
[Minutes] en numérique avec condition <=59
[Total] en Euros

Et des champs dépendants de la table
[Taux horaire]en euros
[Durée] en Texte
[Montant Total] en Euros

Je mets dans le champ dépendant [Montant]=([Heures]*[TauxHoraire])+(([Minutes]*[TauxHoraire])/60)

Il suffit ensuite d'appliquer une chaîne sur le champ durée pour concaténer la valeur heures et minutes et de sauvegarder les valeurs de [Montant] et de la chaine ([heures]&"h"&[Minutes]&"mn") dans les champs dépendants [Montant Total] et [Durée] de la table grâce à un événement after update en VBA.

Ceci dit reste à voir comment additionner ces valeurs dans des requêtes et états ...Je suppose qu'il faudra extraire les fractions Minutes et Heures grâce à un module ?
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 18h11   #5
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Bonjour User et merci à toi,
Il me semble que ta méthode est la meilleure si l'on veut retravailler les données dans des requêtes et états, je vais l'essayer et vous mettre au courant...
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 19h54   #6
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par User Voir le message
Salut,

Tu peux faire une saisie du style 25:00 ou 25h00 dans un champ de type texte et après utiliser une fonction avec split pour faire des calculs sur ce champ:

exemple:

si champ1 contient la valeur "25:00" tu peux utiliser la fonction split pour séparer les heures des minutes:

Code :
1
2
3
4
5
6
Dim H as integer, M as Integer
 
H=Split(champ1, ":")(0)
M=Split(champ1, ":")(1)
...
...
Tu peux aussi sortir le résultat sous la forme d'une date ou d'1 réel double, avec une fonction dans un module:


Code :
1
2
3
4
5
Function HourSup24(h As String) As Date
 
HourSup24 = TimeSerial(Split(h, ":")(0), Split(h, ":")(1), 0)
 
End Function
et après utiliser cette fonction dans une requête ou 1 module:

La fonction inverse est dans la faq.

A+
Le gros problème c'est donc de retravailler ces données horaires hors formulaire, par exemple dans les requêtes et états:

Mettons que l'on ait une requête ayant seulement un seul champ durée et seulement 2 lignes qui afficheraient :

25h35m
34h40mn

Quelle syntaxe mettre dans un champ [TotalHeures] de la dite requête pour que la fraction "Minutes" s'additionne à celle des heures et recompose une chaine hh:mm correcte ?

Sur deux lignes ça va encore mais sur plusieurs lignes on pourrait se retrouver avec 1000 Minutes par ex...

Je pense qu'il doit y avoir un moyen très simple de recalculer ça grâce à une fonction déjà incluse à mettre comme argument de champ de requete , non ?
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 20h56   #7
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 204
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 204
Points : 5 255
Points : 5 255
Salut,

En effet ton exemple est assez bien trouvé et abouti à une méthode assez amusante :

Si tu as dans une table nommée "Table1" les valeurs:
Durée
------
25:35
34:40

Tu aurais une requête du style:

Code sql :
1
2
SELECT HeureSup24(Sum(HourSup24([Table1].[Duree]))) AS TotalHeures
FROM Table1;

Note que j'utilise d'abord la fonction HourSup24 pour traduite la durée texte en expression date et heure.

Puis je fais la somme de ces expressions date et heure.

Pour enfin la retraduire en expression chaine du style "00:00" avec la fonction HeureSup24 de la faq.

C'est assez tordu mais aussi assez marrant à mettre en place

A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/01/2011, 13h25   #8
Membre régulier
 
Inscription : janvier 2011
Messages : 307
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 307
Points : 76
Points : 76
Citation:
Envoyé par User Voir le message
Salut,

En effet ton exemple est assez bien trouvé et abouti à une méthode assez amusante :

Si tu as dans une table nommée "Table1" les valeurs:
Durée
------
25:35
34:40

Tu aurais une requête du style:

Code sql :
1
2
SELECT HeureSup24(Sum(HourSup24([Table1].[Duree]))) AS TotalHeures
FROM Table1;

Note que j'utilise d'abord la fonction HourSup24 pour traduite la durée texte en expression date et heure.

Puis je fais la somme de ces expressions date et heure.

Pour enfin la retraduire en expression chaine du style "00:00" avec la fonction HeureSup24 de la faq.

C'est assez tordu mais aussi assez marrant à mettre en place

A+
Bonjour à toi User,

Et dire qu'access pourrait gérer ça automatiquement comme le fait Excel en mettant [hh]:nn !!!!

Que de complications !
En plus, au moment de la saisie de la durée, aucun masque de saisie ne semble être pratique pour l'utilisateur, s'agissant d'un champ texte.
A moins qu'il y ait une autre fonction à mettre en place !

Pfffff, par moment on se demande ...

Merci pour tout commentaire !
clickandgo est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/01/2011, 13h54   #9
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 204
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 204
Points : 5 255
Points : 5 255
Salut,

Pour le masque de saisie tu peux essayer un truc comme celà:

"00:00;0;_"

En évitant bien sûr de mettre un format pour le champ
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User 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 12h47.


 
 
 
 
Partenaires

Hébergement Web