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 :

Sélection sur plusieurs listes déroulantes dans un bouton


Sujet :

IHM

  1. #21
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Pour l'âge, tu pourrai ajouter deux zones de textes, "Format"=Standard.
    Par exemple txtAgeMin et txtAgeMax.
    Tu déclares deux variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lgAge1 As String, lgAge2 As String
    Ensuite, pour la fourchette d'âge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ' Contrôle txtAge1 et txtAge2
    lgAge1 = Nz(Me.txtAgeMin, 0)
    lgAge2 = Nz(Me.txtAgeMax, 0)
    If lgAge1 <> 0 And lgAge2 <> 0 Then
       If f <> "" Then f = f & " AND "
       f = f & "AgU BETWEEN " & CStr(lgAge1) & " AND " & CStr(lgAge2)
    End If
    Une zone de liste est aussi envisageable.
    Tu crée une table tblAge ayant pour champs AgeMin et AgeMax (types numériques - entiers long).
    Tu entres les fourchettes d'âge.
    Contenu de la zone de liste déroulage Rage
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [AgeMin] & "-" & [AgeMax] AS Age, tblAge.AgeMin, tblAge.AgeMax FROM tblAge ORDER BY tblAge.AgeMin;
    Nbre de colonnes = 3
    Valeur par défaut : "- - Choisir - -"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ' Contrôle RAge
    strVal = Nz(Me.Rage, "")
    If strVal <> "" And strVal <> "- - Choisir - -" Then
       If f <> "" Then f = f & " AND "
       f = f & "AgU BETWEEN " & Me.Rage.Column(1) & " AND " & Me.Rage.Column(2)
    End If
    Me.Rage.Column(1) = colonne 2 = tblAge.AgeMin
    Me.Rage.Column(2) = colonne 3 = tblAge.AgeMax

    A+

  2. #22
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    J'ai testé le code mais çà ne fonctionne pas. Je pense que çà vient du fait que mes deux textbox reposent sur le même champ AgU.

    Voici ce que j'ai testé (en ayant déclaré les variables avant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ' SELECTION DE L AGE
    lgAge1 = Nz(Me.Txtage1, 0)
    lgAge2 = Nz(Me.Txtage1, 0)
    If lgAge1 <> 0 And lgAge2 <> 0 Then
       If f <> "" Then f = f & " AND "
       f = f & "AgU BETWEEN " & CStr(lgAge1) & " AND " & CStr(lgAge2)
    End If
    Je n'ai pas testé la liste déroulante car au final, cette solution me plait moins. En fait, elle me semble moins adaptée étant donné que je devrais aussi par la suite faire la même opération pour une deuxième personne impliquée dans l'accident. Donc par souci d'affichage, je trouve çà plus opérationnel.

    Merci encore. Bonne journée

  3. #23
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Au passage et pour infos :
    A moi de faire attention pour la prochaine fois de ne pas employer de mots clés Access...
    Il ne s'agit pas de mots clés Access mais SQL, répertoriés ici par SQLpro

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  4. #24
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Les deux zones de texte doivent être indépendantes.
    Propriété "Source contrôle" doit être vide.
    Sinon tu écris dans ta table lorsque tu saisis quelque chose dans ces zones de texte.

    Par ailleurs, je me suis trompé en recopiant la déclaration des variables.
    Je voulais déclarer les variables en type Long (d'où le préfixe lg).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim lgAge1 As Long, lgAge2 As Long
    A+

  5. #25
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    --> Merci Chtulus pour cette précision. A ce sujet, existe-t-il un moyen de repérer ce genre d'erreur (je sais pas, est-ce qu'il y a un code d'erreur type ...?)

    --> LedZepII : j'ai retenté le code mais çà fonctionne pas :

    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 f As String, strVal As String, lgAge1 As Long, lgAge2 As Long
     
    f = ""
     
    ' SELECTION DE L AGE
    lgAge1 = Nz(Me.Txtage1, 0)
    lgAge2 = Nz(Me.Txtage1, 0)
    If lgAge1 <> 0 And lgAge2 <> 0 Then
       If f <> "" Then f = f & " AND "
       f = f & "AgU BETWEEN " & CStr(lgAge1) & " AND " & CStr(lgAge2)
    End If
     
    ' Activation du filtre
    Me.Filter = f
    Me.FilterOn = True
     
    End Sub
    j'ai donc bien vérifié les "sources controle" et les deux sont bien vides pour les 2 zones de texte.
    De plus, j'ai modifié le type de variable mais çà ne change toujours pas.
    Une idée d'où vient l'erreur ?

    Merci beaucoup. A+

  6. #26
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Je ne l'avais pas vu hier.

    La ligne ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lgAge2 = Nz(Me.Txtage1, 0)
    devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lgAge2 = Nz(Me.Txtage2, 0)
    A+

  7. #27
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Ok, merci beaucoup. Cette fois çà fonctionne bien.

    Sinon, tu aurais une idée pour les tranches horaires ou c'est quasiment la même méthode ? Je pense aussi permettre à l'utilisateur de choisir une tranche (comme pour l'âge).
    Le type des variables varie peut-être (dim lgheure1 as long ?)
    A savoir aussi qu'à l'heure actuelle, l'heure est au format texte de ce style 08_00.
    Mais j'ai créé une 2e colonne transformant ce format texte en format heure de type 08:00:00.
    Je ne sais pas lequel est le plus pratique pour ce que je désire réaliser.

    En tout cas, décidément merci beaucoup LedZepII car j'avance énormément avec toi...
    Bonne journée

  8. #28
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    C'est plus simple de travailler sur un champ de type Date/Heure.

    Est-ce que dans tes zones de textes, tu prévois de saisir uniquement l'heure (entre 11 et 14),
    ou bien heures et minutes (entre 11:15 et 14:45) ?
    Dans le premier cas on peut travailler avec des variables de type Long.
    Dans le second, on utilisera plutôt des variables de type Date.

    A+

  9. #29
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Salut,

    Alors je pense qu'il vaut mieux travailler avec les heures et les minutes...
    De cette façon, les possibilités sont plus importantes.
    Juste pour préciser, uniquement les heures et les minutes, pas de secondes (donc on aura toujours :00 pour les 2 derniers chiffres donc les 3 derniers caractères à ne pas prendre en compte). Je pense que je devrais peut-être le spécifier dans le code.

    A+

  10. #30
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Voila ce que j'ai fait.

    J'ai ajouté deux zones de textes txtHeure1 et txtHeure2.
    Masque de saisie : 90:90
    Format : Heure, abrégé (heures et minutes)

    Code Déclaration des variables : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim dtHeure1 As Date, dtHeure2 As Date

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ' Heure
    dtHeure1 = Nz(Me.txtHeure1, #1/1/1900#)
    dtHeure2 = Nz(Me.txtHeure2, #1/1/1900#)
     
    If (dtHeure1 <> #1/1/1900#) And (dtHeure2 <> #1/1/1900#) Then
       If f <> "" Then f = f & " AND "
       If dtHeure1 <= dtHeure2 Then
          f = f & "[Heure] BETWEEN #" & Format(dtHeure1, "hh:nn") & "# AND #" & Format(dtHeure2, "hh:nn") & "#"
       Else
          f = f & "([Heure] BETWEEN #" & Format(dtHeure1, "hh:nn:ss") & "# AND #23:59:59#"
          f = f & " OR "
          f = f & "[Heure] BETWEEN #00:00:00# AND #" & Format(dtHeure2, "hh:nn:ss") & "#)"
       End If
    End If
    Le champ [Heure] est de type Date/Heure.

    Le type Date Visual Basic et le type Date/Heure pour un champ contiennent à la fois la date et l'heure.
    Quand il n'y a que l'heure la date est le 30/12/1899.
    Avec Nz, je remplace Null par la date du 1/1/1900. Date que je ne pas saisir au format Heure abrégé.

    Si l'heure de fin est inférieure à l'heure de début, je découpe en deux tranches, avant et après minuit.

    A+

  11. #31
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Encore merci LedZepII, on arrive presque au bout...Le code sur les heures fonctionne. Il reste juste les finitions, mais j'imagine que c'est toujours ce qui coince le plus, non?

    Donc je démarre :
    - si tu te souviens, j'avais créé un bouton "Reset" en gros, qui efface toutes mes sélections dans mes listes déroulantes ou mes textbox. Seulement, quand je clique sur mon bouton, les résultats du formulaire restent sur le résultat de la dernière requête effectuée et ne se réinitialise pas...
    Je mets les code au cas où (tu verras, c'est le plus 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
    30
    31
    32
    33
    34
    35
    Private Sub CmdEffacer_Click()
     
    ' QUAND ?
    Me.RAnnee = "- - Choisir - -"
    Me.Rmois = "- - Choisir - -"
    Me.Rjour = ""
    Me.Rjour_sem = "- - Choisir - -"
    Me.TxtHeure1 = ""
    Me.TxtHeure2 = ""
     
    ' OU ?
    Me.Radresse = ""
    Me.Rtype_inter = "- - Choisir - -"
    Me.Rcatvoie = "- - Choisir - -"
    Me.Rcommune = "- - Choisir - -"
     
    ' QUI ?
    Me.RvehiculeA = "- - Choisir - -"
    Me.RvehiculeB = "- - Choisir - -"
    Me.Rtypecol = "- - Choisir - -"
    Me.Txtage1 = ""
    Me.Txtage2 = ""
    Me.Rsexe = "- - Choisir - -"
    Me.Rcat_usager = "- - Choisir - -"
     
    ' COMBIEN ?
    Me.Rnbvehic = "- - Choisir - -"
    Me.Rnbusagers = "- - Choisir - -"
    Me.RNbtues = "- - Choisir - -"
    Me.RNbBH = "- - Choisir - -"
    Me.RNbBNH = "- - Choisir - -"
     
    Me.Requery
     
    End Sub
    - Ensuite, c'est juste une petite question : j'ai fait un peu le même genre de formulaire, mais avec des onglets, et donc quand j'appuie sur le bouton Rechercher, ma requête ne s'affiche pas. Donc, j'aimerais que quand je clique sur ce bouton, un état ou un formulaire correspondant au résultat de ma requête s'affiche. Et je sais pas si c'est possible, mettre une sorte de graphique, ce genre de choses pour pas que ce ne soit qu'un tableau...

    - aussi, en testant un peu le formulaire, je me suis rendu compte d'une erreur pour l'âge. En fait, comme c'est une tranche d'âge, le chiffre que je tape en 2e doit être plus élevé que le 1er, sauf que si je tape entre 21 et 18 ans, je trouve le même résultat que si je tape "entre 18 et 21 ans"...Comment faire pour interdire cela : messagebox ou c'est dans le code qu'il faut le spécifier ??

    Je te remercie encore LedZepII. Bonne fin de week-end

  12. #32
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,
    ...les résultats du formulaire restent sur le résultat de la dernière requête effectuée et ne se réinitialisent pas...
    Il faut enlever le filtre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.FilterOn = False
    Me.Filter = ""
    Pour réinitialiser les contrôles zones de textes, je préfère affecter Null plutôt que "".
    Voici un code un peu plus simple pour remettre la valeur par défaut.
    Je remets dans chaque contrôle (zone de liste déroulante et zone de texte), la valeur par défaut définie dans la propriété "valeur par défaut".
    S'il n'y en a pas, je mets Null.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim ctl As Access.Control
     
    For Each ctl In Me.Section(acHeader).Controls
        Select Case ctl.ControlType
            Case acComboBox, acTextBox
                 If Len(ctl.DefaultValue) > 0 Then
                    ctl = Eval(ctl.DefaultValue)
                 Else
                    ctl = Null
                 End If
        End Select
    Next
    Mettre Null est important pour les zones de texte txtAge1 et txtAge2, ainsi que txtHeure1 et txtHeure2.
    En effet elles sont sensées contenir des valeurs numériques ou date, ou ne rien contenir (Null).
    Si tu affectes une chaîne vide (""), des lignes telles que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lgAge1 = Nz(Me.txtAge1, 0)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dtHeure1 = Nz(Me.txtHeure1, #1/1/1900#)
    vont générer une erreur d'incompatibilité de type de données, car on tente d'affecter une valeur de type String dans une variable de type Long ou Date.


    Pour les zones de textes txtAge1 et txtAge2, on peut déjà mettre le masque de saisie 99; et le format à "Standard".
    Ensuite dans l'événement "sur sortie" de txtAge1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub txtAge1_Exit(Cancel As Integer)
    If IsNumeric(Me.txtAge1) Then
       Me.txtAge2.ValidationRule = ">[txtAge1]"
       Me.txtAge2.ValidationText = "Entrez une valeur supérieure à " & CStr(Me.txtAge1)
    Else
       Me.txtAge2 = Null
       Me.txtAge2.ValidationRule = "False"
       Me.txtAge2.ValidationText = "Entrez un âge minimum"
    End If
    End Sub
    Je mets oeuvre, de cette manière, le contrôle de validité en le définissant dynamiquement.

    j'ai fait un peu le même genre de formulaire, mais avec des onglets, et donc quand j'appuie sur le bouton Rechercher, ma requête ne s'affiche pas. Donc, j'aimerais que quand je clique sur ce bouton, un état ou un formulaire correspondant au résultat de ma requête s'affiche. Et je sais pas si c'est possible, mettre une sorte de graphique, ce genre de choses pour pas que ce ne soit qu'un tableau...
    Je suis un peu perdu.
    Qu'y a-t-il dans les onglets ?

    Sinon, pour ouvrir un formulaire ou un état correspondant à tes critères de sélection, il faut créer un formulaire ou un état basé sur la même table Total.
    Ensuite, tu ouvres le formulaire ou l'état en utilisant l'argument WhereCondition de DoCmd.OpenForm ou DoCmd.OpenReport.
    Cet argument est identique au filtre de ton formulaire actuel (variable f).
    La seule différence avec un filtre c'est que WhereCondition est appliqué en amont, directement à la source de données du formulaire ou de l'état.

    Bon weekend.

  13. #33
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Bonjour LedZepII,

    Merci pour le code du bouton Effacer. C'est vrai que c'est en fait beaucoup plus simple comme çà, et en plus, certaines erreurs sont évitées.

    Cependant, j'ai encore quelques soucis avec les tranches d'âge. En effet, on peut toujours mettre une valeur supérieure en premier...Je m'explique, je peux toujours faire une requête du genre : "sélectionne moi les enregistrements où l'âge est compris entre 21 et 18 ans. Alors que j'aimerais que ce soit impossible. Enfin, ceci est possible seulement après avoir déjà fait une requête et si l'on modifie uniquement le premier critère. Donc, ma question est : est-ce qu'il y aurait un moyen de faire en sorte que le premier critère soit toujours inférieur au 2e ?

    Je suis un peu perdu.
    Qu'y a-t-il dans les onglets ?
    Alors, oui, je dois quelques explications. Dans un de mes posts, il y avait un exemple de ma base et des formulaires que j'avais commencé. Il y en avait un avec des onglets. Ce formulaire permettait à l'utilisateur de faire des critères en fonction de tous les critères tandis que celui du moment se base sur les requêtes principales seulement.Donc, le 2e regroupe tous les critères par onglet, c'est-à-dire que j'ai un onglet qui correspond à tous les critères sur l'aspect temporel (choix de la date, du jour, de l'heure...), un autre onglet sur l'aspect spatial (l'adresse, le numéro...) et d'autres sur les autres critères (sur les véhicules, les personnes...). Donc j'ai plusieurs onglets et dans l'en-tête du formulaire, j'ai mon bouton "Rechercher" qui contrairement à celui dans le "formulaire de sélection simple" que j'essaie de faire en ce moment (heureusement avec toi), doit renvoyer vers un résultat situé ailleurs que sur le formulaire. En effet, avec les onglets, je n'ai pas la place d'afficher les résultats. Il faut donc que soit j'ouvre un nouveau formulaire, soit un état ou autre solution...J'avais pensé mettre des graphiques si c'était possible, ce genre de choses...Mais si c'est trop compliqué, je ferai juste un formulaire simple avec les résultats.

    Bon, encore merci, bonne journée LedZepII.

  14. #34
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    J'ai changé de tactique pour les contrôles txtAge1 et txtAge2.
    Je n'utilise plus le contrôle de validité intégré.

    Ouvre le formulaire en mode création et vérifie que le contenu des propriétés "Valide si" et "Message si erreur" sont bien vides pour les deux contrôles.

    Voici le code de l'événement "Sur Sortie" des deux zones de textes :
    Code vb : 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
    Private Sub txtAge1_Exit(Cancel As Integer)
    If IsNumeric(Me.txtAge2) Then
       ' Âge2 déjà saisi. On vérifie que Âge1 <= Âge2
       If Nz(Me.txtAge1, 999) > Me.txtAge2 Then
          MsgBox "Entrez une valeur inférieure à " & CStr(Me.txtAge2)
          Cancel = True
       End If
    End If
    End Sub
     
    Private Sub txtAge2_Exit(Cancel As Integer)
    If IsNumeric(Me.txtAge1) Then
       ' Âge1 est saisi. On vérifie que Âge2 >= Âge1
       If Nz(Me.txtAge2, 0) < Me.txtAge1 Then
          MsgBox "Entrez une valeur supérieure à " & CStr(Me.txtAge1)
          Cancel = True
       End If
    Else
       ' Âge1 n'est pas saisi.
       ' Si Âge2 est un nombre, on force la saisie de Âge1
       If IsNumeric(Me.txtAge2) Then
          MsgBox "Vous devez entrer un âge minimum"
          Me.txtAge1.SetFocus
       End If
    End If
    End Sub

    Voici comment ouvrir un autre formulaire.
    Je crée un formulaire nommé fmResultat basé sur la table Total.
    Ça correspond à ton formulaire, mais avec seulement les données.

    Dans le formulaire actuel, ajouter un bouton nommé cmdOpenFmResultat.
    On va faire en sorte que les boutons CmdFiltre et cmdOpenFmResultat partagent la même routine en créant une fonction CreerFiltre :
    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
    Function CreerFiltre() As String
    'Déclaration de variables
    Dim f As String, strVal As String, lgAge1 As Long, lgAge2 As Long
    Dim dtHeure1 As Date, dtHeure2 As Date
     
    ' Contrôle Rjour        Champ Jsem (Texte)
    strVal = Nz(Me.Rjour, "")
    If strVal <> "" And strVal <> "- - Choisir - -" Then
       If f <> "" Then f = f & " AND "
       f = f & "Jsem = """ & strVal & """"
    End If
     
    ' SELECTION DE L AGE
    lgAge1 = Nz(Me.txtAge1, 0)
    lgAge2 = Nz(Me.txtAge2, 0)
    If lgAge1 <> 0 And lgAge2 <> 0 Then
       If f <> "" Then f = f & " AND "
       f = f & "AgU BETWEEN " & CStr(lgAge1) & " AND " & CStr(lgAge2)
    End If
     
    '  ... autres critères ....
     
    CreerFiltre = f
    End Function
    Le code du bouton CmdFiltre est maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub CmdFiltre_Click()
    Dim f As String
     
    f = CreerFiltre()
    'Activation du filtre
    Me.Filter = f
    Me.FilterOn = True
     
    End Sub
    J'ai donc déplacé la majeure partie du code qui était dans CmdFiltre_Click() dans la fonction CreerFiltre().
    Comme ça je peux réutiliser le code.

    Code du bouton cmdOpenFmResultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub cmdOpenFmResultat_Click()
    Dim strWhere As String
     
    strWhere = CreerFiltre()
    DoCmd.OpenForm "fmResultat", , , strWhere
    End Sub
    Je t'ai dit une bêtise la dernière fois sur l'argument WhereCondition.
    Il s'agit bien d'un filtre, appliqué au formulaire que l'on ouvre avec DoCmd.OpenForm.


    Concernant les graphiques, je ne suis pas un pro.
    Mais ça me paraît être une chose différente d'une recherche multicritères.
    C'est plutôt de l'analyse. Nbre de, Quantité de, Somme de ... par ...
    Il faut donc d'abord définir ce que le ou les graphiques doivent représenter et s'il y a des paramètres sur lesquels on peut filtrer.

    A+

  15. #35
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Salut,

    Ok pour l'âge...juste une petite précision : si on sélectionne le même chiffre dans les 2 textbox, on obtient une sélection uniquement sur cet âge, c'est çà ? Idem pour les tranches horaires ?

    Ensuite, je me suis aperçu que l'utilisateur pouvait modifier la base dans mes formulaires...Comment faire pour lui interdire une modification ou encore mieux, comment faire apparaitre un message disant en gros "vous venez de modifier la table de base, souhaitez-vous continuer ou revenir à l'état initial ?"...un truc dans ce genre...

    Pour l'ouverture d'un nouveau formulaire, je vais tester et je te tiens au courant, mais çà me parait être une bonne idée de reprendre le code.

    Concernant les graphiques, je ne suis pas un pro.
    Ben déjà, pour moi, c'est déjà énorme car j'ai pas mal avancé et appris grâce à toi...Donc les graphiques, je verrai plus tard. J'essaierai notamment de faire des sortes de camembert avec la répartition entre les tués, les blessés hospitalisés, les non hospitalisés...mais on en est pas là...

    En tout cas, merci. On vient au bout du premier formulaire.

    A+

  16. #36
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    si on sélectionne le même chiffre dans les 2 textbox, on obtient une sélection uniquement sur cet âge, c'est çà ? Idem pour les tranches horaires ?
    C'est ça oui.

    Pour protéger les enregistrements :
    • Interdire ajouts et suppressions.
      Au niveau du formulaire, mettre la propriété "Ajout autorisé" à "Non", "Suppr autorisée" à "Non"
    • Interdire les modifications.
      On ne peut pas le faire au niveau du formulaire, car cela affecterait aussi les contrôles de l'en-tête.
      Il faut le faire pour tous les contrôles se trouvant dans la section Détail.
      Mettre la propriété "Verrouillé" à "Oui", pour tous les contrôles se trouvant dans Détail.

    On peut aussi le gérer avec les événements formulaire "Avant insertion", "Sur Suppression", "Avant MAJ".
    Exemple :
    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
    ' Formulaire : Avant insertion
    Private Sub Form_BeforeInsert(Cancel As Integer)
    MsgBox "Ajout non autorisé"
    Cancel = True
    End Sub
     
    ' Formulaire : Avant MAJ
    Private Sub Form_BeforeUpdate(Cancel As Integer)
    MsgBox "Modification non autorisée"
    Me.Undo
    End Sub
     
    ' Formulaire : Sur Suppression
    Private Sub Form_Delete(Cancel As Integer)
    MsgBox "Suppression non autorisée"
    Cancel = True
    End Sub
    Pour interroger l'utilisateur en cas d'enregistrement modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ' Formulaire : Avant MAJ
    Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim iRep As Integer
    iRep = MsgBox("Voulez-vous sauver les modifications ?", _
                  vbYesNo + vbQuestion, _
                  "L'enregistrement a été modifié")
    If iRep <> vbYes Then
        Me.Undo
    End If
    End Sub
    Pour les graphiques, regardes ce tuto : génération de graphiques pour vos applications Access.
    C'est assez proche, selon moi, d'un graphique Excel.

    Sinon il faut s'orienter vers l'affichage en mode graphique croisé dynamique des formulaires.

    A+

  17. #37
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Désolé pour ce petit retard, et merci pour les renseignements.

    J'ai donc utilisé les propriétés des contrôles et des formulaires pour empêcher l'utilisateur de modifier la base.

    Sinon, j'avais fait un code afin de pouvoir trier les étiquettes par ordre croissant ou alphabétique. Ça fonctionne bien pour les colonnes avec des caractères ou des dates mais pour les chiffres, c'est pas çà. En effet, je n'obtiens pas un ordre croissant. Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub EtNumero_Click()
     
     Me.Tcol.SetFocus
        If Me.OrderBy = "[Total].[Numero]" Then
        DoCmd.RunCommand acCmdSortDescending
    Else
      DoCmd.RunCommand acCmdSortAscending
    End If
     
    End Sub
    Sinon, comment faire en sorte aussi de faire des sortes de raccourci, permettant à l'utilisateur d'appuyer sur "entrée" par exemple pour effectuer la recherche (c'est-à-dire au lieu de cliquer sur le bouton)...

    Une petite amélioration qui est sans doute possible : si tu te souviens, j'ai une liste déroulante avec les jours de la semaine (lundi...) mais dans la liste, les jours ne se suivent pas comme ils devraient...(par exemple, je passe du dimanche au jeudi au lundi...). Comment faire en sorte de reclasser les jours ?

    Et enfin, est-ce qu'il est possible, de sélectionner plusieurs choix dans une liste déroulante, ou c'est trop tard ? Par exemple, il serait bien de pouvoir sélectionner les mois de juillet et août en même temps pour savoir combien d'accidents il y a eu pendant les vacances scolaires estivales...ce genre de choses.

    Bon, merci beaucoup. Bonne journée

  18. #38
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Re,

    J'ai encore d'autres questions qui me sont venues au fil de la journée...J'espère que je te saoule pas trop avec tout çà...

    - Alors comment pourrais-je faire pour sélectionner une heure exacte et non une tranche horaire ?

    - je voudrais supprimer le volet qui se situe sur la gauche du formulaire...c'est une sorte de bande grise avec une flèche...je sais pas si tu vois ce que çà peut être. Je te rappelle que je bosse avec Access 2007 au cas où...Même question pour l'avertissement de sécurité à chaque ouverture de la base...

    - j'ai créé un nouveau formulaire (et oui encore un), sur un sujet connexe : j'ai une table avec l'origine et la destination des gens, le motif du déplacement etc...et je voudrais faire quelques requêtes...j'ai donc réutilisé certains codes du premier formulaire mais certains ne fonctionnent plus (comme le bouton effacer par exemple). Je te mets un extrait de ma base en pièce jointe ainsi que le formulaire que j'ai commencé (l'un se nomme "Accueil" et l'autre qui m'intéresse "Requêtes"). Bon, dans ce cas là, j'aurais besoin de tes conseils, encore et toujours, si tu es d'accord. Car je vais utiliser d'autres contrôles encore inconnus jusqu'alors, comme les cases à cocher...si je coche çà, çà rend visible çà...et puis j'aurais pas mal de statistiques à faire...par exemple, savoir combien d'artisans vont à tel endroit, ce genre de choses...Le fait d'avoir qu'une seule table est peut-être problématique dans ce cas ?

    Bon, je continuerai plus tard. Merci encore. Bonne soirée

  19. #39
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    • Le tri ne fonctionne pas sur le champ numéro car il est de type texte, et non numérique.
      Le tri se fait donc sur des chaînes de caractères. Il s'effectue caractère par caractère en partant de la gauche.
      "1"
      "10"
      "100"
      "1000"
      "2"
      "20"
      "200"

      "1000" est plus petit que "2" car le premier caractère de "1000" ("1") est plus petit que "2".

    • comment faire en sorte aussi de faire des sortes de raccourci, permettant à l'utilisateur d'appuyer sur "entrée" par exemple pour effectuer la recherche
      Ouvrir le formulaire en mode création et afficher les propriétés.
      Allez dans l'onglet Evénements.
      Tout en bas, mettre "Aperçu des touches" à "Oui".
      Gérer l'événement "Sur touche activée" avec une procédure événementielle comme suit:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If KeyAscii = 13 Then Call CmdFiltre_Click
      On appelle simplement la procédure événementielle "sur clic" du bouton "CmdFiltre".
      Au passage j'ai modifié le code pour désactiver le filtre si ce dernier est vide.
      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
      Private Sub CmdFiltre_Click()
      'Déclaration de variables
      Dim f As String
       
      f = CreerFiltre()
       
      ' Activation/désactivation du filtre
      Me.Filter = f
      If Len(f) > 0 Then
         Me.FilterOn = True
      Else
         Me.FilterOn = False
      End If
       
      End Sub


    • j'ai une liste déroulante avec les jours de la semaine (lundi...) mais dans la liste, les jours ne se suivent pas comme ils devraient...
      Le plus simple c'est de créer une table tblJourSemaine avec un champ Jour (Texte) et un champ NumJour (Numérique).
      Champ clé = Jour
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      Jour	NumJour
      Dim	7
      Jeu	4
      Lun	1
      Mar	2
      Mer	3
      Sam	6
      Ven	5
      Et la requête Jour devient
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      SELECT Total.JSem
      FROM Total INNER JOIN tblJourSemaine ON Total.JSem = tblJourSemaine.Jour
      GROUP BY Total.JSem, tblJourSemaine.NumJour
      ORDER BY tblJourSemaine.NumJour;

    • est-ce qu'il est possible, de sélectionner plusieurs choix dans une liste déroulante
      Non, il faut une zone de liste. Là on peut activer la sélection multiple.
      Avec une zone de liste Rmoismulti (mêmes propriétés "Contenu", "colonnes liée", "Nbre de colonnes", "largeurs colonnes" que Rmois) ça donnerait ça :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      ' Contrôle Rmoismulti
      If Rmoismulti.ItemsSelected.Count > 0 Then
         If f <> "" Then f = f & " AND "
         f = f & "Month([Date]) IN ("
         For i = 0 To Rmoismulti.ItemsSelected.Count - 1
             If i > 0 Then f = f & ", "
             f = f & Rmoismulti.Column(1, Rmoismulti.ItemsSelected(i))
         Next
         f = f & ")"
      End If
      Si je sélectionne janvier, juin, novembre par exemple ça crée un critère
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      Month([Date]) IN (1, 6, 11)

      Modifications de CmdEffacer_Click() pour tenir compte de la zone de liste.
      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
      Private Sub CmdEffacer_Click()
      Dim ctl As Access.Control, i As Integer
       
      For Each ctl In Me.Section(acHeader).Controls
          Select Case ctl.ControlType
              Case acComboBox, acTextBox
                   If Len(ctl.DefaultValue) > 0 Then
                      ctl = Eval(ctl.DefaultValue)
                   Else
                      ctl = Null
                   End If
              Case acListBox
                   For i = 0 To ctl.ListCount - 1
                       ctl.Selected(i) = False
                   Next
          End Select
      Next
       
      Me.FilterOn = False
      Me.Filter = ""
      End Sub

  20. #40
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Merci pour ces premières réponses. J'ai fait plusieurs choses :

    - j'ai donc créé une nouvelle colonne Numéro de type numérique pour pouvoir trier par ordre croissant. Ça fonctionne. Merci de me l'avoir fait remarquer.

    - le raccourci "Entrée" fonctionne mais au bout de plusieurs clics. Je m'explique : quand je sélectionne un critère dans une de mes listes, et si j'appuie sur "Entrée", le curseur se place sur le contrôle suivant...au bout de quelques clics et le passage sur d'autres contrôles, j'arrive enfin au bouton "Rechercher" et le tri s'exécute. Comment faire pour aller directement sur le bouton ?

    - pour le tri sur les jours, j'ai donc créé une nouvelle table et j'ai adapté ma requête en y ajoutant une colonne avec le vrai nom des jours. Mais, maintenant, mon tri sur les jours ne fonctionne plus. Je mets le code ainsi que la requête SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ' SELECTION DU JOUR DE LA SEMAINE
    strVal = Nz(Me.Rjour_sem, "")
    If strVal <> "" And strVal <> "- - Choisir - -" Then
       If f <> "" Then f = f & " AND "
       f = f & "Jsem = """ & strVal & """"
    End If
    J'imagine qu'il faut que je change Jsem en Nom_jour de ma 2e table mais si je fais çà, dès que je clique sur mon bouton, j'arrive sur une nouvelle fenêtre me demandant de sélectionner un jour...

    La requête SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Jour_semaine.Nom_jour
    FROM Total INNER JOIN Jour_semaine ON Total.JSem = Jour_semaine.Jour
    GROUP BY Total.JSem, Jour_semaine.NumJour, Jour_semaine.Nom_jour
    ORDER BY Jour_semaine.NumJour;
    - pour la possibilité de faire plusieurs choix dans une liste : avant que je modifie quoique ce soit, sera-t-il toujours possible de ne faire qu'un seul choix ou pas de choix du tout ?

    - pour les listes à cocher sur la nouvelle base (nouveau formulaire), j'ai fait çà...mais j'arrive pas à rendre visible les 2 éléments (l'étiquette et le contrôle) : voici le code mais il faut sans doute rajouter un élément, comme un AND, je sais pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Opt_Gratuit_AfterUpdate()
     
    If Me.Opt_Gratuit = False Then
            Me.RType_gratuit.Visible = False
            Me.EtType_gratuit.Visible = False
        ElseIf Me.Opt_Gratuit = True Then
            Me.RType_gratuit.Visible = True
            Me.EtType_payant.Visible = True
        End If
     
    End Sub
    - pour sélectionner uniquement une heure précise, j'ai fait çà et çà a l'air de fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'SELECTION DE L'HEURE PRECISE
    strVal = Nz(Me.TxtHeure, "")
    If strVal <> "" And IsDate(strVal) Then
       If f <> "" Then f = f & " AND "
       f = f & "[Heure]=#" & Format(CDate(strVal), "hh:nn") & "#"
    End If
    Merci pour tes explications. Bonne journée

Discussions similaires

  1. Requête sur plusieurs listes déroulantes
    Par Olivierporcinet dans le forum Access
    Réponses: 3
    Dernier message: 07/05/2012, 09h50
  2. Liste déroulante dans cellule. Bouton n'apparait pas
    Par pat91 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/05/2010, 16h23
  3. Liste déroulante dans cellule. Bouton n'apparait pas
    Par JML62400 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/02/2009, 06h44
  4. [MySQL] Faire apparaître la sélection d'une liste déroulante dans une zone de texte
    Par emmy99 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 30/03/2008, 14h11
  5. Réponses: 2
    Dernier message: 15/02/2008, 14h48

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