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 :

Convertir nombre en années/mois/jours ou additionner des années/mois/jours [AC-2016]


Sujet :

Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Avril 2015
    Messages : 66
    Points : 10
    Points
    10
    Par défaut Convertir nombre en années/mois/jours ou additionner des années/mois/jours
    Bonjour

    Je sollicite votre aide pour finaliser quelque chose que j'essaie de mettre en place

    Contexte:


    Pour vulgariser imaginer une boite d’intérim avec plusieurs salariés et je doit établir une nouvelle méthode de calcul de leur ancienneté qui va être l'addition de leur jour de chaque contrat qui sera ensuite convertie en Année/Mois et jours.

    Exemple:


    Travailleur A à un contrat 1 qui va du 01/01/2017 au 11/01/2017 cela fait 10 jours pour l'ancienneté ( il n y a pas de notion de jours ouvrés ou travaillés effectifs), je dois ensuite additionner le nombre de jour pour obtenir le total de tous ces contrats et enfin le convertir

    J'ai réussi avec DiffDate("j";[Datedébut];[Datefin]) à obtenir le nombre de jour par contrat et avec une requête de regroupement obtenir le total pour chaque travailleur mais je n arrive pas à convertir ce dernier chiffre en Année/Mois/jours

    j'ai essayé d'une autre manière d'obtenir pour chaque contrat avec SplitDiffDate([Datedébut];[Datefin]) (trouver sur le forum) un résultat sous forme Année/Mois/jours mais je ne peut pas faire de d'addition/regroupement avec ces valeurs

    Je ne suis pas un pro et je sais que je passe à coté de quelque chose je vais continuer mes recherches si une personne vois la solution qu'elle n'hésite pas

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 394
    Points : 19 816
    Points
    19 816
    Billets dans le blog
    66
    Par défaut
    Bonjour,

    Ça revient il me semble a calculer des ages en années, mois, jours pour les contrats .

    Une discution sur ce sujet :

    https://www.developpez.net/forums/d1...n-jour-sommes/

    CDLT,

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Avril 2015
    Messages : 66
    Points : 10
    Points
    10
    Par défaut
    Ce n'est pas tout à faire cela

    Avec mes deux façons de faire pour le moment j’obtiens soit :

    - Un nombre exemple 4329 jours de missions intérim que je dois convertir en Année/Mois/Jours et là je bloque pour le moment

    - La durée de chaque contrat déjà convertie exemple pour un contrat de 338 jour il sera afficher comme ceci: 0 ans 11 mois 3 jours, mais je dois ensuite additionner les valeurs sous cette forme

    0 ans 11 mois 3 jours + 2 ans 03 mois 3 jours + 0 ans 0 mois 20 jours et c'est là que je bloque

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 394
    Points : 19 816
    Points
    19 816
    Billets dans le blog
    66
    Par défaut
    Donc, vous prenez un nombre de jours par mois arbitraire, disons 30, et des année de 365.25 jours...avec quelque chose comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Annees =Int (TotalJours / 365.25)
     
    TotalJours =(TotalJours - Annees * 365.25)  ' reste des jours après avoir éliminé les années
     
    Mois =Int( TotalJours  / 30) 
     
    Jours =Int(TotalJours - Mois * 30)
    Cdlt,

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Avril 2015
    Messages : 66
    Points : 10
    Points
    10
    Par défaut
    Il faut donc créer une fonction avec tout cela ? Car je ne suis pas encore à ce niveau de pratique dans Access

    EDIT :

    J'ai trouver ce code dans un autre message, mais quand je le colle dans un module les ligne concernant Dim avec le DateTime sont en rouges, j'imagine qu il a une option à activer

    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
     
        Public Function DateDiffAnneeMoisJour(Nbjour As Integer) As Integer()
     
     
            Dim dateFin As DateTime = Now
            Dim dateDebut As DateTime = Now.AddDays(-Nbjour)
     
            Dim year As Integer = dateFin.Year - dateDebut.Year
            Dim month As Integer = dateFin.Month - dateDebut.Month
            Dim day As Integer = dateFin.Day - dateDebut.Day
     
            If month < 0 Then
                year = year - 1
                month = month + 12
            End If
     
            If day < 0 Then
                month = month - 1
                day = day + DateTime.DaysInMonth(dateDebut.year, dateDebut.month)
            End If
     
            Return {year, month, day}
        End Function

  6. #6
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Avril 2015
    Messages : 66
    Points : 10
    Points
    10
    Par défaut
    j'ai retravailler le code de cette manière

    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
     
     
     Public Function DateDiffAnneeMoisJour(Nbjour As Integer) As Integer()
     
            Dim dateFin As Date
            dateFin = DateTime.Now
     
            Dim dateDebut As Date
            dateDebut = Now.AddDays(-Nbjour)
     
            Dim year As Integer
            year = dateFin.year - dateDebut.year
     
            Dim month As Integer
            month = dateFin.month - dateDebut.month
     
            Dim day As Integer
            day = dateFin.day - dateDebut.day
     
     
            If month < 0 Then
                year = year - 1
                month = month + 12
            End If
     
            If day < 0 Then
                month = month - 1
                day = day + DateTime.DaysInMonth(dateDebut.year, dateDebut.month)
            End If
     
            Return {year, month, day}
        End Function
    mais lorsque je l'utilise dans une requète sous cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test: DateDiffAnneeMoisJour([NbreJours])
    j'ai fonction non définie dans l'expression

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 394
    Points : 19 816
    Points
    19 816
    Billets dans le blog
    66
    Par défaut
    Bonjour,

    Oui, il faut reprendre la fonction de Kiki29 de la discussion et l'adapter à ton cas : nombre de jours jusqu'à aujourd'hui :

    Fonction à copier dans un module indépendant :

    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
    Function NbJoursAMJ(TotalJours As Long) as string
    Dim NbAns as long, NbMois as long, NbJours as long
    Dim Tmp As Date, sA As String, sM As String, sJ As String
    Dim dateFin As Date
    Dim dateDebut As Date
     
    dateFin = Date
    dateDebut = Date - TotalJours
     
        Tmp = DateSerial(Year(dateFin), Month(dateDebut), Day(dateDebut))
        NbAns = Year(dateFin) - Year(dateDebut) + (Tmp > dateFin)
        NbMois = Month(dateFin) - Month(dateDebut) - (12 * (Tmp > dateFin))
        NbJours = Day(dateFin) - Day(dateDebut)    ' [ Date Début, Date Fin ]
     
        If NbJours < 0 Then
            NbMois = NbMois - 1
            NbJours = Day(DateSerial(Year(dateFin), Month(dateFin), 0)) + NbJours
        End If
     
        If NbAns = 0 Then sA = "" Else sA = NbAns & "a "
        If NbMois = 0 Then sM = "" Else sM = NbMois & "m "
        If NbJours = 0 Then sJ = "" Else sJ = NbJours & "j"
     
    NbJoursAMJ = Trim$(sA & sM & sJ) ' Affiichage du résultat
     
    End function
    Utilisation sur un événement ou dans une autre procédure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Resultat =NbJoursAMJ (31)
    Cdlt,

  8. #8
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Avril 2015
    Messages : 66
    Points : 10
    Points
    10
    Par défaut
    Merci User c'est parfait cela fonctionne pour la conversion


    Comme rien n'est jamais facile on vient de me rajouter une grosse contrainte de calcul, un cas d'école je vais essayé d'expliqué

    Calcul Ancienneté en nombre de jour par contrat

    première étape où je suis perdu, vérifier si le salarié exécute plusieurs contrats aux mêmes dates ou pendant un autre contrat ?

    exemple du 01/01/2017 au 10/01/2017 le salarié peut faire un contrat temps partiel de X heures chez Entreprise A et un second de X heures chez entreprise B dans mon calcul actuel il aura donc deux fois 10 jours d'ancienneté ce qui n est pas bon.

    Il peut aussi avoir un contrat temps partiel du 01/01/2017 au 31/12/2017 chez entreprise A et pendant cet intervalle avoir du 01/03/2017 au 31/03/2017 un contrat temps partiel chez entreprise B il y aura donc une période dans laquelle il est dans deux contrats

    Je veut obtenir :

    - Une variable "nombre de jour" par contrat comme maintenant j'ai en faisant avec NbreJours: DiffDate("j";[Datedébut];[Datefin])

    - Ensuite la variable "nombre de jour" est commune pour des contrats qui ont lieu en même temps.

    - quand deux contrats ont lieu en même temps j'additionne les X heures de ces contrats

  9. #9
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 394
    Points : 19 816
    Points
    19 816
    Billets dans le blog
    66
    Par défaut
    On dépasse largement le cadre du sujet de départ :

    Je peux vous donner quelques pistes :

    Si vous disposez d'une table T_Contrat(IdContrat, Salarie, DateDebut, DateFin, NbHeures...) Pour calculer le nombre d'heures effectives il faut faire intervenir une sous-requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbrHeures: (select Sum(NbHeures) from T_Contrat As T1 where (T1.DateDebut<=T_Contrat.DateFin) and  (T1.DateFin>=T_Contrat.DateDebut) and (T1.Salarie=T_Contrat.Salarie))
    Avec le calcul du nbre de jours en fonction du résultat de NbrHeures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbreJours: VraiFaux([NbrHeures]<>[NbHeures];[NbrHeures]/48;[DateFin]-[DateDebut])
    En résumé, le sql de la requête principale bas ée sur la table T_Contrat, ressemblerait à cela :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT T_Contrat.IdContrat, T_Contrat.Salarie, T_Contrat.DateDebut, T_Contrat.DateFin, T_Contrat.NbHeures, (select Sum(NbHeures) from T_Contrat As T1 where (T1.DateDebut<=T_Contrat.DateFin) and  (T1.DateFin>=T_Contrat.DateDebut) and (T1.Salarie=T_Contrat.Salarie)) AS NbrHeures, IIf([NbrHeures]<>[NbHeures],[NbrHeures]/24,[DateFin]-[DateDebut]) AS NbreJours
    FROM T_Contrat;

    Enfin, vous voyez ce n'est pas trop simple pour un novice ...

  10. #10
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Avril 2015
    Messages : 66
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par User Voir le message
    On dépasse largement le cadre du sujet de départ :
    Et oui malheureusement je ne m'attendais pas du tout à cela ... faut il que j'ouvre un autre sujet ?

  11. #11
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 394
    Points : 19 816
    Points
    19 816
    Billets dans le blog
    66
    Par défaut
    oui, ce serait mieux.

    En fait il faut comparer les contrats 2 à 2 dans une requête, d'où la sous-requête...

  12. #12
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Avril 2015
    Messages : 66
    Points : 10
    Points
    10

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

Discussions similaires

  1. [WD20] Code pour additionner des années
    Par bebert12 dans le forum WinDev
    Réponses: 13
    Dernier message: 06/01/2017, 14h02
  2. Convertir nombre de jours en année, mois et jours
    Par mehdiyou dans le forum VB.NET
    Réponses: 10
    Dernier message: 10/04/2014, 10h08
  3. affichage des infos par jour,par semaine et par mois
    Par king_soft dans le forum Requêtes
    Réponses: 4
    Dernier message: 29/12/2010, 11h08
  4. Réponses: 1
    Dernier message: 22/07/2008, 15h25
  5. Réponses: 10
    Dernier message: 01/03/2007, 13h38

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