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

IHM Discussion :

[Calendrier] Multi valeur


Sujet :

IHM

  1. #1
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut [Calendrier] Multi valeur
    Bonjour,

    J'ai un petit travail qui consiste a comparer des données qui sont données par jour et d'autres par semaine.

    J'utilise le calendrier ActiveX d'ACCESS.

    A la saisie des données par semaine, j'aimerais pouvoir selectionner une semaine entiere sur le calendrier (d'une date de début a une date de fin). Par exemple, si je clique sur le mardi, les jours du lundi au dimanche s'enfoncent.
    Je n'ai pas trouvé, ou n'est-ce peut etre pas possible... Je regarde aussi le code d'Arkham sur ses boites de messages mais j'ai du mal a voir les changements a apporter.

    Merci de vos réponses !

  2. #2
    Expert éminent sénior
    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
    Bjr,

    Avec l'activeX je ne sais pas si la mutli-sélection est possible.
    Avec mes boîtes de dialogue on peut demander une multi-sélection, ça demande de faire quelques modifs.
    Je te guide un peu :

    Ajoutez ces déclaration de constantes dans l'en-tête du module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Const MCS_MULTISELECT = &H2 ' Ajout test
    Private Const MCM_GETSELRANGE = &H1005 ' Ajout test
    Private Const MCM_SETSELRANGE = &H1006 ' Ajout test
    Dans la fonction IBProc, ajoutez ces déclarations au début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        Dim lSystemTimeRange(1) As SYSTEMTIME
        Dim lCalcDate As Date
    Toujours dans IBProc, ajoutez MCS_MULTISELECT au style de calendrier pour permettre la sélection multiple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ' Crée une fenêtre de saisie de date avec calendrier
    shwnd = CreateWindowEx(0, WC_MONTHCALENDAR, vbNullString, _
                                       WS_CHILD Or WS_VISIBLE Or IB_DisplayWeeks _
                                       Or MCS_MULTISELECT, 0, 0, 0, 0, _
                                       hwnd, 0&, 0&, ByVal 0&)
    (le must serait d'ajouter un paramètre à la fonction InputBoxDate (à gérer avec une variable de la même manière que IB_DisplayWeeks) pour choisir ou non la sélection multiple au lieu d'ajouter MCS_MULTISELECT en dur)

    Ensuite il faut gérer la sélection de la semaine lors de la sélection d'un jour.
    C'est dans la fonction IBProc, dans Case WM_NOTIFY, tu trouves Case WC_MONTHCALENDAR.
    Le code suivant est à mettre entre Case WC_MONTHCALENDAR et Case WC_DATETIMEPICK (en remplacement du code existant)
    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
                    ' Si la notification correspond à un changement de la date
                    If lnmhdr.code = MCN_SELCHANGE Then
                        ' Ajout test
                        ' Récupère l'intervalle de date sélectionné sur le calendrier
                        If SendMessage(shwnd, MCM_GETSELRANGE, 0&, lSystemTimeRange(0)) <> 0 Then
                            ' Date de début de sélection
                            lCalcDate = DateSerial(lSystemTimeRange(0).wYear, lSystemTimeRange(0).wMonth, lSystemTimeRange(0).wDay)
                            ' Date du lundi
                            lCalcDate = lCalcDate - Weekday(lCalcDate, vbMonday) + 1
                            ' Première date en format systemtime
                            lSystemTimeRange(0).wYear = Year(lCalcDate): lSystemTimeRange(0).wMonth = Month(lCalcDate): lSystemTimeRange(0).wDay = Day(lCalcDate)
                            ' Ajout 6 jours pour atteindre le dimanche
                            lCalcDate = lCalcDate + 6
                            ' Deuxième date en format systemtime
                            lSystemTimeRange(1).wYear = Year(lCalcDate): lSystemTimeRange(1).wMonth = Month(lCalcDate): lSystemTimeRange(1).wDay = Day(lCalcDate)
                            ' Sélectionne la semaine complète dans le calendrier
                            Call SendMessage(shwnd, MCM_SETSELRANGE, 0&, lSystemTimeRange(0))
                            ' Formate le résultat
                            lDate = Format(DateSerial(lSystemTimeRange(0).wYear, lSystemTimeRange(0).wMonth, lSystemTimeRange(0).wDay), "Short Date") _
                                & "-" & Format(DateSerial(lSystemTimeRange(1).wYear, lSystemTimeRange(1).wMonth, lSystemTimeRange(1).wDay), "Short Date")
                            ' Met à jour la zone de texte
                            Call SendMessage(sEditHwnd, WM_SETTEXT, _
                                             Len(lDate), ByVal lDate)
                        Else ' Si MCM_GETSELRANGE ne fonctionne pas, la sélection est unitaire
                            ' Récupère la date sélectionnée sur le calendrier
                            SendMessage shwnd, MCM_GETCURSEL, 0&, lSystemTime
                            ' Formate la date
                            lDate = Format(DateSerial(lSystemTime.wYear, lSystemTime.wMonth, lSystemTime.wDay), "Short Date")
                            ' Met à jour la zone de texte
                            Call SendMessage(sEditHwnd, WM_SETTEXT, _
                                             Len(lDate), ByVal lDate)
                        End If
                    End If

    Ensuite tu récupères en sortie une variable de type string qui contient les deux dates séparées par un tiret :
    09/04/2007-15/04/2007
    Facile à séparer avec un traitement de chaîne ou Split si Access >=2000.

  3. #3
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    je travaille dessus, je te tiens au courant.

    Une petite question qui me vient. Tu passes par une inputbox. Est-il possible d'intégrer ce calendrier directement a ton formulaire???

    Merci en tout cas !!

  4. #4
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    Yesssssss, c'est beau ! Superbe meme !

    je suis quand meme un peu perdu dans ton code, mais ca marche nickel !

    Je remarque que j'ai fait une petite erreur dans mon message de départ. En fait, je voudrais sélectionner les semaines du samedi au vendredi (Vive le moyen-orien )

    J'ai tenté de tripatouiller en faisant les modifs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ' Date du samedi
    lCalcDate = lCalcDate - Weekday(lCalcDate, vbSaturday) + 1
    Ca marche, mais j'ai le chiffre du dimanche qui disparait.

    Je vais tenter de rajouter un parametre a la fonction pour pouvoir selectionner la base de temps de la selection.

    1000 mercis en tout cas !!!!

  5. #5
    Expert éminent sénior
    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
    Citation Envoyé par timoth
    je suis quand meme un peu perdu dans ton code, mais ca marche nickel !
    C'est normal, j'ai passé des heures à comprendre comment ça fonctionne avant de pouvoir faire ça.

    Citation Envoyé par timoth
    Une petite question qui me vient. Tu passes par une inputbox. Est-il possible d'intégrer ce calendrier directement a ton formulaire???
    Il faudrait un contrôle activeX pour l'intégrer au formulaire (autre que celui livré avec Access).

    Si tu préfères un calendrier qui se positionne sous un contrôle, il y a ça :
    http://developpez.net/forums/showthread.php?t=241746
    (la modification pour multi-sélection devrait s'appliquer aussi, le code est très ressemblant)

    Pour :
    le chiffre du dimanche qui disparait
    Je ne comprend pas?

  6. #6
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    Regarde en pj.

    Lorsque je clique sur une semaine, je ne vois plus le numero du dimanche. C'est "peanuts", mais ca a chatouillé ma curiosité.

    En esperant que ca chatouille aussi la tienne...

  7. #7
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 943
    Points : 4 868
    Points
    4 868
    Par défaut
    Pour info : dans un calendrier France , c'est ok cf PJ

  8. #8
    Expert éminent sénior
    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
    En fait ça fonctionne bien si tu demandes une police de caractères "Comic sans MS" (c'est celle que j'utilise dans mes tests..)

    Il y a apparement un soucis lors d'une multi-sélection "multi-ligne" (même avec une sélection multiple manuelle), je ne vois pas d'où ça vient et pourquoi ça change en fonction de la police de caractères.

    Autre solution : changer le premier jour affiché :
    Ajoutez dans les déclarations de constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Const MCM_SETFIRSTDAYOFWEEK = &H100F
    Puis changer le premier jour de la semaine, juste après création du calendrier (après la fonction CreateWindowEx changé précédemment) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call SendMessage(shwnd, MCM_SETFIRSTDAYOFWEEK , 0, ByVal 5)

  9. #9
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    Désolé, je n'ai pas vu ta réponse avant maintenant !!

    J'ai testé c'est parfait !

    Merci beaucoup pour ton aide !!!!!!!!!!!!

  10. #10
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    J'ai un petit souci avec mon calendrier par semaine.

    lorsque je définis une valeur par défaut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DisplayCalendar(Me.b_weekly,,calendar.value)
    Calendar.value me donne bien un format date (le controle ActiveX de windows que j'integre sur mon formulaire)

    Apres, j'arrete, c'est promis

  11. #11
    Expert éminent sénior
    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
    Hé oui la sélection de la date par défaut n'a pas été prévue pour une sélection multiple :

    Si sélection multiple il faut utiliser le message MCM_SETSELRANGE avec 2 dates au lieu MCM_SETCURSEL avec une seul date pour une sélection simple
    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
     
            ' Positionne le calendrier à la date par défaut
            If IsDate(IB_Default) And IB_Default <> "" Then
                ' Test si sélection simple
                If (GetWindowLong(shwnd, GWL_STYLE) And MCS_MULTISELECT) = 0 Then
                    ' Remplit la structure SystemTime
                    lSystemTime.wYear = Year(IB_Default): lSystemTime.wMonth = Month(IB_Default): lSystemTime.wDay = Day(IB_Default)
                    SendMessage shwnd, MCM_SETCURSEL, 0&, lSystemTime
                Else
                    ' Sélection de la semaine complète par défaut
                    ' Date de début de sélection
                    lCalcDate = IB_Default
                    ' Date du lundi
                    lCalcDate = lCalcDate - Weekday(lCalcDate, vbSaturday) + 1
                    ' Première date en format systemtime
                    lSystemTimeRange(0).wYear = Year(lCalcDate): lSystemTimeRange(0).wMonth = Month(lCalcDate): lSystemTimeRange(0).wDay = Day(lCalcDate)
                    ' Ajout 6 jours pour atteindre le dimanche
                    lCalcDate = lCalcDate + 6
                    ' Deuxième date en format systemtime
                    lSystemTimeRange(1).wYear = Year(lCalcDate): lSystemTimeRange(1).wMonth = Month(lCalcDate): lSystemTimeRange(1).wDay = Day(lCalcDate)
                    SendMessage shwnd, MCM_SETSELRANGE, 0&, lSystemTimeRange(0)
                    ' Formate le résultat par défaut
                    lDate = Format(DateSerial(lSystemTimeRange(0).wYear, lSystemTimeRange(0).wMonth, lSystemTimeRange(0).wDay), "Short Date") _
                        & "-" & Format(DateSerial(lSystemTimeRange(1).wYear, lSystemTimeRange(1).wMonth, lSystemTimeRange(1).wDay), "Short Date")
                    ' Met à jour la zone de texte avec la semaine sélectionnée par défaut
                    Call SendMessage(GetDlgItem(hwnd, IDEDIT), WM_SETTEXT, _
                                     Len(lDate), ByVal lDate)
                End If
            End If

  12. #12
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    J'halucine de l'efficacité de tes réponses Arkham !

    Bravo et merci

  13. #13
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    J'ai quand meme une erreur quand j'ouvre le calendrier sur la bonne semaine et que je clique sur OK directement sans selectionner.

    La chaine de caractere retournée me donne une seule date, la date du lendemain du premier jour de la semaine selectionnée.

  14. #14
    Expert éminent sénior
    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
    oui c'est la valeur par défaut qui n'est pas à jour dans la zone de texte (qui est masquée alors on la voit pas )

    correction dans le code précédent

  15. #15
    Membre confirmé Avatar de timoth
    Homme Profil pro
    Responsable Outils Digitaux
    Inscrit en
    Octobre 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable Outils Digitaux

    Informations forums :
    Inscription : Octobre 2005
    Messages : 479
    Points : 474
    Points
    474
    Par défaut
    Je vais arreter de te poser des questions, je vais plus avoir assez de compliments a t'envoyer !

    Merci Arkham

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

Discussions similaires

  1. Champs multi valeurs => tables
    Par Kloun dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/06/2007, 12h43
  2. interet modéré du champ multi valeur
    Par programmer_c'est_dur dans le forum Access
    Réponses: 1
    Dernier message: 12/05/2007, 18h17
  3. requete multi valeurs
    Par pcappell dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/05/2007, 12h29
  4. Pb index multi-valeurs avec DBase
    Par Rickless dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/01/2006, 17h50
  5. [Calendrier] Multi-utilisateurs en php avec les ACL
    Par moabomotal dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 06/12/2005, 18h51

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