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

Access Discussion :

Calculer différence date champ d'une même requête


Sujet :

Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 114
    Points : 46
    Points
    46
    Par défaut Calculer différence date champ d'une même requête
    bonjour,

    J'ai ma table POINTAGE qui me permet d'avoir des lignes de pointage de mon personnel.
    Ex.
    Nom - Code - Date - Heure - Minutes
    Thierry LUC - 456 - 12/10/2005 - 09 - 05
    Thierry LUC - 456 - 12/10/2005 - 15 - 05
    Thierry LUC - 456 - 13/10/2005 - 08 - 55
    Thierry LUC - 456 - 13/10/2005 - 15 - 45

    Voici le résultat de ma requête (pointageReq) .. Pourrai je utiliser l'heure (1ere ligne) comme une heure de début et l'autre, comme une heure de fin ?

    A savoir, comment faut-il se prendre pour déterminer le calcul d'une durée sur ce type d'enregistrement ? Pouvoir conclure que Mr Thierry a travaillé de 09 : 05 à 15 : 05, donc un total de : 6 Heures.

    Merci

  2. #2
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Salut,

    Ce serait mieux si les heures et les minutes étaient intégrées au champs date non? A moins que tu ais un intérêt à les séparer, le champs date peut contenir les heures.

    Sinon à creuser, si la table est déjà triée par heure/minute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT pointageReq.nom, pointageReq.code, pointageReq.date, TimeSerial(First([heure]),First([minute]),0) AS Debut, TimeSerial(Last([heure]),Last([minute]),0) AS Fin, Format([Fin]-[Debut],"Short Time") AS Duree
    FROM pointageReq
    GROUP BY pointageReq.nom, pointageReq.code, pointageReq.date
    ORDER BY pointageReq.date;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 114
    Points : 46
    Points
    46
    Par défaut
    tout d'abord merci pour l'info, ca m'a un peu aider ... car mon souci maintenant est de taille !

    Je reçois les données de pointage de ma pointeuse, reliée par le port COM ... Bref, je ne peux regrouper les Heures et Minutes .... Ta formule fonctionne parfaitement, mais quand j'ai ce cas de figure, comment faire ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Code	Nom / Prénom	Date 	Heure(s)	Minute(s)
    8974	AIT ADDI MOHAMMED 25/10/2005	09	09
    8974	AIT ADDI MOHAMMED 25/10/2005	13	51
    8974	AIT ADDI MOHAMMED 25/10/2005	14	06
    8974	AIT ADDI MOHAMMED 25/10/2005	15	58
    Sachant que si je traduit, ca donne : Mr AIT ADDI a pointer à 09:09, sort à 13:51 puis ne reprend qu'à 14:06 pour finir à 15:58 ...

    Comment calculer l'interval entre chaque tranche ?

    Merci bcp

  4. #4
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    là ça devient compliqué.

    avec une requête je sais pas comment faire, en se creusant la tête y a peut-être un moyen mais je sais pas.

    sinon il faudrait faire tout ça en vba avec un recordset...

  5. #5
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Bonjour,

    Citation Envoyé par Arkham46
    sinon il faudrait faire tout ça en vba avec un recordset...
    Je pense que Arkham46 a raison car si un employé oublie de pointer (ou si la pointeuse déconne), tu ne t'en sortiras pas.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    ben le problème est pas trop difficile en soi
    il suffit d'aller chercher l'enregistrement precédent
    top 1 code=code and dateheure<dateheure order dateheure descending
    par contre
    on doit calculer pour les sorties seulement
    ce qui suppose de savoir typer le mouvement (entrée ou sortie)
    et là horreur
    que se passe t'il
    si un abruti oublie de pointer
    ou si la pointeuse tombe en panne

    ceci suppose de vérifier que sortie - entrée < amplitude max du temps de travail

    et si ce n'est pas le cas d'introduire manu un mouvement
    pour une unité de 500 personnes bonjour l'angoisse

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 114
    Points : 46
    Points
    46
    Par défaut
    Okay je vois ... on peut supposer que les personnes pointent sans soucis, si le problème se pose, comme tu dis, on peut faire une vérification ..

    Quel type de formule pour avoir une durée pour le second enregistrement dans ce cas la ?

    A savoir si :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Code   Nom / Prénom   Date    Heure(s)   Minute(s)
    8974   AIT ADDI MOHAMMED 25/10/2005   09   09
    8974   AIT ADDI MOHAMMED 25/10/2005   13   51
    8974   AIT ADDI MOHAMMED 25/10/2005   14   06
    8974   AIT ADDI MOHAMMED 25/10/2005   15   58
    Entre 13h51 et 14h06 = (durée d'absence)

    En imaginons le cas idéal : l'employé n'oublie pas de pointer (ou au pire, s'il est possible de gérer ce cas aussi !!).

    Toutefois, les personnes qui pointeront pour absence seront traitées autrement Car il est fort possible d'avoir ce cas de figure aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Code   Nom / Prénom   Date    Heure(s)   Minute(s)
    8974   AIT ADDI MOHAMMED 25/10/2005   09   09 // Embauche
    8974   AIT ADDI MOHAMMED 25/10/2005   10   00 // Sortie visite médical
    8974   AIT ADDI MOHAMMED 25/10/2005   11   30 // Fin visite médical
    8974   AIT ADDI MOHAMMED 25/10/2005   13   51 // Pause Dej
    8974   AIT ADDI MOHAMMED 25/10/2005   14   06 // Fin pause Dej
    8974   AIT ADDI MOHAMMED 25/10/2005   15   58 // Débauche
    Ce n'est pas simple, mais si on arrive à trouver qq'chose de + ou - fiable ...

    Thanks

  8. #8
    Membre habitué

    Inscrit en
    Mars 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 92
    Points : 127
    Points
    127
    Par défaut
    Bonjour,
    Ton problème de pointeuse m'intéresse, je ne suis pas une pro...
    une proposition:

    En imaginons le cas idéal : l'employé n'oublie pas de pointer (ou au pire, s'il est possible de gérer ce cas aussi !!).
    si on regroupe sur la journée et par personne, le nombre d'enregistrement doit être pair (toujours 1 entrée + 1 sortie) cela permettra déjà de repérer un oubli et le traiter en conséquence.
    quand au reste du traitement, je suppose qu'il faut tenir compte des jours de congé, éventuelement la pose de midi obligatoire ?
    j'utiliserais un recordset
    exemple: si il y a 6 enregistrements pour 1 personne/1 jour,
    déplacement sur le 1er enregistrement HeureDebut=heure
    moveNext enregistrement HeureFin =heure
    HeurePresté=HeurePresté+(HeureFin-HeureDebut)
    à faire 3 fois
    HeureSup=HeurePresté-HeureObligatoireParJour (+HeureSiCongé)
    stockage des heures sup

    et ceci pour chaque personne et chaque jour
    si il n'y a que 2 enregistrements (oubli de pointage à midi), décompter 1/2 heure si règlement l'oblige, etc...

    en espérant avoir pu t'aider

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 114
    Points : 46
    Points
    46
    Par défaut
    Okay, pas mal vu

    Bon, j'ai crée la connexion et la requête .. mais aprés, je bloque

    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
    Sub ADOOpenRecordset()
    Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset, fld As ADODB.Field
     
    ' Ouverture de la connexion
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=.\RH.mdb;"
    ' Ouverture du Recordset en défilement en avant, et en lecture seule
    rst.Open "SELECT Persacces.Per_mat, Persacces.per_nom AS nom, Persacces.per_code_acc AS code, Pointage.Poin_date AS [date], Pointage.Poin_heure AS heure, Pointage.Poin_minute AS [minute] 
     
    FROM Persacces INNER JOIN Pointage ON Persacces.per_code_acc = Pointage.Poin_no_carte GROUP BY Persacces.Per_mat, Persacces.per_nom, Persacces.per_code_acc, Pointage.Poin_date, Pointage.Poin_heure, Pointage.Poin_minute 
     
    HAVING (((Persacces.per_code_acc) = [LstSalarie]) And ((pointage.Poin_date) = [TxtDate])) ORDER BY Pointage.Poin_date, Pointage.Poin_heure, Pointage.Poin_minute", 
     
    cnn, adOpenForwardOnly, adLockReadOnly
     
    // Je fais un regroupement par salarié et par jour
     
    rst.MoveFirst
    While Not rst.EOF
        ' code
        rst.MoveNext
    Wend
     
     
    ' Fermeture du Recordset
    rst.Close
     
    End Sub
    Voila, maintenant, je ne vois pas comment je pourrai réaliser cela

  10. #10
    Membre habitué

    Inscrit en
    Mars 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 92
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Pointage.Poin_date AS [date]
    as Date n'est pas bon car date est un mot réservé et cela va te créer des problèmes
    concernant ADODB, je ne sais pas t'aider . Je travaille généralement en DAO

    Si je comprends bien, tu as une table Persacces avec ton personnel et tu as une 2è table Pointage où tu as les données de la pointeuse avec les heures,...
    J'utiliserais alors des boucles imbriquées:
    le principe serait pour la journée précédente qui est complète :
    un premier recordset RstPersonne:
    SELECT Persacces.* FROM Persacces
    Movefirst
    While Not RstPersonne.EOF
    1) Aller rechercher dans une table THeureSup le nombre d'heure
    sup déjà presté par cette personne=HeureSup
    2) Aller chercher dans une table Tcongé si cette personne a pris
    congé ou maladie (en nb d’heures) pour cette journée
    = NbHeureCongé
    3)un 2è recordset RstPointage qui sélectionne tous les
    enregistrements de la journée pour cette personne
    SELECT Pointage.* FROM Pointage WHERE
    Pointage.Poin_no_carte = RstPersonne!per_code_acc
    on les compte
    si nb d'enregistrement >0
    1)vérifier si le nb d'enregistrement est bien pairs
    sinon traiter l’erreur
    2) vérifier qu’il a au moins 4 enregistrements pour la pause
    de midi dans le cas ou il n’a pas pris ½ jour de congé
    3) RstPointage.movefirst
    While Not RstPointage.EOF
    HeureDebut=RstPointage!Heure
    RstPointage.movenext
    HeureFin=RstPointage!Heure
    HeureSup= HeureSup+(HeureFin-HeureDebut )
    RstPointage.movenext
    Wend
    HeureSup=HeureSup-NbHeureAPresterParJour+NbHeureCongé
    sinon
    congé, maladie? (si les congés sont stockés dans une table, vérifier)
    FinSi
    Mise à jour de la table THeureSup
    RstPersonne.Movenext
    Wend

    Ce serait ma façon de le faire

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 114
    Points : 46
    Points
    46
    Par défaut
    Hello et merci pour ces précieuses infos
    bonne nouvelle, on ne gére pas les heures supp ... j'ai essayé d'appliquer un peu ta démarche, qui me semble intéressante .. voila ce que ca m'donne :

    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
    Sub ADOOpenRecordset()
     
    Dim cnn As New ADODB.Connection, rstPersonne, rstPointage As New ADODB.Recordset, fld As ADODB.Field
     
    ' Ouverture de la connexion
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=.\RH.mdb;"
     
    ' Ouverture du Recordset en défilement en avant, et en lecture seule
     
    rstPersonne.Open "SELECT * FROM persacces"
    MoveFirst
     
    compteur = 0
    While Not rstPersonne.EOF
    rstPointage.Open "SELECT Pointage.* FROM Pointage WHERE pointage.Poin_no_carte = rstpersonne!per_code_acc"
    compteur = compteur + 1
    MoveNext
     
    ' Fermeture du Recordset
     
    End Sub
    Malheureusement, je ne suis pas sûr de ce que je viens de réaliser .. peux tu me donner un exemple de "code" pour illustrer ton exemple ?

    Ma table ABS contient les absences "déclarées" de mon personnel. Voici sa structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EST_ABSENT(NumAbs, DateAbs, DateRetour, Motif, IDTypeAbs# // Congés, Maladie, Autre // , IDSalarie#, DateDemande)
    Sans en demander trop, ou vais je stocker les résultats ? l'objectif est d'avoir quotidiennement par personne une durée de pause dej' (1 heure entre 12h et 14h). Merci Sasmira as tu msn ??

  12. #12
    Membre habitué

    Inscrit en
    Mars 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 92
    Points : 127
    Points
    127
    Par défaut
    Bonjour,
    Pour le stockage je créerais une table supplémentaire qui reprendrais la date, le code de la personne et ce qu'il faut stoquer pour le jour: mais je ne connais pas tes règles de gestion alors c'est à toi d'y réfléchir
    Quelles sont-elles exactement?
    L'heure de midi= 1h entre 12 et 14 h. Mais si ce n'est pas le cas, que se passe-t-il?
    Combien d'heure par jour?
    Si le nb d'heure est inférieur? et si supérieur?
    etc...
    Pour l'instant je suis à ma pause de midi au boulot, et n'ai donc pas beacoup de temps pour t'écrire du code d'autant plus que je code lentement. Je tacherai de faire un peu en rentrant ce soir, mais ce soir, mon temps est compté
    Pour ta question: non, je ne vais jamais sur msn


  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 114
    Points : 46
    Points
    46
    Par défaut
    No problemo

    Alors mes règles de gestion sont :

    Si le nombre d'enregistrement est pair et = 2 alors
    cela signifie que la personne a pris sa pause dej à la cantine donc pas de souci
    pause dej = 0, absence = 0

    Si le Nb d'enregistrement est pair et = 4 alors
    Localiser l'enregistrement situé entre 12 h et 14 h car la pause dej est obligatoirement dans cette tranche

    pause dej = heurefin - heuredeb
    Absence = 0

    Si le Nb d'enregistrement est pair et > 4 alors
    localiser l'enr. situé entre 12H et 14H pause dej
    ET
    Vérifier dans la table EST_ABSENT si une absence a été notifiée pour ce jour.
    - Si oui, prendre la durée d'absence.
    - Si non, afficher une alerte "Absence non justifée" => ne pas gérer la durée d'absence

    Si le Nb d'enr. est impair alors
    afficher une alerte et ne pas gérer les durées (l'utilisateur ira modifier l'enregistrement) => Dans ce cas, on gére aussi les gars qui oublient de pointer ou qui pointent 2 fois en sortant !

    Que penses-tu de ca ?

    Thanks

  14. #14
    Membre habitué

    Inscrit en
    Mars 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 92
    Points : 127
    Points
    127
    Par défaut
    Bonsoir,
    Voilà j'ai fait un bout de code. Mais je ne suis pas habituée de travailler avec des heures et des dates, d'où à toi de chercher dans le forum pour le traitement correct de celles-ci. De plus dans ton exemple tu présentes les heures et les minutes dans des champs séparés
    N'étant pas une experte, il y a surement des erreurs dans ce code d'autant plus que je l'ai écris à la volée dans Word afin d'avoir plus d'espace qu'ici et je ne l'ai pas testé.
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    ‘soit pour un jour déterminé : JourX
     
    Dim Bds As DAO.Database
    Dim RstPersonne As DAO.Recordset
    Dim RstPointage As DAO.Recordset
    Dim Rq as string
    Dim Pausedej as Integer
    Dim Absence as Integer
    Dim i as Integer
    Dim HeureDeb As Integer  ‘les heures que tu indiques sont dans un champ séparé des minutes
    Dim HeureFin As Integer
    Set Bds = CurrentDb
    Rq=  "SELECT Persacces.per_code_acc AS code FROM Persacces ; "
    Set RstPersonne = Bds.OpenRecordset(Rq)
    If RstPersonne.RecordCount > 0 Then
            RstPersonne.MoveLast
            RstPersonne.MoveFirst
    	While Not RstPersonne.EOF
    		Rq=  " SELECT Pointage .* FROM Pointage WHERE Pointage.Poin_no_carte = "  & RstPersonne!code  & “ AND  Pointage.Poin_date = # “ & JourX & “ # ;”
    		Set RstPointage = Bds.OpenRecordset(Rq)
    		If RstPointage.RecordCount > 0 Then
    			RstPointage.MoveLast
    			RstPointage.Movefirst
    			If RstPointage.RecordCount Mod 2=1 then
    				‘Nombre d’enregistrement impair : Message d’erreur de pointage
    				Exit Sub
    			End if
     
    			Select Case RstPointage.RecordCount
    				Case 2
    					Absence=0
    					PauseDej=0
    				Case 4
    					For i=1 to 2
    						HeureDeb= RstPointage!Heure
    						RstPointage.MoveNext
    						HeureFin= RstPointage!Heure
    						RstPointage.MoveNext
    						If HeureDeb>=12 AND HeureDeb<=14 AND HeureFin >=12 AND HeureFin<=14 then
    							Absence=0
    							PauseDej=HeureFin-HeureDeb
    						Else
    							‘a traiter
    						End if
    					Next I
    				Case 6
    					‘recherche mission
    			End Select
    		End if
    RstPersonne.MoveNext
    	wend
     
    End if
    RstPointage=Nothing
    RstPersonne=Nothing
    Maintenant à toi de le corriger et de le perfectionner

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 114
    Points : 46
    Points
    46
    Par défaut
    Merci, j'ai fais quelques corrections bon, ce que je n'arrive pas à corriger c'est cette partie :

    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
                Case 4
                   For i = 1 To 2
                      HeureDeb = RstPointage!Poin_heure
                      MsgBox (HeureDeb)
                      RstPointage.MoveNext
     
                      HeureFin = RstPointage!Poin_heure
                      RstPointage.MoveNext
                      MsgBox (HeureFin)
     
                      If HeureDeb >= 12 And HeureDeb <= 14 And HeureFin >= 12 And HeureFin <= 14 Then
                         Absence = 0
                         Pausedej = HeureFin - HeureDeb
                         MsgBox (Pausedej)
                    Else
                        MsgBox ("problème")
                    End If
     
                    Next i
    avec l'exemple ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Code	Nom / Prénom	Date 	Heure(s)	
    6169	BENKIRANE 12/05/2005	08	
    6169	BENKIRANE 12/05/2005	12	
    6169	BENKIRANE 12/05/2005	13	
    6169	BENKIRANE 12/05/2005	19
    TOUS mes enregistrement passe dans l'étape Else de ma boucle If

    Que pasa ?

    Thanks !

  16. #16
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Dans le cas:
    Citation Envoyé par priest69
    Si le Nb d'enregistrement est pair et = 4 alors
    Localiser l'enregistrement situé entre 12 h et 14 h car la pause dej est obligatoirement dans cette tranche

    pause dej = heurefin - heuredeb
    Absence = 0
    Logiquement, on peut avancer que:
    >> le 2ème pointage contient l'heure de début de la pause
    >> le 3ème pointage contient l'heure de fin de la pause

    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
        Case 4
            'Passer au 2ème pointage
            RstPointage.MoveNext
            HeureDeb = RstPointage!Poin_heure
            MsgBox (HeureDeb)
     
            ' Passer au 3ème pointage
            RstPointage.MoveNext
            HeureFin = RstPointage!Poin_heure
            MsgBox (HeureFin)
     
            If HeureDeb >= 12 And HeureDeb <= 14 And HeureFin >= 12 And HeureFin <= 14 Then
               Absence = 0
               Pausedej = HeureFin - HeureDeb
               MsgBox (Pausedej)
            Else
                MsgBox ("problème")
            End If
    Petite question:
    Quel est le type de données de Pausedej ?
    La durée de la pause est-elle codée sur un nombre entier (le nb de minutes), sur un nombre décimal (en heures décimales) ou avec le type Date de VB qui permet de représenter directement les heures:minutes:secondes ?

    Je vois que tu as encore pas mal de travail... Bon courage !

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 114
    Points : 46
    Points
    46
    Par défaut
    Bon, j'ai apporter les modif, pas de soucis, ca fonctionne mais voila le petit problème ...

    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
                Case 4
     
     
              For i = 2 To 2 Step 1
     
     
                      RstPointage.Move (2)
                      HeureDeb = RstPointage!Poin_heure
                      RstPointage.MoveNext
     
                      HeureFin = RstPointage!Poin_heure
                      RstPointage.MoveNext
     
                      If HeureDeb >= "12" And HeureDeb <= "14" And HeureFin >= "12" And HeureFin <= "15" Then 'Assembler HH:MM
                         Absence = 0
                         Pausedej = HeureFin - HeureDeb
                         TxtDureePause = Pausedej
                      Else
                        mes = MsgBox("La pause déjeuner n'a pas été prise dans le créneau horaire. Pour plus de détails, vérifiez les enregistrements de pointage", vbInformation, "RH")
     
                      End If
     
             Next i
    Lorsque j'ai des enregistrements de ce type ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Code	Nom / Prénom	   Date 	 Heure(s) Minute(s)
    6169	BENKIRANE Loutfi  04/10/2005	08	04
    6169	BENKIRANE Loutfi  04/10/2005	12	53
    6169	BENKIRANE Loutfi  04/10/2005	13	59
    6169	BENKIRANE Loutfi  04/10/2005	17	30
    Mes msgbox me signale que le 1er enregistrement lu est 12 et le second (heurefin) est 17 ... alors que j'aimerai qu'il teste le suivant (cad 13)

    Quelqu'un à une idée ?

  18. #18
    Membre habitué

    Inscrit en
    Mars 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 92
    Points : 127
    Points
    127
    Par défaut
    Bonsoir,
    il est clair que ton pb n'est pas simple
    Mes msgbox me signale que le 1er enregistrement lu est 12 et le second (heurefin) est 17 ... alors que j'aimerai qu'il teste le suivant (cad 13)
    peut être faudrait-il ordoner le recordset pointage et si ton champ Date (qui porte un mauvais nom) est date/heure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rq=  " SELECT Pointage .* FROM Pointage WHERE Pointage.Poin_no_carte = "  & RstPersonne!code  & “ AND  Pointage.Poin_date = # “ & JourX & “ #  ORDER BY Pointage.Date;”
    sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...ORDER BY Heure, Minute;

  19. #19
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour,

    As-tu mis un ORDER BY sur l'ouverture de ton recordset?

    pgz

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 114
    Points : 46
    Points
    46
    Par défaut
    Okay, effectivement, il fallait faire en sorte qu'un ORDER BY (ASC) soit mis en place...

    Bon, en finalité nous avons ca pour une date donnée :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    Private Sub Commande41_Click()
    Dim Bds As DAO.Database
    Dim RstPersonne As DAO.Recordset
    Dim RstPointage As DAO.Recordset
    Dim RstAbsence As DAO.Recordset
    Dim Rq As String
    Dim req As String
    'Dim Pausedej As Integer
    Dim PartDecim As Integer
    Dim Absence As Integer
    Dim i As Integer
    Dim HeureDeb As Integer
    Dim HeureFin As Integer
    Dim vardate As Date
     
    vardate = Format(TxtDate, "mm/dd/yyyy") 
     
    Set Bds = CurrentDb
    Rq = "SELECT Persacces.per_code_acc AS code FROM Persacces"
    Set RstPersonne = Bds.OpenRecordset(Rq)
     
    If RstPersonne.RecordCount > 0 Then 'Le salarié existe-t-il ?
            'RstPersonne.MoveLast
            RstPersonne.MoveFirst
     
       While Not RstPersonne.EOF 'Fin du Recordset
           'ajout du parcours entre 2 dates
               Rq = "SELECT pointage.Poin_date, pointage.Poin_no_carte, pointage.Poin_heure, pointage.Poin_minute FROM pointage WHERE (((pointage.Poin_date)= #" & vardate & "# )) AND ((pointage.Poin_no_carte) = '" & RstPersonne!code & "') ORDER BY pointage.Poin_heure;"
               Set RstPointage = Bds.OpenRecordset(Rq)
               nbpointage = RstPointage.RecordCount
     
                If nbpointage > 0 Then 'Vérifier le nombre de pointage
                    'RstPointage.MoveLast
                     RstPointage.MoveFirst
     
                        If RstPointage.RecordCount Mod 2 = 1 Then
                            'Nombre d'enregistrement impair : Message d'erreur de pointage
                            CurrentDb.Execute "INSERT INTO ERREUR_POINTAGE ([IDsalarie], [date], [Motif]) Values(" & RstPersonne!code & ",  #" & vardate & "#, ""Un nombre d'entrées/sorties impairs"" )"
                            'Exit Sub
                        End If
     
     
             Select Case RstPointage.RecordCount
     
                Case 2
     
                For i = 1 To 1
     
                RstPointage.MoveLast
                HeureFin = RstPointage!poin_heure
                MinuteFin = RstPointage!Poin_minute
     
                HeureHM = HeureFin & ":" & MinuteFin
     
                'Traitement du cas où le salarié quitte l'entreprise avant 17h30
                If HeureFin <= "1730" Then
                    'Vérification d'une absence justifiée
                    req = "SELECT EST_ABSENT.DateAbsence, Motif, IDsalarie, EST_ABSENT.IDSalarie FROM EST_ABSENT WHERE EST_ABSENT.DateAbsence= #" & vardate & "# AND EST_ABSENT.IDsalarie = '" & RstPersonne!code & "' "
                    Set RstAbsence = Bds.OpenRecordset(req)
     
                    If RstAbsence.RecordCount > 0 Then
                        mes = MsgBox("Le salarié " & LstSalarie.Column(1) & " s'est absenté en date du " & vardate & " pour le motif suivant : " & RstAbsence!Motif & ".", vbInformation, "RH")
                    Else
                        mes = MsgBox("Le salarié " & LstSalarie.Column(1) & " ne dispose d'aucune absence justifiée !", vbCritical, "RH")
                    End If
                    CurrentDb.Execute "INSERT INTO ERREUR_POINTAGE ([IDsalarie], [date], [Motif]) Values(" & RstPersonne!code & ",  #" & vardate & "#, ""Sortie précédant l'heure de sortie (17H30)"" )"
                Else
                    Absence = 0
                    Pausedej = 0
     
                End If
     
                Next i
     
                Case 4
     
     
                   For i = 1 To 1
     
                      RstPointage.Move (1)
                      HeureDeb = RstPointage!poin_heure
                      MinuteDeb = RstPointage!Poin_minute
                      HeureHMDeb = HeureDeb & ":" & MinuteDeb
                      MsgBox (HeureHMDeb)
     
                      RstPointage.MoveNext
     
                      'RstPointage.MoveFirst
     
                      HeureFin = RstPointage!poin_heure
                      MinuteFin = RstPointage!Poin_minute
                      HeureHMFin = HeureFin & ":" & MinuteFin
                      MsgBox (HeureHMFin)
                      RstPointage.MoveNext
     
                      If HeureHMDeb >= "12" And HeureHMFin <= "14" Then
     
                      'If HeureHMDeb >= "1200" And HeureHMDeb <= "1400" And HeureHMFin >= "1200" And HeureHMFin <= "1500" Then 'Assembler HH:MM
                       '  Absence = 0
     
                       'Calcul de l'heure de dej
                        HeureHMFin = TimeSerial(HeureFin, MinuteFin, 0)
                        HeureHMDeb = TimeSerial(HeureDeb, MinuteDeb, 0)
     
                        'Calcul de la tranche horaire Pause Dejeuner
                        var1 = (HeureHMFin - HeureHMDeb) * 24
                        EntPausedej = Int(var1)
                        PartDecim = (var1 - EntPausedej) * 60
     
                        'Affichage de la durée de pause déjeuner
                        Pausedej = TimeSerial(EntPausedej, PartDecim, O)
                        TxtDureePause = Pausedej
                      Else
                        mes = MsgBox("La pause déjeuner n'a pas été prise dans le créneau horaire. Pour plus de détails, vérifiez les enregistrements de pointage", vbInformation, "RH")
     
                      End If
     
                Next i
     
     
     
                Case 6
     
                    While test <> "OK" And RstPointage.EOF = False
                   'For i = 1 To 5
     
                      RstPointage.Move (1)
                      HeureDeb = RstPointage!poin_heure
                      MinuteDeb = RstPointage!Poin_minute
                      HeureHMDeb = HeureDeb & ":" & MinuteDeb
                      MsgBox (HeureHMDeb)
     
                      RstPointage.MoveNext
     
                      'RstPointage.MoveFirst
     
                      HeureFin = RstPointage!poin_heure
                      MinuteFin = RstPointage!Poin_minute
                      HeureHMFin = HeureFin & ":" & MinuteFin
                      MsgBox (HeureHMFin)
                      RstPointage.MoveNext
     
                      If HeureHMDeb >= "12" And HeureHMFin <= "14" Then
     
                      'If HeureHMDeb >= "1200" And HeureHMDeb <= "1400" And HeureHMFin >= "1200" And HeureHMFin <= "1500" Then 'Assembler HH:MM
                       '  Absence = 0
                        test = "OK"
                       'Calcul de l'heure de dej
                        HeureHMFin = TimeSerial(HeureFin, MinuteFin, 0)
                        HeureHMDeb = TimeSerial(HeureDeb, MinuteDeb, 0)
     
                        'Calcul de la tranche horaire Pause Dejeuner
                        var1 = (HeureHMFin - HeureHMDeb) * 24
                        EntPausedej = Int(var1)
                        PartDecim = (var1 - EntPausedej) * 60
     
                        'Affichage de la durée de pause déjeuner
                        Pausedej = TimeSerial(EntPausedej, PartDecim, O)
                        TxtDureePause = Pausedej
                      Else
                        mes = MsgBox("La pause déjeuner n'a pas été prise dans le créneau horaire. Pour plus de détails, vérifiez les enregistrements de pointage", vbInformation, "RH")
                        i = i + 1
                      End If
     
     
                Wend
                    req = "SELECT EST_ABSENT.DateAbsence, Motif, IDsalarie, EST_ABSENT.IDSalarie FROM EST_ABSENT WHERE EST_ABSENT.DateAbsence= #" & vardate & "# AND EST_ABSENT.IDsalarie = '" & RstPersonne!code & "' "
                    'MsgBox (RstPersonne!code)
                    Set RstAbsence = Bds.OpenRecordset(req)
     
                    If RstAbsence.RecordCount > 0 Then 'Le salarié a une absence justifiée ?
                        mes = MsgBox("Le salarié " & LstSalarie.Column(1) & " est absenté en date du " & vardate & " pour le motif suivant : " & RstAbsence!Motif & ".", vbInformation, "RH")
                    Else
                        mes = MsgBox("Le salarié " & LstSalarie.Column(1) & " ne dispose d'aucune absence justifiée !", vbCritical, "RH")
                    End If
     
                End Select
          Else
            MsgBox ("Aucun enregistrement réalisé...")
          End If
     
    RstPersonne.MoveNext
     
       Wend
     
    End If
     
    Set RstPointage = Nothing
    Set RstPersonne = Nothing
    Set RstAbsence = Nothing
    End Sub
    Est-il possible au lieu d'avoir une date, d'alimenter le code avec 2 dates pour décrire une période ...

    La finalité, c'est d'avoir un traitement pour une durée donnée. Ex. Entre le 03/10/2005 et le 10/10/2005.

    Thanks

    Dés que ce projet de Gestion de présence est terminé, je compte le faire partager à tous les membres du forum... avec bien évidemment, toutes les règles de gestion qui s'y appliquent

Discussions similaires

  1. [WebI Xi] Créer des rapports pour dates différentes pour une même requête
    Par MorningMemories dans le forum Débuter
    Réponses: 2
    Dernier message: 22/03/2012, 16h59
  2. Réponses: 2
    Dernier message: 31/01/2009, 20h49
  3. [Oracle] Différence de résulats sur une même requête
    Par bakaneko dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/04/2008, 16h07
  4. [Requête] plusieurs champs dans une même table ayants la même source
    Par Christophe93250 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/04/2006, 16h18
  5. Différences de temps d'exécution d'une même requête
    Par hellbilly dans le forum Access
    Réponses: 3
    Dernier message: 16/12/2005, 20h56

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