IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Liste en cascade d'après des requêtes et non des tables avec exception


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut Liste en cascade d'après des requêtes et non des tables avec exception
    Bonjour à tous,

    J'ai un formulaire avec des listes déroulantes indépendants qui servent à filtrer les informations dudit formulaire.

    Ces listes déroulantes sont issues de la table à laquelle le formulaire est relié ; de cette manière, je suis sûre que les données de la liste déroulantes sont celles qui ont été saisies dans le formulaire.

    Maintenant, j'aimerais que lorsque je filtre par 2Bureau, alors la liste déroulante de 3Office soit mise à jour et que seuls les enregistrements qui y correspondent soient visibles. Toutefois, il se peut que l'utilisateur ne veuille filtrer que par 3Office, sans tenir compte de 2Bureau. Dans ce cas, je voudrais que la liste 3Office soit intacte.

    Je vous laisse un fichier test pour jouer avec et vous remercie énormément de votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Bonjour,

    Il est possible de définir la source de la liste lors de l'évènement maliste_enter avec par exemple un truc comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maliste.recordsource = "select ... where " & me.filter
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    Bonjour Nico,

    Bon ! J'ai fini par y arriver ! En montant mes requêtes ainsi :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Tb_Survey.[3Office], Tb_Survey.[2Bureau]
    FROM Tb_Survey
    GROUP BY Tb_Survey.[3Office], Tb_Survey.[2Bureau]
    HAVING (((Tb_Survey.[2Bureau])=[Formulaires]![Fm_SurveyList]![FltBureau]))
    ORDER BY Tb_Survey.[3Office];

    Mais il me reste un souci à régler : si je ne choisis rien dans le filtre de Bureau, je voudrais que la liste du filtre Office soit complète. Si je ne choisis rien dans Bureau ni Office, je voudrais que la liste du filtre Section soit complète, etc. (pour le moment, elles sont vides ou contiennent la dernière valeur tant que je ne choisis rien dans le filtre précédent). J'ai pourtant bien ajouté le code "AfterUpdate" ("Après MAJ") pour chacun des contrôles.

    Est-ce que vous avez la solution ? (C'était ça mon exception dans le titre.... )

    Encore merci.

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Personnellement je fais tout en VBA et j'ai beaucoup de mal avec le SQL "au standard access" qui n'a rien de standard

    D'autre part la mise à jour du select doit se faire "à l'arrivée dans la liste" et non "after update"

    Enfin le code VBA permet si besoin d'utiliser des tests ce qui permet bien plus de possibilités (et est plus simple à maintenir) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub maliste_Enter()
    if me.filter="" then
      maliste.recordsource="SELECT DISTINCT 3Office, 2Bureau FROM Tb_Survey order by 1,2;"
    else
      maliste.recordsource="SELECT DISTINCT 3Office, 2Bureau FROM Tb_Survey WHERE " & me.filter & " order by 1,2;"
    end if
    end sub
    Ainsi la liste est complète au début et s'affine au besoin
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    Bonsoir Nico !

    Merci pour le code ! Mais il y a des ajustements en vue...

    Voici le code tel que je l'ai copié dans l'événement "Sur entrée" de mon contrôle filtre qui s'appelle FltOffice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub FltOffice_Enter()
    If Me.Filter = "" Then
      FltOffice.RecordSource = "SELECT DISTINCT 3Office, 2Bureau FROM Tb_Survey order by 1,2;"
    Else
      FltOffice.RecordSource = "SELECT DISTINCT 3Office, 2Bureau FROM Tb_Survey WHERE " & Me.Filter & " order by 1,2;"
    End If
    End Sub
    Lorsque j'essaye de choisir une valeur dans la liste, j'obtiens "Membre ou méthode de données introuvable" qui pointe sur ".recordsource".

    J'ai donc fait des recherches et j'ai trouvé plus logique de remplacer ".recordsource" par ".controlsource" (?). J'ai donc testé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub FltOffice_Enter()
    If Me.Filter = "" Then
      FltOffice.ControlSource = "SELECT DISTINCT 3Office, 2Bureau FROM Tb_Survey order by 1,2;"
    Else
      FltOffice.ControlSource = "SELECT DISTINCT 3Office, 2Bureau FROM Tb_Survey WHERE " & Me.Filter & " order by 1,2;"
    End If
    End Sub
    et là j'obtiens #nom ? dans mon contrôle... Et en plus, mon bouton pour effacer tous les filtres ne fonctionnent plus en présence de ce code : lorsque je clique dessus, j'obtiens "Erreur 2448 - Impossible d'attribuer une valeur à cet objet", et VBA pointe vers . Par contre, si j'efface de VBA le deuxième code ci-dessus, mon bouton Refresh ressuscite...

    J'y comprends plus rien... C'est tout d'ma faute ?

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Oups !
    Désolé, la bonne syntaxe est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FltOffice.RowSource = ...
    C'est un champ indépendant donc .controlsource doit rester vide !
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  7. #7
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    Coucou Nico,

    En premier merci de m'accorder du temps !

    Alors j'ai adapté le code à chacun des mes contrôles filtres :

    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 FltOffice_Enter()
    If Me.Filter = "" Then
      FltOffice.RowSource = "SELECT DISTINCT 3Office, 2Bureau FROM Tb_Survey order by 1,2;"
    Else
      FltOffice.RowSource = "SELECT DISTINCT 3Office, 2Bureau FROM Tb_Survey WHERE " & Me.Filter & " order by 1,2;"
    End If
    End Sub
    Private Sub FltBureau_Enter()
    If Me.Filter = "" Then
      FltOffice.RowSource = "SELECT DISTINCT 2Bureau, 0Parent FROM Tb_Survey order by 1,2;"
    Else
      FltOffice.RowSource = "SELECT DISTINCT 2Bureau, 0Parent FROM Tb_Survey WHERE " & Me.Filter & " order by 1,2;"
    End If
    End Sub
    Private Sub FltSection_Enter()
    If Me.Filter = "" Then
      FltOffice.RowSource = "SELECT DISTINCT 4Section, 3Office FROM Tb_Survey order by 1,2;"
    Else
      FltOffice.RowSource = "SELECT DISTINCT 4Section, 3Office FROM Tb_Survey WHERE " & Me.Filter & " order by 1,2;"
    End If
    End Sub
    Private Sub FltUnit_Enter()
    If Me.Filter = "" Then
      FltOffice.RowSource = "SELECT DISTINCT 4aUnit, 4Section FROM Tb_Survey order by 1,2;"
    Else
      FltOffice.RowSource = "SELECT DISTINCT 4aUnit, 4Section FROM Tb_Survey WHERE " & Me.Filter & " order by 1,2;"
    End If
    End Sub
    Private Sub FltGroup_Enter()
    If Me.Filter = "" Then
      FltOffice.RowSource = "SELECT DISTINCT 4bGroup, 4aUnit FROM Tb_Survey order by 1,2;"
    Else
      FltOffice.RowSource = "SELECT DISTINCT 4bGroup, 4aUnit FROM Tb_Survey WHERE " & Me.Filter & " order by 1,2;"
    End If
    End Sub
    Deux choses ne fonctionnent pas :

    Si je ne choisis rien dans le filtre Bureau (qui précède Office), Office reste désespérément vide aussi. Et j'aimerais bien qu'il contienne toutes ses valeurs puisque je n'ai rien choisi dans Bureau.
    Si je choisis quelque chose dans Bureau, lorsque je clique sur Office, j'ai le message suivant : Erreur de syntaxe (opérateur absent) dans l'expression "3Office".

    Quel casse-tête n'est-ce pas !

  8. #8
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    C'est probablement que l'utilisation de me.filter n'est pas adaptée à ton cas
    Essaie plutot un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub FltOffice_Enter()
    If fltbureau = "" Then
      FltOffice.RowSource = "SELECT DISTINCT 3Office, 2Bureau FROM Tb_Survey order by 1,2;"
    Else
      FltOffice.RowSource = "SELECT DISTINCT 3Office, 2Bureau FROM Tb_Survey WHERE 2bureau='" & fltbureau & "' order by 1,2;"
    End If
    End Sub
    (j'ai supposé que 2bureau était une string d'où les ')
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  9. #9
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    Bonjour Nico,

    Une semaine plus tard... J'ai suivi vos conseils, j'ai inscrit mon code comme vous l'avez indiqué et j'ai toujours le même message.

    Je revérifie mon travail et vous reviens. Merci encore.

  10. #10
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    J'avais un doute et après vérification je confirme qu'access est allergique aux noms qui commencent par des chiffres

    2 solutions :
    - écrire systématiquement [3office]
    - renommer en office3 !
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/12/2013, 10h31
  2. Réponses: 4
    Dernier message: 22/11/2007, 19h23
  3. [Requête] Union de 2 tables avec des colonnes différentes
    Par ceuce dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/05/2007, 17h04
  4. Cohabitation des requêtes UNION et des ORDER BY ?
    Par guidav dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/12/2006, 15h12
  5. Valeur des formulaire réutilisées dans des requètes SQL.
    Par cotmar dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/05/2006, 10h16

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