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

Requêtes et SQL. Discussion :

calcul durée de prestation


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut calcul durée de prestation
    bonjour,

    j'aimerais, uniquement pour chaque personne encore présente, calculer sa durée de présence depuis sa 1ère arrivée.
    Ex :
    - toto est arrivé le 2/1/17 dans l'équipe A
    - puis il est allé dans l'équipe B le 2/1/19
    - et il y est tjs
    --> durée = 32 mois de présence aujourd'hui

    Nom : R_effectifs-durée.JPG
Affichages : 732
Taille : 83,6 Ko

    Donc :
    - pour chaque personne, j'ai un ou plusieurs enregistrements dans la tbl T_prestation avec "date_début_prestation" tjs renseignée et "date_fin_prestation" qui peut être vide.
    - il ne faut prendre en compte que les personnes qui ont un enregistrement avec une date_fin_prestation = Null (si elle n'en a pas, c'est qu'elle n'est plus présente)
    - je sais théoriquement rechercher "date_début_prestation = Min" avec les regroupements

    MAIS :
    - si je mets comme critère "date_fin_prestation Est Null" dans le QBE, alors je ne récupère que les enregistrements où date_fin_prestation est vide, je perds le Min,
    - inversement, si je mets (comme sur la capture d'écran) "date_début_prestation = Min", là, j'ai l'impression que cela ne change rien, j'ai le même résultat que sans - en fait, dès que j'ajoute une colonne après mon regroupement (ex : nom société) alors j'ai autant de lignes que de sociétés...
    ???

    D'avance merci pour vos explications et votre aide !

    bien cordt

  2. #2
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 284
    Points : 284
    Points
    284
    Par défaut
    Bonjour weyb06

    le NOM avec Regroupement, et la DUREE = (dateFin-dateDebut) avec Somme.

  3. #3
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 274
    Points : 6 583
    Points
    6 583
    Par défaut
    Salut
    A tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CUID_Prestation, Date_Début_Prestation, Date_Fin_Prestation, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS duree
    FROM T_Prestation
    GROUP BY CUID_Prestation, Date_Début_Prestation, Date_Fin_Prestation, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation])));

  4. #4
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    bonjour,

    @Tortille :
    vous me suggérez de créer un champ durée dans le QBE c'est ça ?
    mais que vaut ce calcul qd dateFin est vide ???

    @Hyperion13 :
    j'ai fait un copier/coller de votre requête dans le QBE, et je l'ai un peu adaptée en remplaçant le CUID par le nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_Personne.Nom_Personne, T_Prestation.Date_Début_Prestation, T_Prestation.Date_Fin_Prestation, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS duree
    FROM T_Personne INNER JOIN T_Prestation ON T_Personne.CUID_Personne = T_Prestation.CUID_Prestation
    GROUP BY T_Personne.Nom_Personne, T_Prestation.Date_Début_Prestation, T_Prestation.Date_Fin_Prestation, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation])));
    mais cela ne donne pas le résultat escompté :
    Nom : R_effectifs-durée2.JPG
Affichages : 585
Taille : 58,1 Ko

    c'est comme si les IIF ne marchaient pas...

    Rappel sur ce que je souhaite :
    - Aissaoui ne devrait pas apparaître (ni Akougna...)
    - Alessandria devrait avoir 1 ligne avec date de début = 31/7/2017 et date fin= vide

    bien cordt

  5. #5
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 274
    Points : 6 583
    Points
    6 583
    Par défaut
    Alors on reprend
    Soit la 1ère req
    reqDuree
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID_Prestation, CUID_Prestation, Date_Début_Prestation, Date_Fin_Prestation, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS duree
    FROM T_Prestation
    GROUP BY ID_Prestation, CUID_Prestation, Date_Début_Prestation, Date_Fin_Prestation, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation])));
    Soit la 2ème req
    reqDuree1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID_Prestation, CUID_Prestation, Date_Début_Prestation, Date_Fin_Prestation, duree AS duree_encours, CDbl(DSum("duree","reqDuree","ID_Prestation <= " & [ID_Prestation])) AS duree_totale
    FROM reqDuree
    WHERE Date_Fin_Prestation Is Null;
    Images attachées Images attachées   

  6. #6
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 284
    Points : 284
    Points
    284
    Par défaut
    Bonjour weyb06

    DateFin, Critères : Est Pas Null

  7. #7
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    @Tortille :
    désolé mais Hyperion13 ayant répondu avant, j'ai implémenté sa solution en 1er - merci qd meme !

    @Hyperion13 :
    ca a l'air de fonctionner !!! MERCI !
    je dis "a l'air" car :
    - j'ai bien un regroupement par personne
    - avec une date de fin vide
    - j'ai adapté pour avoir "nom prénom" par ordre croissant
    - et aussi pour ne pas prendre ceux qui vont arriver

    MAIS :
    toutes les "duree_totale" sont énormes :
    Nom : R_effectifs-durée3.JPG
Affichages : 560
Taille : 30,8 Ko

    ???

    EDIT :
    il y a un truc avec duree_totale :
    - résultat de req_duree :
    Nom : R_effectifs-durée4.JPG
Affichages : 554
Taille : 26,5 Ko

    --> BJJT6201 n'a qu'1 prestation

    - résultat de R_PrestationLongueDuree (= req_duree1) :
    Nom : R_effectifs-durée5.JPG
Affichages : 549
Taille : 27,6 Ko

    --> duree_totale est incorrecte...

    je ne sais pas s'il faut faire la somme des durées pour les id_prestation <= id_prestation, car il peut - pour un même CUID - y avoir des id plus petits pour des prestations postérieures (elles n'ont pas forcément été ajoutées dans l'ordre chrono à la création de la tbl)
    du coup, je me demande si cette somme n'intègre pas toutes les prestations antérieures, qqsoit le CUID, non ?

    est-ce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID_Prestation, CUID_Prestation, Date_Début_Prestation, Date_Fin_Prestation, duree AS duree_encours, CDbl(DSum("duree","reqDuree","CUID_Prestation = " & [CUID_Prestation])) AS duree_totale
    FROM reqDuree
    WHERE Date_Fin_Prestation Is Null;
    ne serait pas mieux ?
    --> non ca me donne "#erreur"

    je suis revenu sur la requête de départ, j'obtiens :
    Nom : R_effectifs-durée6.JPG
Affichages : 548
Taille : 18,2 Ko
    et ensuite :
    Nom : R_effectifs-durée7.JPG
Affichages : 547
Taille : 14,9 Ko

    --> je pense que le fait que les 2 prestations 1154 et 1052 ne soient pas classées dans l'ordre demandé dans la 1ere requête donne un résultat incorrect sur la 2e requête, alors que j'ai bien dans le SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...ORDER BY T_Prestation.CUID_Prestation, T_Prestation.Date_Début_Prestation;

    cordt

  8. #8
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 284
    Points : 284
    Points
    284
    Par défaut
    Bonjour,
    Tu ne dois pas mettre la dateFin dans la requête.

  9. #9
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    bonjour,

    je pense avoir trouvé :
    - 1ère req ReqDateCompleted :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [T_Personne].[Nom_Personne] & " " & [T_Personne].[Prénom_Personne] AS [Nom Prenom], CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation])) AS date_completed, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS duree, T_Prestation.Date_Début_Prestation
    FROM T_Personne INNER JOIN T_Prestation ON T_Personne.CUID_Personne = T_Prestation.CUID_Prestation
    WHERE ((([T_Personne].[Nom_Personne] & " " & [T_Personne].[Prénom_Personne]) Not Like "*attente*") AND ((T_Prestation.Statut_Personne)="externe") AND ((T_Prestation.Date_Début_Prestation)<Date()))
    ORDER BY [T_Personne].[Nom_Personne] & " " & [T_Personne].[Prénom_Personne];

    - 2e req ReqDateMax
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ReqDateCompleted.[Nom Prenom], Min(ReqDateCompleted.Date_Début_Prestation) AS MinDeDate_Début_Prestation, Sum(ReqDateCompleted.duree) AS SommeDeduree
    FROM ReqDateCompleted
    GROUP BY ReqDateCompleted.[Nom Prenom]
    HAVING (((Max(ReqDateCompleted.date_completed))=Date()))
    ORDER BY ReqDateCompleted.[Nom Prenom];

    j'obtiens :
    Nom : R_effectifs-durée8.JPG
Affichages : 553
Taille : 55,7 Ko

    je liste les prestations sur les externes uniquement ayant une date de début antérieure à la date du jour, je crée date_completed = vraie date de départ ou la date du jour si c'est vide, et je calcule chaque duree

    et ensuite :
    Nom : R_effectifs-durée9.JPG
Affichages : 540
Taille : 29,2 Ko
    je fais un regroupement sur le nom, j'affiche la date d'entrée la + ancienne, je cherche la date de départ date_completed maxi et je filtre celle-ci sur la date du jour, et je fais la somme sur duree

    Merci à vous pour vos apports respectifs !

    cordt

  10. #10
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 274
    Points : 6 583
    Points
    6 583
    Par défaut
    Salut
    Cartésien je suis, cartésien je reste.
    Je me suis basé sur ton hypothèse Post#1 avec toto qui a rejoint à une date D0 l'équipe A, pour ensuite la quitter à une date D1 et rejoindre l'équipe B à une date D2, équipe dans laquelle il se trouve toujours aujourd'hui.
    L'img1 de mon post#5 reproduit cette hypothèse
    Toto (CUID_Prestation = 1) a cumulé depuis sa toute première arrivée 32 (24+8) mois de présence dans la société
    Si j'ai bien compris tu veux afficher les CUID_Prestation depuis leur toute première arrivée (Date_Début_Prestation) dans la société, qui ont une autre prestation en cours et dont Date_Fin_Prestation est forcément vide.
    reqDuree
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID_Prestation, CUID_Prestation, Date_Début_Prestation, Date_Fin_Prestation, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS duree_m, DateDiff("d",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS duree_j
    FROM T_Prestation
    GROUP BY ID_Prestation, CUID_Prestation, Date_Début_Prestation, Date_Fin_Prestation, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))), DateDiff("d",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation])));
    reqDuree1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID_Prestation, CUID_Prestation, CDate(DFirst("Date_Début_Prestation","reqDuree","CUID_Prestation = " & [CUID_Prestation])) AS Date_1ere_Prestation, Date_Début_Prestation AS Date_Debut_Presta_Encours, Date_Fin_Prestation, duree_m AS duree_m_encours, CDbl(DSum("duree_m","reqDuree","ID_Prestation <= " & [ID_Prestation])) AS duree_m_totale, duree_j AS duree_j_encours, CDbl(DSum("duree_j","reqDuree","CUID_Prestation = " & [CUID_Prestation])) AS duree_j_totale
    FROM reqDuree
    WHERE Date_Fin_Prestation Is Null;
    Pour ce qui est des durées totales que tu obtiens, à mon avis il manque des critères pour affecter les bonnes valeurs à chacun des CUID_Prestation.
    duree_m exprime le cumul en nombre de mois par ID_Prestation et duree_j en nombre de jours.
    Images attachées Images attachées   

  11. #11
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    bonjour,

    je reviens après plusieurs mois d'arrêt maladie, je reprends ce sujet - qui fonctionne - car j'ai un besoin complémentaire :
    en effet, on a besoin de savoir si le prestataire est parti pour une longue période à un moment donné. Ex :
    Nom : access-figiuzzi-prestations.JPG
Affichages : 509
Taille : 27,3 Ko
    --> on voit que le prestataire a fait 3 prestations qui se sont suivies, et une dernière après une longue absence d'environ 21 mois (délai de carence).
    donc je voudrais calculer l'écart entre chaque prestation (avant de calculer la durée totale).

    --> comment faire pour comparer des dates entre 2 enregistrements ???

    d'avance merci pour vos retours,

    bien cordt

  12. #12
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 274
    Points : 6 583
    Points
    6 583
    Par défaut
    Salut
    Créer la req suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CUID_Prestation, Max(Date_Début_Prestation) AS DatedebNouvellePresta, Max(Date_Fin_Prestation) AS DatefinDernierePresta, IIf(Month([DatefinDernierePresta])=Month([DatedebNouvellePresta]),DateDiff("m",[DatefinDernierePresta],[DatedebNouvellePresta]),DateDiff("m",[DatefinDernierePresta],[DatedebNouvellePresta])-1) AS Delais
    FROM T_Prestation
    GROUP BY CUID_Prestation;

  13. #13
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    Bonsoir,

    je ne sais pas pourquoi mais je n'ai aps reçu le mail m'informant d'une réponse, alors je découvre votre réponse qu'aujourd'hui !
    Merci bcp !!!
    je regarde ça et je vous dirai !

    EDIT :
    merci Hyperion13 mais ce n’est pas exactement ce que je souhaitais obtenir :
    vous me proposez de calculer l'écart entre les avant-dernière et dernière prestations (via le calcul du max), or je souhaitais avoir l’écart entre chaque prestation

    NOTA :
    En effet, au final, la règle que je dois appliquer est :
    "carence = 30% durée (en mois ; je ne l'ai pas encore, mais c'est facile à ajouter dans une table)
    si l'écart entre chaque prestation est < carence, je cumule les durées de prestation d'un côté, et les carences de l'autre (sinon je ne fais rien)"


    --> d'où ma question d'origine "comment calculer l'écart entre 2 prestations c-a-d 2 enregistrement s différents ?"

    EDIT2 : (27/8/20)
    en m'inspirant d'une solution trouvée sur ce forum, j'ai écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Prestation_1.CUID_Prestation AS CUID_Prestation, T_Personne.Nom_Personne, T_Personne.Prénom_Personne, T_Prestation_1.Date_Début_Prestation AS Date_Début_Prestation, [T_Prestation_1]![Date_Début_Prestation]-[T_Prestation]![Date_Fin_Prestation] AS Ecart
    FROM T_Prestation AS T_Prestation_1, T_Personne INNER JOIN T_Prestation ON T_Personne.CUID_Personne = T_Prestation.CUID_Prestation
    WHERE (((T_Prestation.CUID_Prestation)=[T_Prestation_1]![CUID_Prestation]))
    ORDER BY T_Personne.Nom_Personne;
    mais ca donne des résultats bizarres

    --> En effet, si on considère les infos ci-dessous issues de la tbl T_Prestation :

    CUID / ... /Date_Début_Prestation / Date_Fin_Prestation
    Nom : CaptureEcart1.JPG
Affichages : 468
Taille : 13,4 Ko

    on voit que Armand a 4j d'écart entre sa 1ere et sa 2e prestation

    suite à ma requête ci-dessus, j'obtiens :
    CUID / Prénom / Date_Début_Prestation / Ecart
    Nom : CaptureEcart2.JPG
Affichages : 457
Taille : 16,9 Ko

    j'ai 4 lignes au lieu de 2, et on voit que les 2 prestations sont répétées
    et de ce que je comprends, les 2 dernieres sont correctes

    Où est mon erreur svp ?

    cordt
    Images attachées Images attachées   

  14. #14
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    bonjour,

    un petit "up" (je ne sais pas si mon sujet se retrouve relégué au fin fond du forum ou pas...)

    je me suis inspiré de ceci sur ce forum, mais là maintenant, je bloque...

    cordt

  15. #15
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 274
    Points : 6 583
    Points
    6 583
    Par défaut
    Salut
    Je n'ai peut-être pas compris la problématique posée du Post#11
    On pourrait partir sur l'idée d'une req UNION pour regrouper DatedebPresta et DatefinPresta dans un seul champ, comme ce qui suit:
    reqDuree
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ID_Prestation, CUID_Prestation, Date_Début_Prestation AS DatePresta
    FROM T_Prestation
    UNION
    SELECT ID_Prestation, CUID_Prestation, Date_Fin_Prestation AS DatePresta
    FROM T_Prestation
    WHERE Date_Fin_Prestation Is Not Null
    De reprendre le résultat de reqDuree pour calculer le temps d'une presta et le temps entre la fin d'une presta et le début de la presta suivante
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  T1.ID_Prestation, 
            T1.CUID_Prestation, 
            T1.DatePresta, 
            MIN(T2.DatePresta) AS DateSuivante, 
            DateDiff("d", T1.DatePresta, MIN(T2.DatePresta)) AS Ecartdate
    FROM    reqDuree T1
            LEFT JOIN reqDuree T2
                ON T1.CUID_Prestation = T2.CUID_Prestation
                AND T2.DatePresta > T1.DatePresta
    GROUP BY T1.CUID_Prestation, T1.DatePresta, T1.ID_Prestation
    Copier les codes en mode d'affichage SQL

  16. #16
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    bjr,

    oui je n'avais pas donné tout le contexte dans le post #11 - excusez-moi

    le contexte complet est celui-ci :
    - on doit calculer la durée de prestation (d'un prestataire) pour en déduire la carence (30% de la durée)
    - si 2 prestations s'enchainent (à qq jours près, ex : il quitte le vendredi et recommence une autre le lundi --> en gros, si la durée entre les 2 prestations est < à la carence), on considère qu'il n'est pas parti, donc il faut cumuler avec la durée précédente
    - si par contre l'absence est >= la carence, alors on repart à zéro pour le calcul de la durée totale de prestation


    je vais tester votre solution DQP ! Merci !

    cordt

  17. #17
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    bonsoir,

    je n'ai pas eu le temps de tester, j'ai essayé d'abord de "déchiffrer" mais je ne comprends pas du tout - étonnant...

    J'ai cependant qq questions :
    - je dois créer 2 requêtes différentes (qui donnent des tableaux différents) ?
    - que sont T1 et T2 ?

    bien cordt

  18. #18
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 274
    Points : 6 583
    Points
    6 583
    Par défaut
    Re,
    On reprend le postulat
    Pour un même prestataire (CUID_presta) tu as besoin de connaitre le nombre jours écoulés entre la date_deb_presta et la date_fin_presta d'une prestation et de connaitre également le délai qui court entre la date_fin_presta de la prestation précédente et la date_deb_presta de la nouvelle prestation.
    (img1 = T_Prestation, img2 = req UNION (qry01_datepresta), img3 = req imbriquée (qry02_datepresta))
    - qry01_datepresta permet de regrouper dans un seul champ tout à la fois date_deb_presta et date_fin_presta
    - qry02_datepresta est une req imbriquée qui permet de calculer les délais d'une prestation et entre 2 prestations pour un même CUID_presta. T1 et T2 sont des alias.
    Images attachées Images attachées    

  19. #19
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    bjr,

    alors j'ai implémenté - en adaptant avec les bons noms de table ("reqDuree" --> "qry02_datepresta") et ok, ça marche comme vous !

    mais ce n'est pas encore exploitable à mon niveau , il faut que j'aille plus loin...
    et dans cette réalisation, je tâtonne...

    ...car j'ai besoin d'avoir une table finale avec :
    - nom prénom,
    - date début "de présence dans notre société" = date début de la 1ère prestation indépendante
    - date fin "de présence dans notre société" = date du jour ou "date fin dernière prestation" ("dernière" ie. de l'ensemble des prestations qui s'enchainent, c-a-d qui ont un "écart" < 1 mois)
    - durée totale (mois ou jours)
    - carence (mois ou jours) = 30% x durée
    - date retour possible = date fin "de présence dans notre société" + carence

    de ce que je comprends, votre méthode permet de dédoubler une prestation en 2 enregistrements - ce qui permet de calculer l'écart ! Merci !

    et pour mon besoin final, je dois plutôt concaténer plusieurs prestations en 1 seule pour avoir sa durée totale (cf. table décrite ci-dessus)...
    les fonctions Min et Max semblent à première vue pertinentes - sauf que si on a écart > 1 mois pour un même prestataire, alors il ne faut plus ajouter la durée de la prestation suivante aux précédentes, car on repart à 0, on considère que c'est un nouvel ensemble de prestations qui commence.

    Ex : si on reprend mon exemple du post #11,
    Nom : access-figiuzzi-prestations.JPG
Affichages : 434
Taille : 27,3 Ko

    il me faudrait au final n'avoir plus que 2 lignes avec, pour les 6 champs décrits ci-dessus, les valeurs :
    - <nom> ou <CUID>, 08/09/2008, 29/06/2018, 1193 (jours), 358, 23/06/2019
    - <nom> ou <CUID>, 16/03/2020, 07/09/2020, 175, 58, 04/11/2020 (ici, il n'y a qu'une prestation indépendante des précédentes, mais il pourrait y en avoir plusieurs également)

    voici ce que j'imagine :
    pour un même prestataire :
    - ajouter un champ "N° de groupe de prestations"
    - le mettre à "1" tant que écart < 1 mois
    - incrémenter de 1 si écart >= 1 mois

    ... mais je ne sais pas si c'est une bonne idée - ni comment la réaliser...

    NOTA : j'ai essayé d'avancer tout seul et d'adapter votre requête "qry02_datepresta" pour y avoir le nom plutôt que le CUID et... bin non, ça n'a pas marché
    mais on verra ça plus tard...

    voici le code à tout hasard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Prestation.ID_Prestation, [T_Personne].[Nom_Personne] & " " & [T_Personne].[Prénom_Personne] AS [Nom Prenom], T_Prestation.Date_Début_Prestation, CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation])) AS date_completed, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS duree, [duree]/3 AS Carence, DateDiff("d",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS DureeJours, [DureeJours]/3 AS CarenceJours, Format(IIf(IsNull([T_Prestation].[Date_Fin_Prestation]),DateAdd("d",Date(),[CarenceJours]),""),"dd/mm/yyyy") AS DateRetour, qry02_datepresta.Ecartdate
    FROM qry02_datepresta, T_Personne INNER JOIN T_Prestation ON T_Personne.CUID_Personne = T_Prestation.CUID_Prestation
    WHERE (((T_Personne.Nom_Personne & " " & T_Personne.Prénom_Personne) Not Like "*attente*") And ((T_Prestation.Date_Début_Prestation)<Date()) And ((T_Prestation.Statut_Personne)="externe") And ((qry02_datepresta.ID_Prestation)=[ T_Prestation].ID_Prestation) And ((qry02_datepresta.DatePresta)=T_Prestation.Date_Fin_Prestation))
    ORDER BY [T_Personne].[Nom_Personne] & " " & [T_Personne].[Prénom_Personne], T_Prestation.Date_Début_Prestation;
    et qd j'essaie de l'exécuter, j'ai une pop-up :
    Nom : Capture_qry03.JPG
Affichages : 421
Taille : 64,7 Ko

    bref, "la - zone" comme disait Coluche...

    d'avance merci pour votre aide !

    cordt

  20. #20
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 274
    Points : 6 583
    Points
    6 583
    Par défaut
    Si vous voulez lire nom, renom du prestataire, il faut traiter le problème à la source.
    reqDuree - req UNION
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ID_Prestation, CUID_Prestation, [Nom_Personne] & " " & [Prénom_Personne] AS Prestataire, Date_Début_Prestation AS DatePresta
    FROM T_Personne INNER JOIN T_Prestation ON T_Personne.CUID_Personne = T_Prestation.CUID_Prestation
    UNION
    SELECT ID_Prestation, CUID_Prestation, [Nom_Personne] & " " & [Prénom_Personne] AS Prestataire, Date_Fin_Prestation AS DatePresta
    FROM T_Personne INNER JOIN T_Prestation ON T_Personne.CUID_Personne = T_Prestation.CUID_Prestation
    WHERE Date_Fin_Prestation Is Not Null

    Pour calculer le délai en mois, mois complet, il faut copier la fonction Months ici dans un module standard pour l'utiliser dans reqDuree1
    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
    Public Function Months( _
        ByVal datDate1 As Date, _
        ByVal datDate2 As Date, _
        Optional ByVal booLinear As Boolean) _
        As Integer
     
    ' Returns the difference in full months between datDate1 and datDate2.
    ' https://stackoverflow.com/questions/52994796/calculate-full-months-between-two-dates-in-ms-access-query
    ' Calculates correctly for:
    '   negative differences
    '   leap years
    '   dates of 29. February
    '   date/time values with embedded time values
    '   negative date/time values (prior to 1899-12-29)
    '
    ' Optionally returns negative counts rounded down to provide a
    ' linear sequence of month counts.
    ' For a given datDate1, if datDate2 is decreased stepwise one month from
    ' returning a positive count to returning a negative count, one or two
    ' occurrences of count zero will be returned.
    ' If booLinear is False, the sequence will be:
    '   3, 2, 1, 0,  0, -1, -2
    ' If booLinear is True, the sequence will be:
    '   3, 2, 1, 0, -1, -2, -3
    '
    ' If booLinear is False, reversing datDate1 and datDate2 will return
    ' results of same absolute Value, only the sign will change.
    ' This behaviour mimics that of Fix().
    ' If booLinear is True, reversing datDate1 and datDate2 will return
    ' results where the negative count is offset by -1.
    ' This behaviour mimics that of Int().
     
    ' DateAdd() is used for check for month end of February as it correctly
    ' returns Feb. 28. when adding a count of months to dates of Feb. 29.
    ' when the resulting year is a common year.
    '
    ' 2010-03-30. Cactus Data ApS, CPH.
     
    Dim intDiff   As Integer
    Dim intSign   As Integer
    Dim intMonths As Integer
     
    ' Find difference in calendar months.
    intMonths = DateDiff("m", datDate1, datDate2)
    ' For positive resp. negative intervals, check if the second date
    ' falls before, on, or after the crossing date for a 1 month period
    ' while at the same time correcting for February 29. of leap years.
    If DateDiff("d", datDate1, datDate2) > 0 Then
        intSign = Sgn(DateDiff("d", DateAdd("m", intMonths, datDate1), datDate2))
        intDiff = Abs(intSign < 0)
    Else
        intSign = Sgn(DateDiff("d", DateAdd("m", -intMonths, datDate2), datDate1))
        If intSign <> 0 Then
            ' Offset negative count of months to continuous sequence if requested.
            intDiff = Abs(booLinear)
        End If
        intDiff = intDiff - Abs(intSign < 0)
    End If
     
      ' Return count of months as count of full 1 month periods.
        Months = intMonths - intDiff
    End Function
    reqDuree1 - calcul duree d'une prestation, delai entre 2 prestations en nb jours et nb mois complets
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  T1.ID_Prestation, 
            T1.CUID_Prestation,
            T1.Prestataire,
            T1.DatePresta, 
            Min(T2.DatePresta) AS DateSuivante, 
            DateDiff("d", T1.DatePresta, Min(T2.DatePresta)) AS EcartEnJrs,
            IIf(Min(T2.DatePresta) Is Null,0,Months(T1.DatePresta,Min(T2.DatePresta))) AS EcartEnMois
    FROM    reqDuree T1
            LEFT JOIN reqDuree T2
                ON T1.CUID_Prestation = T2.CUID_Prestation
                AND T2.DatePresta > T1.DatePresta
    GROUP BY T1.CUID_Prestation, T1.Prestataire, T1.DatePresta, T1.ID_Prestation
    reqDuree2 - calcul duree total d'un prestataire en nb jours et nb mois complets
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CUID_Prestation, Prestataire, Min(DatePresta) AS PremPresta, Max(DateSuivante) AS DernPresta, Sum(EcartEnJrs) AS TotEcartEnJrs, Sum(EcartEnMois) AS TotEcartEnMois
    FROM reqDuree1
    GROUP BY CUID_Prestation, Prestataire

Discussions similaires

  1. calcul durée requête
    Par sergoid dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 19/02/2007, 17h17
  2. Calcul durée hors sam dim
    Par fab dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/01/2007, 23h28
  3. [SQL Server] Calcul durée entre 2 dates sans les dimanches
    Par sarahsonia dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/04/2006, 18h59
  4. calcul durée sur access
    Par juliette2 dans le forum Access
    Réponses: 2
    Dernier message: 23/11/2005, 14h56
  5. Calcul durée + Date : Erreur !
    Par priest69 dans le forum Access
    Réponses: 6
    Dernier message: 28/10/2005, 16h56

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