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 :

Problème de soustraction toute simple entre deux heures [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 15
    Points
    15
    Par défaut Problème de soustraction toute simple entre deux heures
    Bonjour à tous.
    Alors voilà, je suis en stage dans un lycée et je dois créer une application pour gérer les BTS MUC de l'établissement, notamment les absences.
    Pour cela, j'ai un formulaire "gestapp" (gestion des apprentis) qui est composé d'une zone de liste avec la liste des noms, prénoms et classes des apprentis, et des boutons "ajouter", "modifier", "supprimer", "afficher", "retour au menu principal". Jusque là, aucun souci, tout fonctionne.
    Mais j'ai aussi deux zones de texte "nbheuresabs" et "nbjoursabs" qui compte respectivement le nombre d'heures d'absence de l'apprenti sélectionné dans la zone de liste et le nombre de jours qui en découle (je compte des journées de 9h de cours (oui c'est chargé !)).
    Pour les jours, aucun souci, les calculs sont bons.
    En revanche, pour les heures, je ne comprends pas du tout où j'ai pu faire une erreur.
    Lorsque je sélectionne l'apprenti "ADRIAENSSENS", je dois voir 22h d'absences (j’ai même vérifié à la calculatrice pour être sûre !), mais il m'affiche 18...

    Voici un extrait de mon code :

    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
    For i = 0 To listeapp.ListCount - 1
        If Me.listeapp.Selected(i) = True Then
            numapp = listeapp.Column(0, i)
        End If
    Next i
    nbabs = "SELECT COUNT(numabs) AS nbAbs FROM absences WHERE numapp = " & numapp & ";"
    exeAbs = CurrentDb.OpenRecordset(nbabs)!nbabs
    If exeAbs > 0 Then
        ' liste des "heuredeb" de l'apprenti sélectionné
        heuredeb = CurrentDb.OpenRecordset("SELECT heuredeb FROM absences WHERE numapp = " & numapp & ";")!heuredeb
        ' liste des "heurefin" de l'apprenti sélectionné
        heurefin = CurrentDb.OpenRecordset("SELECT heurefin FROM absences WHERE numapp = " & numapp & ";")!heurefin
        ' faire la différence entre les "heuredeb" et "heurefin"
        diffHeures = DateDiff("h", heuredeb, heurefin)
        ' additionner les nombres d'heures d'absence pour l'apprenti sélectionné
        calcul_heures = "SELECT SUM(" & diffHeures & ") AS nbHeures FROM absences WHERE numapp = " & numapp & ";"
        ' afficher dans "nbheuresabs" le nombre d'heures d'absences
        nbheuresabs = CurrentDb.OpenRecordset(calcul_heures)!nbHeures
        ' compter le nombre de journées (de 9h) d'absence
        nbJours = nbheuresabs / 9
        ' arrondir au dixième
        nbJoursArr = Format(nbJours, "#0.0")
        ' remplacer la virgule par le point
        nbJoursPt = Replace(nbJoursArr, ",", ".")
        ' afficher dans "nbjoursabs" le nombre de jours d'absence
        nbjoursabs = nbJoursPt
    Else
        nbheuresabs = "0"
        nbjoursabs = "0"
    End If
    J'ai pris soin de bien commenter les lignes en question.

    Merci d'avance à ceux qui me répondront, car j'avoue galérer là dessus, alors que ça parait si simple !

    PS : Pour information, je suis en première année de BTS IG (et je passe en 2nde année option DA), et on a fait même pas 1 mois de VBA... Mon stage se termine le 24 juin et j'ai encore pas mal de choses à faire grâce à ces calculs.

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour,

    Pour pouvoir t'aider, il faudrait avoir accès à tes données.

    Peux-tu poster ta BDD ?
    Attention, cette BDD ne peut contenir des données confidentielles !

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Je n'arrive pas à l'envoyer, un message s'affiche :

    Votre envoi ne peut pas être exécuté car la marque de sécurité est manquante.

    Si ceci survient de façon inattendue, veuillez en informer l'administrateur en lui décrivant les actions effectuées avant de recevoir cet erreur.
    Mais voici mon modèle relationnel :

    ABSENCES (numabs, numapp#, dateabs, heuredeb, heurefin) => Correspond à toutes les absences des apprentis.
    VISITE (numvisite, numapp#, nument#, numform#, datevisite1, crvisite1, datevisite2, crvisite2) => Correspond aux deux visites annuelles obligatoires qu'effectuent les formateurs (les profs, si vous préférez), "crvisite" est de type booléen, s'il y a eu un comtpe rendu ou pas.
    TUTEUR (numtuteur, numciv#, nomtuteur, prenomtuteur, mailtuteur, nument#) => Correspond aux tuteurs, c'est-à-dire les personnes qui s'occupent des apprentis au sein de l'entreprise.
    FORMATEUR (numform, nomform, prenomform, mailform) => Correspond aux professeurs qui s'occupent chacun d'un ou plusieurs apprentis (un apprenti n'est cependant suivi que par un seul formateur).
    ENTREPRISE (nument, raisonsociale, adresse1ent, adresse2ent, cpent, villeent, telfixeent, telportent, faxent, nomresp, fctresp, numcci#) => Correspond aux entreprises où les apprentis sont en alternance ; le champ "nomresp" correspond au nom du responsable de l'entreprise, et peut être différent du tuteur de l'apprenti ; "fctresp" correspond à la fonction du responsable dans l'entreprise ; "numcci" est le numéro de la Chambre consulaire (j'ai mis "cci" parce que ça signifie "chambre de commerce et de l'industrie", mais il m'a dit que ça devait être plus large, mais bref, donc j'ai laissé le nom "cci").
    APPRENTI (numapp, nomapp, prenomapp, adresse1app, adresse2app, cpapp, villeapp, telapp, mailapp, numclasse#, nument#, numtuteur#, numform#, numcontrat, datevisa, datedeb, datefin) => Correspond aux apprentis ; "numclasse" fait référence à la table CLASSE ; "numcontrat" est le numéro du contrat d'alternance ; "datevisa" correspond à la date à laquelle le chef de travaux du lycée a approuvé le contrat ; "datedeb" et "datefin" correspondent aux dates de début et de fin du contrat (2 ans).
    CIVILITE (numciv, nomcivabrege, nomciventier) => 3 enregistrements : "1 - Mlle - Mademoiselle", "2 - Mme - Madame" et "3 - M. - Monsieur"
    CLASSE (numclasse, nomclasse) => 2 enregistrements : "1 - MUC 1" et "2 - MUC 2"
    CCI (numcci, nomcci, adresse1cci, adresse2cci, cpcci, villecci, telcci, faxcci, mailcci) => Correspond aux Chambres consulaires ; une chambre consulaire peut contenir plusieurs entreprises, mais une entreprise n'appartient qu'à une seule Chambre consulaire.

    Information : les champs soulignés sont les clés primaires, et ceux avec des dièses sont des clés étrangères.

    Voilà, j'espère que ça vous aidera.

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour,

    Je n'arrive pas à l'envoyer, un message s'affiche :
    1 tu zippes le fichier de la BDD
    2 tu cliques sur "Ajouter une réponse" >> tu cliques la cinquième icône (l'attache trombone) et tu suis les instructions...

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Même en la zippant, elle est trop volumineuse :/

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Si quelqu'un d'autre pouvait répondre... ^^
    (Je n'ai jamais trop de conseils !)

  7. #7
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour Mademoiselle,

    À toutes fins utiles voici le texte de ma réponse à votre message privé, par lequel vous m'avez transmis votre BDD :

    Bonjour,

    1 J’ai ajouté la requête « rGestApp » pour faciliter la lecture
    2 le code de « Private Sub listeapp_Click() » tient en deux lignes !
    Pour te documenter sur la fonction NZ() : dans le code place le curseur de la souris sur le mot-clé NZ => l’aide Access s’ouvre à la bonne page.
    Pour te documenter sur les fonctions de domaine (ici Dlookup) vois :
    -Les fonctions de domaine (Philippe JOCHMANS)
    http://starec.developpez.com/tuto/fonctionsdomaines/


    NB. au passage, j’ai constaté une anomalie dans ta table « absences » :
    numabs numapp dateabs heuredebut heurefin
    58 72 1/02/11 11:30 17:30
    59 71 1/02/11 8:30 17:30


    Les deux périodes se recouvrent => absent 9 heures et non 15 !


    PS : Prends l'habitude de demander la compression de la BDD à la sortie (outils/options/Général : cocher la case ad hoc)

    Reviens si problème.
    -------------------

    sql de la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT absences.numapp, Sum(24*([heurefin]-[heuredeb])) AS heures
    FROM absences
    GROUP BY absences.numapp;
    Ce qui permet de remplacer votre très long code par les deux lignes que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.nbheuresabs = Nz(DLookup("Heures", "rGestapp", "NumApp=" & Me.listeapp.Column(0)), 0)
    Me.nbjoursabs = Me.nbheuresabs / 9

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Merci pour la réponse !

    Donc je dois remplacer toute l'instruction "if" par les deux lignes et enregistrer la requête ?

    Merci pour l'anomalie, c'est exact ! J'avais fait des tests au hasard afin de pouvoir tout tester...

    Edit : Ca marche ! Merci ! Pour ce qui est des dates d'absences, j'avais laissé toutes les mêmes, donc normal, il y a plein d'anomalies, mais ce ne sont que des tests...

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

Discussions similaires

  1. [AC-2007] Soustraction entre deux heures au format "00:00:00"
    Par Philippeduchnord dans le forum VBA Access
    Réponses: 3
    Dernier message: 02/12/2012, 12h23
  2. Problème d'interval entre deux heures
    Par ILP dans le forum Langage
    Réponses: 6
    Dernier message: 07/10/2010, 17h43
  3. problème différence entre deux heures
    Par gwenhael dans le forum Langage
    Réponses: 2
    Dernier message: 14/09/2006, 15h16
  4. Réponses: 7
    Dernier message: 05/07/2006, 16h29
  5. [Dates] Calcul d'une différence entre deux heures
    Par loreleï85 dans le forum Langage
    Réponses: 12
    Dernier message: 28/06/2006, 11h43

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