Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Modélisation
Modélisation Le forum qui vous aide à résoudre vos questions relatives à la modélisation (tables et relations) de votre base de données sous Access. Pour les états et les formulaires, postez dans le forum IHM.
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 23/02/2008, 19h57   #1
Invité régulier
 
Homme
Inscription : octobre 2004
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 51

Informations forums :
Inscription : octobre 2004
Messages : 34
Points : 6
Points : 6
Par défaut Calcul sur des temps de fonctionnement

Bonsoir
J'ai besoin d'additionner ou de soustraire des temps de fonctionnement machines exprimés en H/mm (Ex 2180h45 + 165h50). Jusqu'à maintenant je passais par Excel, où c'est vraiment simple, mais avec Access ça se complique....
J'ai récupéré un Module que l'on m'a donné :
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
Function AddHrs(Hr1, Hr2)
                Dim H1, H2, AdH, Hmn As Single
                Dim Check As Boolean
                Check = IsNull(AdH)
                   If Check = True Then AddHrs = ""
                   If Chech = False Then
                    H1 = (5 / 3 * Hr1) - (2 / 3 * Int(Hr1))
                    H2 = (5 / 3 * Hr2) - (2 / 3 * Int(Hr2))
                    AdH = H1 + H2
                    Hmn = (3 / 5 * AdH) + (2 / 5 * Int(AdH))
            AddHrs = Format(Hmn, "00.00")
            End If
    End Function
 
    Function DtHrs(Ghrs, Phrs)
Dim Gh, Ph, Delta, Hmn As Single
                Gh = (5 / 3 * Ghrs) - (2 / 3 * Int(Ghrs))
                Ph = (5 / 3 * Phrs) - (2 / 3 * Int(Phrs))
                Delta = Gh - Ph
                If Delta = "" Then DtHrs = ""
                If Delta <> "" Then
                       Hmn = (3 / 5 * Delta) + (2 / 5 * Int(Delta))
                          DtHrs = Format(Hmn, "00.00")
      End If
End Function
Ce module fonctionne très bien, mais seul inconvénient, il ne supporte pas les champs vides, or les tables avec lesquelles je travail en sont truffées ! Donc ça plante tous les 5 minutes.
Je voudrais faire les calculs dans mes requêtes.
Quelqu'un aurait il la formule magique ??
micbett est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2008, 20h38   #2
Membre Expert
 
Avatar de Gabout
 
Inscription : mai 2006
Messages : 1 298
Détails du profil
Informations personnelles :
Âge : 57
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : mai 2006
Messages : 1 298
Points : 1 289
Points : 1 289
Bonjour,

Juste une remarque au passage
Citation:
Dim H1, H2, AdH, Hmn As Single
cela te donne 3 Variant et 1 Single, donc
Code :
Dim H1 As Single, H2 As Single, AdH As Single, Hmn As Single
Gabout
Gabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2008, 20h41   #3
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 941
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 941
Points : 6 283
Points : 6 283
Bonsoir,

Pas de formule magique mais on peut remplacer les Null par 0 dans les deux fonctions.
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
Function AddHrs(Hr1, Hr2)
Dim H1, H2, AdH, Hmn As Single
Dim Check As Boolean
    If IsNull(Hr1) Then Hr1=0
    If IsNull(Hr2) Then Hr2=0
    Check = IsNull(AdH)
    If Check = True Then AddHrs = ""
    If Chech = False Then
       H1 = (5 / 3 * Hr1) - (2 / 3 * Int(Hr1))
       H2 = (5 / 3 * Hr2) - (2 / 3 * Int(Hr2))
       AdH = H1 + H2
       Hmn = (3 / 5 * AdH) + (2 / 5 * Int(AdH))
       AddHrs = Format(Hmn, "00.00")
    End If
End Function
 
Function DtHrs(Ghrs, Phrs)
Dim Gh, Ph, Delta, Hmn As Single
    If IsNull(Ghrs) Then Ghrs=0
    If IsNull(Phrs) Then Phrs=0
    Gh = (5 / 3 * Ghrs) - (2 / 3 * Int(Ghrs))
    Ph = (5 / 3 * Phrs) - (2 / 3 * Int(Phrs))
    Delta = Gh - Ph
    If Delta = "" Then DtHrs = ""
    If Delta <> "" Then
       Hmn = (3 / 5 * Delta) + (2 / 5 * Int(Delta))
       DtHrs = Format(Hmn, "00.00")
    End If
End Function
Petite question :
Les deux fonctions renvoient une donnée de type texte.
Quel est le type de donnée des champs dans la ou les tables ? Réel simple ?

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2008, 20h56   #4
Invité régulier
 
Homme
Inscription : octobre 2004
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 51

Informations forums :
Inscription : octobre 2004
Messages : 34
Points : 6
Points : 6
Remplacer les null par des 0 serait pour moi LA solution !!
Mes champs dans les tables sont des réel doubles
micbett est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2008, 22h07   #5
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 941
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 941
Points : 6 283
Points : 6 283
Voila les fonctions modifiées :
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
Function AddHrs(Hr1, Hr2)
Dim H1 As Single, H2 As Single, AdH As Single, Hmn As Single
    If IsNull(Hr1) Then Hr1 = 0
    If IsNull(Hr2) Then Hr2 = 0
    Hr1 = CSng(Hr1)
    Hr2 = CSng(Hr2)
    H1 = (5 / 3 * Hr1) - (2 / 3 * Int(Hr1))
    H2 = (5 / 3 * Hr2) - (2 / 3 * Int(Hr2))
    AdH = H1 + H2
    Hmn = (3 / 5 * AdH) + (2 / 5 * Int(AdH))
    AddHrs = Format(Hmn, "00.00")
End Function
 
Function DtHrs(Ghrs, Phrs)
Dim Gh As Single, Ph As Single, Delta, Hmn As Single
    If IsNull(Ghrs) Then Ghrs = 0
    If IsNull(Phrs) Then Phrs = 0
    Ghrs = CSng(Ghrs)
    Phrs = CSng(Phrs)
    Gh = (5 / 3 * Ghrs) - (2 / 3 * Int(Ghrs))
    Ph = (5 / 3 * Phrs) - (2 / 3 * Int(Phrs))
    If Gh >= Ph Then Delta = Gh - Ph Else Delta = Ph - Gh
    Hmn = (3 / 5 * Delta) + (2 / 5 * Int(Delta))
    If Gh >= Ph Then Hmn = -Hmn
    DtHrs = Format(Hmn, "00.00")
End Function
J'ai laissé la fonction de formatage qui fait que les fonctions renvoient du texte.
Je suppose que c'est pour des besoins esthétiques (afficher 12,50 pour 12H50mn au lieu de 12,5).

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2008, 23h52   #6
Invité régulier
 
Homme
Inscription : octobre 2004
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 51

Informations forums :
Inscription : octobre 2004
Messages : 34
Points : 6
Points : 6
La dernière version de tes fonctions ne fonctionne pas correctement dans ma base (les résultats sont presque le double de la normale dans une addition)
Par contre ta première version fonctionne très bien et effectivement plus de plantage sur les champs Null !!!
Te casses pas la tête pour la deuxième version, je suis déjà plus que satisfait.
Grand Merci !!
micbett est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2008, 20h01   #7
Invité régulier
 
Homme
Inscription : octobre 2004
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 51

Informations forums :
Inscription : octobre 2004
Messages : 34
Points : 6
Points : 6
Par défaut Somme de temps de fonctionnement

Bonsoir
Me revoila avec mes histoires d'heures... Dites moi si j'abuse !
Maintenant que mon premier problème a été brillamment résolu, je voudrais faire une somme de ces temps de fonctionnement pour avoir les heures total d'un mois (ex : 165h30+ 23h47+1054h55+...etc) la liste contient environ une soixantaine de valeurs. Je soupçonne que le mieux est d'écrire cela dans un module mais j'ai un peu peur de me lancer, je pense que la fonction sum doit -être utilisée, mais mes compétences s'arrête là
micbett est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2008, 23h17   #8
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 941
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 941
Points : 6 283
Points : 6 283
Bonsoir,

Je suppose que tu veux faire ta somme dans une requête.
Il faut d'abord convertir tes nombres hh.mn en nombres décimaux.
Faire la somme de ces nombres convertis.
Enfin convertir le résultat de la somme en nombre hh.mn
Code vb :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function ConvHmnDec(ValHmn)
' Nombre Heure.Minutes --> Nombre décimal
Dim Result As Single
If IsNull(ValHmn) Then ValHmn = 0
Result = (5 / 3 * ValHmn) - (2 / 3 * Int(ValHmn))
ConvHmnDec = Result
End Function
 
Function ConvDecHmn(ValDec)
' Nombre décimal --> Nombre Heure.Minutes
Dim Result As Single
If IsNull(ValDec) Then ValDec = 0
Result = (3 / 5 * ValDec) + (2 / 5 * Int(ValDec))
ConvDecHmn = Result
' ou
'ConvDecHmn = Format(Result, "00.00")
End Function
Exemple de requête sur une table Table1 ayant pour champs Duree(Double) et Dt(Date)
Code sql :
1
2
3
SELECT ConvDecHmn(Sum(ConvHmnDec([Table1].[Duree]))) AS TotDuree
FROM Table1
WHERE ((Year(TABLE.Dt)=2008) AND (Month(TABLE.Dt)=2)) ;
A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2008, 17h47   #9
Invité régulier
 
Homme
Inscription : octobre 2004
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 51

Informations forums :
Inscription : octobre 2004
Messages : 34
Points : 6
Points : 6
Nickel ! Ça marche aussi
Ça donne vraiment envie de s'y mettre plus sérieusement (à la programmation)
Puisque je suis sur une bonne série, une question que je n'arrive pas à résoudre simplement depuis longtemps :
Comment renseigner une table à partir d'un champs calculé dans une requête ou dans un formulaire ?
Par exemple la somme des temps de fonctionnement que tu m'a fait calculer dans une requête, est-il possible d'aller mettre le résultat automatiquement dans un table pour le stocker afin qu'il ne disparaisse pas le mois d'après, écrasé par le nouveau ?
Encore un grand merci !!
micbett est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2008, 19h21   #10
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 941
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 941
Points : 6 283
Points : 6 283
Bonsoir,

Je pense qu'une requête de type Ajout devrait répondre à ton besoin.

Tu peux faire une requête Ajout ayant pour source ta requête de calcul de durée cumulée sur une période.

Tu peux aussi partir de ta requête de calcul de durée cumulée, et la transformer en requête Ajout.

Depuis un champ calculé dans un formlaire il peut y avoir plusieurs façons.
Ça va dépendre du contexte.
Si la table à alimenter est la source du formulaire, on peut copier le contrôle calculé dans un champ de la table source du formulaire avec du code VB.
Si la table à alimenter n'a aucun lien avec le formulaire, on peut créer une requête ajout récupérant des données affichées par le formulaire.
Un bouton pourra alors exécuter la requête Ajout (code VB ou macro Access)

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2008, 16h44   #11
Invité régulier
 
Homme
Inscription : octobre 2004
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 51

Informations forums :
Inscription : octobre 2004
Messages : 34
Points : 6
Points : 6
Je ne m'étais jamais servi des requêtes ajout, effectivement bien pratique.
Parfait, merci encore et surement à bientôt
micbett 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 03h36.


 
 
 
 
Partenaires

Hébergement Web