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 :

Valeur semaine et année transformée en date


Sujet :

Access

  1. #1
    seb92400
    Invité(e)
    Par défaut Valeur semaine et année transformée en date
    Hello,

    Comme d'hab, le cerveau en ébulition... J'ai créé une petite base de donnée pour les commandes de mes chers collègues... Dans ces commandes, ils m'ont demandé une liste déroulante semaine d'intervention (Semaine_Inter), et une autre année d'intervention (Annee_Inter)... Bon, jusque là tout va bien. J'ai créé des tables pour ces données comme elles sont utiliséés dans plusieurs pages... Bref...

    Seulement voilà, aujourd'hui, ces chers collègues me demandent qu'on les previennent 4 semaines avant l'intervention... Donc, je pense mettre un bouton supplémentaire sur mon formulaire de démarrage et créer un formulaire basé sur une requête qui affichera les interventions 4 semaines avant la [Semaine_Inter], et allez, soyons fous, triées par date d'intervention croissante et par clients... Tout simple...

    Sauf que pour faire un calcul sur une date, il faut... une date ! Et là, je n'ai que deux listes déroulantes qui affichent la semaine et l'année :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     = "Semaine " & [Semaine_Inter].[column](1) & " / " & [Annee_Inter].[Column](1)
    Donc... Comment puis-je faire, lorsque j'ai ces deux champs, par exemple, 50 pour la semaine et 2006, pour l'année pour faire comprendre à access que je parle de la semaine du lundi 11 décembre 2006 au dimanche 17 décembre 2006 ?

    Merci d'avance...

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Function debsem(an As Integer) As Date
    Dim deb As Date
    deb = DateSerial(an, 1, 1)
    Do Until Weekday(deb, vbMonday) = 1 And Format(deb, "ww", vbMonday, vbFirstFourDays) = 1
    deb = deb + 1
    Loop
    debsem = deb
    End Function
    te donnera la date de début de la premiére semaine de l'année
    tu y ajoutes (n°semaine-1)*7 pour le début d'une semaine
    tu retranches xsemaines*7 pour ta date
    Elle est pas belle la vie ?

  3. #3
    seb92400
    Invité(e)
    Par défaut
    euh.... oh la la... Il y a à peine trois mois, je pensais que Access s'écrivait ax-s Bon... Je vais travailler la dessus... J'ai à peu près compris pour la semaine, mais l'année, je vois pas où je lui dit qu'on est en 2006 ou 2015...

    Je sens la nuit blanche qui approche !

    Je vais peut-être aller faire un gateau au chocolat moi... On verra si c'est le four ou le pc qui aura raison de moi !

    En tout cas, Merci... Je te tiens au courant...

  4. #4
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Sur la base de ce que propose Random :

    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
     
    '
    ' Renvoi le premier jour d'une semaine en fonction d'un n° de semaine et de l'année
    '
    ' on part du principe que le 1er janvier fait parti de la première semaine et que ca change à
    ' chaque lundi
    '
    Function FirstDayOfAWeek(semaine As Integer, annee As Integer) As Date
      Dim aday As Date
     
      ' on construit une date qui correspond au 1er janiver de l'année demandé
      aday = DateSerial(annee, 1, 1)
      ' tant que le jour de cette date est <> 1 (lundi) on ajoute un jour
      ' a la sortie on a le 1er jour de la 2ième semaine sous forme de date
      Do While Weekday(aday, vbMonday) <> 1
        aday = DateAdd("d", 1, aday)
      Loop
     
      ' on cherche le début de la semaine n°1 en soustrayant 7 jours vu que
      ' nous sommes sur la semaine 2
      aday = DateAdd("d", -7, aday)
     
      ' on ajoute à cette date le nombre de (semaine - 1) * 7 (jours)
      ' -1 parce que si on dis demande semaine 1, il faut rien ajouter a cette date
      FirstDayOfAWeek = DateAdd("d", (semaine - 1) * 7, aday)
    End Function
    Par contre cette fonction donne le 04/12/2006 pour la semaine 50 de 2006, c'est conforme au règle standard que l'on utilise en général.

    Si pour toi et tes collègues, la semaine 50 correspond bien au 11/12, c'est à dire que la semaine n°1 commence au 1er lundi d'une semaine complète, alors il faut changer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      FirstDayOfAWeek = DateAdd("d", (semaine - 1) * 7, aday)
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      FirstDayOfAWeek = DateAdd("d", semaine * 7, aday)

    P.S.: Il était bon le gateau au chocolat ? ^^
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  5. #5
    seb92400
    Invité(e)
    Par défaut
    Merciiiii ! :-)

    J'ai compris !!! Maintenant que la théorie est passée, reste la pratique...

    Si j'ai bien compris, pour que ça fonctionne, je place cette fonction dans les procédures AfterUpdate de mes champs [Semaine_Inter] et [Date_Inter] et je récupère la valeur FirstDayOfWeek (qui est dans ce cas le premier jour de la semaine inscrite dans [Semaine_Inter]) dont je peux me servir dans un calcul...

    Je peux placer cette date dans un module indépendant également je pense... Avec un Public Function (???) Vu que j'en aurai besoin pour plusieurs combinaisons différentes (semaine/année)... Mais après je ne sais pas encore comment on appelle la fonction dans le module ... Je trouverais ça sans doute dans la faq...

    Encore Merci !!!

    PS: Le gateau au chocolat... hummmm ! Juste... pas assez moelleux à mon goût... Je vais revoir la recette pour le prochain !!!

  6. #6
    seb92400
    Invité(e)
    Par défaut
    Ca marche nickel !!! Merci encore...

  7. #7
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    J'en suis heureux, pour la peine, je réquisitionne une part de gateau alors (mais moelleux ^^).
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  8. #8
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    ATTENTION, DelphiManiac parle de "regle standart", or sauf erreur de ma part auquel cas ne vous gênez pas pour me corriger, la fonction FirstDayOfAWeek de DelphiManiac ne marche pas toujours selon le standart international, qui veut que la première semaine d'une année contienne au minimum 4 jours de cette année.

    Exemple Ci-dessous :

    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
    ' Fonction renvoyant le numero d'une semaine correspondant a une date
    Public Function Numero_Semaine(p_date As Date) As Integer
     
        Numero_Semaine = CInt(Format(p_date, "ww", vbMonday, vbFirstFourDays))
     
    End Function
     
    Sub Test()
     
        Dim ma_date As Date
        Dim ma_semaine As Integer
        ma_date = FirstDayOfAWeek(4, 2010) ' donne 18/01/2010
        ma_semaine = Numero_Semaine(ma_date) ' donne 3 ....
     
    End Sub
    En demandant le premier jour de la semaine 4 de l'année 2010 on obtient le 18/01. Or si je ne m'abuse, cette date est plutot le debut de la semaine 3, ce que confirme ma fonction maison par la suite...

    Donc sauf erreur de ma part, attention avec cette fonction...
    "Ne soyez rien, devenez sans cesse"

  9. #9
    seb92400
    Invité(e)
    Par défaut
    Hi,

    Surpis que cette discussion ait été remise au goût du jour... Pour ma part, depuis le temps, j'ai mis au point une autre fonctuion pour déterminer le jour... qui ne prend pas en compte ce "standard"... Je ne l'ai pas sous la main là...

    Merci à toi en tout cas...

  10. #10
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Mon code ci-dessous, tout en restant dans l'esprit de DelphiManiac, me paraît être une alternative correcte pour être en accord avec la norme standard :

    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
    Function Premier_Jour_Semaine(ByVal p_semaine As Integer, ByVal p_annee As Integer) As Date
     
        Dim l_date As Date
     
        ' La semaine 1 d'une annee contient toujours le 4 janvier
        l_date = CDate("04/01/" & p_annee)
     
        ' Recherche du lundi de la semaine 2
        If Weekday(l_date, vbMonday) = 1 Then
            l_date = DateAdd("d", 7, l_date)
        Else
            While Weekday(l_date, vbMonday) <> 1
                l_date = DateAdd("d", 1, l_date)
            Wend
        End If
     
        Premier_Jour_Semaine = DateAdd("d", (p_semaine - 2) * 7, l_date)
     
    End Function
     
    Sub Test()
     
        Dim ma_date As Date
        Dim ma_semaine As Integer
        ma_date = Premier_Jour_Semaine(4, 2010)   ' Donne 25/01/2010, :D 
        ma_semaine = Numero_Semaine(ma_date)      ' Donne 4 :D 
     
    End Sub
    NB : http://fr.wikipedia.org/wiki/ISO_860....C3.A9rotation

    Cordialement,

    Currahee,
    "Ne soyez rien, devenez sans cesse"

  11. #11
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par noawsen
    Hi,

    Surpis que cette discussion ait été remise au goût du jour... Pour ma part, depuis le temps, j'ai mis au point une autre fonctuion pour déterminer le jour... qui ne prend pas en compte ce "standard"... Je ne l'ai pas sous la main là...

    Merci à toi en tout cas...
    J'espère quand même que tu te référes à un standard car sinon je vois mal comment ne pas aller droit dans le mur...

    En effet sur le problème que j'ai soulevé, j'utilisais ma fonction numero_semaine que je savais obéir à un standard, et en même temps la fonction de DelphiMania que je trouvais bancale. RESULTAT : des donnees incohérentes...

    Bref que tu obéisses à un standard ou non, je te conseille de vérifier la cohérence de fonctions qui seront souvent utilisées ensemble ;-)

    En bonus : "Comment calculer le nombre de semaines dans une année ?"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Numero_Semaine(CDate("28/12/" & annee)
    "Ne soyez rien, devenez sans cesse"

  12. #12
    seb92400
    Invité(e)
    Par défaut
    Hello,

    En fait, le code que je cherchais à faire me permettait de retrouver une date (de pose) en fonction d'une semaine et d'une année entrée...

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        Dim Sem As Long, An As Long
        Dim DatePose As Date, SemComplete As Long, DifSem As Long
     
        Sem = Me.SemainePLMD
        An = Me.AnneePLMD.Column(1)
     
        DatePose = DateSerial(An, 1, 1)
     
        Do Until Weekday(DatePose) = 2
            DatePose = DateAdd("d", 1, DatePose)
        Loop
     
        SemComplete = DatePart("ww", DatePose, vbUseSystemDayOfWeek, vbUseSystem)
     
        DifSem = Sem - SemComplete
     
        DatePose = DateAdd("ww", DifSem, DatePose)
    Dans ce code, je retrouve le premier lundi de l'année et j'en extrais la semaine à laquelle il appartient (en me basant sur le vbUseSystemDayOfWeek). Je fais la différence avec la semaine de pose entrée et j'ajoute cette différence à la date de pose... ce qui me donne le lundi de la date de pose...

    D'après ce que tu dis, cette solution ne serait pas valable... Je vais étudier le lien sur Wikipedia et faire des tests...

    A très vite...

  13. #13
    seb92400
    Invité(e)
    Par défaut
    Me revoilà... D'après ce que je lis sur Wikipedia, je devrais modifier mon code de la façon suivante : Dès que j'ai obtenu le premier lundi de l'année, je teste le jour et si celui-ci est inférieur à 4, alors je suis en semaine 1...

    Ensuite, le reste est normalement bon...

    Edit : L'aide d'Access sur DatePart nous indique que l'argument FirstDayOkWeek peut prendre comme constante vbFirstFourDays

    vbFirstFourDays : Commencer par la première semaine comportant au moins quatre jours dans l'année nouvelle.
    qui correspond exactement à ce qui est marqué sur Wikipedia...

  14. #14
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par noawsen
    Me revoilà... D'après ce que je lis sur Wikipedia, je devrais modifier mon code de la façon suivante : Dès que j'ai obtenu le premier lundi de l'année, je teste le jour et si celui-ci est inférieur à 4, alors je suis en semaine 1...

    Ensuite, le reste est normalement bon...

    Edit : L'aide d'Access sur DatePart nous indique que l'argument FirstDayOkWeek peut prendre comme constante vbFirstFourDays


    qui correspond exactement à ce qui est marqué sur Wikipedia...
    ATTENTION, J'ai dit que la fonction de DelphiManiac n'allait pas, et j'ai filé le code pour vérifier ce fait.

    J'ai ensuite donné mes fonctions qui jusqu'à nouvel ordre marchent dans tous les cas

    Sur ton code à proprement parler, tu ne l'avais pas posté quand j'ai relancé le sujet, donc je ne me permettrai pas de dire qu'il est partiellement incorrect.

    Maintenant vu que mes fonctions marchent, et que je ne vois guère d'optimisation possible, je te laisse retester les tiennes si ça te chante

    Cordialement,
    "Ne soyez rien, devenez sans cesse"

  15. #15
    seb92400
    Invité(e)
    Par défaut
    Hello,

    Sur ton code à proprement parler, tu ne l'avais pas posté quand j'ai relancé le sujet, donc je ne me permettrai pas de dire qu'il est partiellement incorrect.
    Vi, vi... Je me suis mal exprimé... Ce que je voulais, c'est que comme je me suis inspiré de la fonction de base, il y a de fortes chances pour que mon code ne renvoie pas toujours la bonne date...

    Et oui, de toutes façons, je vais retester le mien !!!

Discussions similaires

  1. [JodaTime] Création de date avec semaine et année
    Par lequebecois79 dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 22/04/2012, 01h33
  2. Obtenir la semaine et l'année d'une date
    Par RomG7 dans le forum Collection et Stream
    Réponses: 17
    Dernier message: 01/12/2010, 16h59
  3. Réponses: 0
    Dernier message: 22/04/2010, 10h02
  4. Année transformée en date
    Par Fala fala dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/01/2008, 20h33
  5. Retrouver date à partir des n° de jour, semaine et année
    Par infosorome dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/12/2005, 11h21

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