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 :

Résultat (Tableau) d'une requête dans un formulaire


Sujet :

Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 7
    Points
    7
    Par défaut Résultat (Tableau) d'une requête dans un formulaire
    Bonjour,

    J'ai actuellement un formulaire qui me retourne entre autres, le résultat d'une requête (via un sous formulaire) et me l'affiche tel quel.
    La requête est paramétrée de telle sorte, que le tri se fasse en fonction de choix à faire dans un menu déroulant.
    Et tout marche.

    Oui mais voilà, je veux aller plus loin.
    1) J'aimerais d'une part pouvoir choisir les colonnes qui vont apparaître dans la requête. J'en ai de base 3, j'aimerais pouvoir donner à l'utilisateur la possibilité d'en rajouter deux ou trois de plus (via un menu déroulant par exemple).
    Pour ça j'ai écrit dans ma requête, dans la case ième"champ":
    [Formulaires]![NomduFormulaire]![MenuDéroulantN°i]
    Une chose est sur, ça ne marche pas !!!
    Est-ce faisable ? si oui, comment ?

    2) Suite à l'affichage de la requête, l'utilisateur peut ensuite utiliser les filtres (supposons le classement par années), pour n'afficher que de 2009 à 2012.
    Via un DAvg (Me.Resultat = DAvg("[Prix]", "Req_Selection"), je calcule ensuite le prix moyen des produits, grâce à la requête. Mais le filtre appliqué dans le sous-formulaire ne se répercute pas dans la requête. La moyenne se fait donc sur tous les produits "initialement sélectionnés" et pas uniquement ceux de 2009 à 2012.
    Bref là encore, est-ce faisable, et si oui comment ?

    En espérant avoir été clair, et que l'on puisse m'aider

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Pour le point 1 regarde ici : http://access.developpez.com/cours/?...#formrecherche

    Cela répondra peut-être à tes questions.

    Pour le point 2 il faudrait transférer le filtre du formulaire au SQL de la requête. Après la lecture de http://access.developpez.com/cours/?...#formrecherche tu devrais être capable de le faire.

    Autre solution assez simple consite à mettre comme condition Where de ta requête les infos du formulaire. Pour te référer au contenu d'un champ dans une requête, il suffit d'écrire :

    [Forms]![NomTonForm]![NomTonChamp]A+

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour ta réponse marot_r !
    Je me suis penché sur tous ces tutos et j'avoue que j'ai du mal à voir le truc. Il faut dire que mes connaissances sont peut-être un peu limitées...

    Citation Envoyé par marot_r Voir le message
    Autre solution assez simple consite à mettre comme condition Where de ta requête les infos du formulaire. Pour te référer au contenu d'un champ dans une requête, il suffit d'écrire :

    [Forms]![NomTonForm]![NomTonChamp]
    Je ne comprends pas trop. Si j'ajoute ça dans le WHERE te ma requête, plus aucun résultat ne s'affiche dans mon sous-formulaire.
    Si je comprends bien, la requête cherche une condition dans le sous-formulaire et vice-versa.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Ton point 1, les colonnes optionnelles n'a rien de simple.

    En y réféchissant, si le nombre de colonnes est limité fixe et connus, la solution la plus simple serait de les avoir tout le temps dans le résultat et de les masquer si l'utilisateur n'en veut pas. Ce sera BEAUCOUP moins compliqué que de les créer à la volée.

    Pour ton point 2,

    D'abord, essaye la requête sans aucun formulaire ouvert, juste la requête paramétrée et à l'invite entre une valeur valide. Contrôle que tu as bien le résultat attendu.

    Ensuite essaye en ajoutant à l'événement Après MAJ de ton champ critère sur le formulaire principal le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    me.NomTonSousForm.Form.Refresh
    Cela devrait forcer la mise à jour de la source de données de ton sous formulaire et faoire en sorte que les nouveaux critères soient pris en compte.

    Pour masquer les colonnes, il va falloir un peu de programmation mais dans l'instant je ne me souvient plus comment on fait cela.

    Je devrait être capable de te revenir là dessus demain. Sinon tu peux essayer une recherche dans Google avec comme critères : hide column in form vba microsoft access cela devrait donner des résultats intéressants.

    A+

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Ton point 1, les colonnes optionnelles n'a rien de simple.

    En y réféchissant, si le nombre de colonnes est limité fixe et connus, la solution la plus simple serait de les avoir tout le temps dans le résultat et de les masquer si l'utilisateur n'en veut pas. Ce sera BEAUCOUP moins compliqué que de les créer à la volée.
    J'ai écrit ça dans mon code mais ça ne marche pas trop... J'ai essayé après MAJ du champ et clique sur un bouton, le résultat reste le même...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub cmbAffichChamps_AfterUpdate()
    If Me.cmbAffichChamps = "Prix" Then
            Me.SousFormulaire.Form!Prix.Visible = False
        Else
            Me.SousFormulaire.Form!Prix.Visible = True
    End If
     
    Forms!Formulaire!SousFormulaire.Form.Requery
    End Sub
    Pour le 2e point, je pense que je me suis peut-être pas bien expliqué.
    En fait le sous-formulaire m'affiche le résultat de ma requête. Quand je parle par exemple de "trier" par année, je n'utilise donc plus de zone de liste déroulante, etc..., mais simplement le "tri basique" proposé dans chaque champs. Du coup je ne sais pas comment faire référence au résultat.
    J'avais bien pensé à quelque chose du genre:
    "faire la moyenne de prix, dans SousFormulaires, si les données sont affichées"

    Problème: Comment je mets ça en place ? Une condition qui vérifie si un champs est affichée je connais, mais qu'en est-il de n'utiliser que les lignes affichées ?

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Pour le point 1, c'est la bonne idée mais la mauvaise propriété. Je n'ai pas eu le temps de trouver mais je devrais être capable de le faire aujourd'hui.

    A+

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    La propriété est ColumnHidden

    Ton code devrait ressembler à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Me.cmbAffichChamps = "Prix" Then
            Me.SousFormulaire.Form!Prix.ColumnHidden = true
        Else
            Me.SousFormulaire.Form!Prix.ColumnHidden = false
    End If

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    La propriété est ColumnHidden
    Ouah mais c'est parfait ça, elle marche bien cette propriété
    Merci

    Par contre pour ce qui est de la mise à jour de ma requête source, après le tri de celle-ci effectué depuis mon sous-formulaire, je suis toujours dans les choux

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Pour le 2e point, je pense que je me suis peut-être pas bien expliqué.
    En fait le sous-formulaire m'affiche le résultat de ma requête. Quand je parle par exemple de "trier" par année, je n'utilise donc plus de zone de liste déroulante, etc..., mais simplement le "tri basique" proposé dans chaque champs. Du coup je ne sais pas comment faire référence au résultat.
    J'avais bien pensé à quelque chose du genre:
    "faire la moyenne de prix, dans SousFormulaires, si les données sont affichées"

    Problème: Comment je mets ça en place ? Une condition qui vérifie si un champs est affichée je connais, mais qu'en est-il de n'utiliser que les lignes affichées ?
    Pourrais-tu mettre un exemple de ce que tu attends, parce que c'est un peu flou pour moi.

    A+

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Voici un extrait de mon formulaire (les données sont en Allemand)

    Nom : Formulaire_Mittelwerte.png
Affichages : 1108
Taille : 33,5 Ko

    L'utilisateur voit apparaître dans ce tableau, la liste des véhicules correspondant aux critères paramétrés plus haut. Suite à quoi il choisit l'affichage des "propriétés" qui lui semblent importantes.
    L'affichage du tableau en lui-même se fait dans un sous-formulaire qui fait appelle au résultat d'une requête. Tout le reste se fait sur le formulaire principal.

    En dessous de ce tableau, l'utilisateur a ensuite la possibilité d'afficher des valeurs moyennes. Celles-ci sont calculées depuis la requête.
    Et c'est la qu'intervient le problème. Si les données ont été filtrées comme sur le screen shot, cela n'est pas répercuté dans la requête et donc dans mon calcul de moyenne.

    J'ai donc pensé à deux solutions:
    a) trouver un moyen de mettre la requête à jour. Or si je paramètre la requête pour aller chercher les données du sous-formulaire, c'est un serpent qui se mort la queue. Le Sous-formulaire cherche des données dans la requête...qui les cherche dans le sous-formulaire.
    A moins qu'il existe un moyen de mettre tout ça à jour sans faire vraiment appel aux données.

    b) Calculer les moyennes depuis les données affichées par le sous-formulaire. Mais ça, je ne sais pas comment on fait....


    J'espère que ma question est un peu plus claire ainsi. Et surtout qu'elle trouvera une réponse

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Comme on dit une image vaut mille maux (non ce n'est pas une faute d'orthographe :-).

    Ok, je vois le problème. Est-ce que l'application d'un filtre déclenche un des événement (ex OnFilter) si oui tu pourrais peut-être utiliser cela pour filtrer ta source ou alors faire une fonction qui calcul tes moyennes et autre à partir du filtre du formulaire. Personnellement je choisirai cette solution qui offre beaucoup de souplesse.

    Pour faire cela il faut déclarer une fonction public dans un module, un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function CalculerMoyenne(prmFiltre as string) as double
       'Ici le code nécessaire pour le calcul
    end function
    et à l'usage quelque chose comme :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select taSource.TonChamp, CalculerMoyenne([forms]![NomTonForm].Filter) as TaMoyenne from TaSource

    Je n'ai pas testé si cela marche mais c'est ce que j'essairai.

    A+

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Est-ce que l'application d'un filtre déclenche un des événement (ex OnFilter)
    C'est bien là la question. Je ne sais pas comment accéder à ce filtre (et donc son résultat), puisque c'est Access qui le génère automatiquement.
    J'ai beau chercher, je ne sais pas où trouver l'information.

  13. #13
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    [forms]![NomTonForm].Filterne marche pas ?

    A+

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    J'ai essayé de le mettre comme condition dans ma requête: ça me retourne une requête vide.

    Du coup, j'ai essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim strSQL As String
    strSQL = "SELECT [Forms]![MonSousFormulaire].* FROM [Forms]![MonSousFormulaire] WHERE [Forms]![MonSousFormulaire].Filter"
    CurrentDb.QueryDefs("Requête2").SQL = strSQL
    L'idée étant ensuite d'appliquer ma formule de moyenne sur cette 2e requête. Mais un SQL SELECT sur un formulaire n'est apparemment pas possible.
    Donc, il me faudrait convertir mon SousFormulaire en table.
    Ca non plus je sais pas faire
    C'est reparti, je cherche

Discussions similaires

  1. [PDO] PDO : Insérer le résultat retourné par une requête dans un tableau
    Par Encephalopatie dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 17/01/2015, 15h22
  2. [AC-2007] Affichage le résultat d'une Requête dans un formulaire
    Par patb12 dans le forum VBA Access
    Réponses: 4
    Dernier message: 14/08/2014, 07h41
  3. [AC-2010] Afficher le résultat d'une requête dans un formulaire
    Par Ethana dans le forum IHM
    Réponses: 4
    Dernier message: 30/11/2012, 20h17
  4. Réponses: 3
    Dernier message: 26/09/2011, 21h27
  5. Réponses: 12
    Dernier message: 14/04/2008, 10h52

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