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écupérer dans une requête un libellé dans une table liste [AC-2007]


Sujet :

Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut Récupérer dans une requête un libellé dans une table liste
    Salut les développeurs

    Je suis sur un projet AC/VBA qui concerne une gestion de parc informatique :
    Ma table principale, TBL_MATERIEL, comporte un certain nombre de champs dont 5 vont piocher des valeurs dans des tables-listes : TBL_CATEGORIE, TBL_SITE, TBL_AGENT, TBL_SITUATION, TBL_REGIME, chacune construite sur le même modèle : par exemple, TBL_SITE comprend 2 champ : ID_SITE et SITE (le libellé).

    J'ai (trop ?) souvent eu recours à des dlookup ou encore des requêtes pleine de jointures (fastidieux avec les réglages de colonnes de la zone de liste, etc.) pour chercher la valeur du libellé dans une table en fonction de la clé étrangère récupérée dans la table principale.

    J'ai voulu tenter quelque chose de nouveau, avec des noms très logiques et normés comme décrit plus haut : faire une petite fonction pour mes requêtes.

    Exemple concret avec un formulaire-moteur de recherche multicritère "cafeine-like", vous savez, celui qui récupère les résultats dans une zone de liste... Et évidemment, je n'aime pas lire les clés brutes dans un tableau sans avoir la correspondance derrière.

    Alors avec une petite fonction dans la requête de type
    SELECT ID_MAT, ChercheValeurDe(ID_SITE,"SITE"), ce serait pas mal :

    Voilà ce que ça donne :

    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
     
    Public Function ChercheValeurDe(valeur, nom) As String
    'valeur est le nom du champ requeté; nom est le param envoyé à la fonction
    'pour construire dynamiquement le dlookup
    'en SQL : SELECT ID_MAT, ChercheValeurDe(ID_CATEGORIE,"CATEGORIE") FROM 'TBL_MATERIEL WHERE ID_MAT < 10;
     
    Dim sChamp As String
    Dim sTable As String
    Dim sCritere As String
     
    sChamp = nom
    sTable = "TBL_" & nom
    sCritere = "ID_" & nom & "=" & valeur + 1
    ChercheValeurDe= DLookup(sChamp, sTable, sCritere)
    'Debug.Print ChercheValeurDe
     
    End Function
    Alors déjà, je suis obligé de mettre valeur + 1 le code soustrait 1 à la valeur du champ ID_CATEGORIE... D'où ça vient ?

    Et peut être qu'il y a encore un truc plus simple qui m'échappe (sachant que dans la table générale, je remplis avec des listes déroulantes sur les tables listes...)

    Si quelqu'un peut m'éclairer, 1000 mercis

    ___
    Edit 12.16 -> requete avec jointures pour le rowsource de la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL = _
        "SELECT TBL_MATERIEL.ID_MAT, TBL_CATEGORIE.CATEGORIE AS TYPE, TBL_MATERIEL.LIB_MAT AS LIBELLE, TBL_MATERIEL.ANNEE_ACQ AS ANNEE, " & _
        "Round(TBL_MATERIEL.VAL_NEUF_TTC,2) AS VALEURTTC, TBL_REGIME.REGIME AS REGIME, TBL_SITUATION.SITUATION AS SITUATION, TBL_SITE.SITE AS SITE " & _
        "FROM ((((TBL_MATERIEL LEFT JOIN TBL_CATEGORIE ON TBL_MATERIEL.ID_CATEGORIE = TBL_CATEGORIE.ID_CATEGORIE) LEFT JOIN TBL_AGENT ON " & _
        "TBL_MATERIEL.ID_AGENT = TBL_AGENT.ID_AGENT) LEFT JOIN TBL_REGIME ON TBL_MATERIEL.ID_REGIME = TBL_REGIME.ID_REGIME) LEFT JOIN TBL_SITE ON " & _
        "TBL_MATERIEL.ID_SITE = TBL_SITE.ID_SITE) LEFT JOIN TBL_SITUATION ON TBL_MATERIEL.ID_SITUATION = TBL_SITUATION.ID_SITUATION;"
    La aussi j'ai un décalage de 1 !!! Ma base est corrompue ???
    ___
    Guillaume

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Bonjour,
    Les fonctions de domaine dans les requêtes sont à éviter. A moins de vouloir se faire pourrir par les utilisateurs, qui forcément incrimineront le produit et non la manière de l'utiliser (voir le tuto sur les perfo sur ma page perso).

    Concernant les fonctions liées au tuple, il faut obligatoirement faire passer l'id unique du sus-dit tuple, sinon la fonction n'est jouée qu'une et une seule fois, au premier appel. Elle donne donc toujours la même valeur.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select Id, mafonction(id, id_site, info) as info ....
    Et donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function mafonction(vvid, vvid_site) as string
     
    if vvid_site > 0 then
       mafonction = "mon code"
    endif
     
    end function
    Tu as noté que id n'est pas utilisé dans la fonction, c'est normal il faut juste le passer.

    A moins de générer du SQL dans VBA suivant des fonctions je ne vois pas comment tu peux simplifier tes requêtes.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Salut Loufab et merci pour tes conseils (ici et ailleurs !).

    Quand tu déconseille d'utiliser des fonctions de domaine dans les requêtes, tu parles des fonctions en elles-même ou tu étends le problème à ma fonction qui elle même appelle une fonction de domaine ?

    En attendant ma fonction fonctionne correctement, mais comme abordé dans cet autre post http://www.developpez.net/forums/d12...robleme-connu/, j'ai eu de gros problèmes avec mes clés et ai désactivé la zone de liste directement dans la table, au profit de formulaires avec des zones de listes.

    ça marche mieux maintenant...

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Bonjour,

    Que ta requête appelle une fonction de domaine ou que la fonction de domaine soit appelé par une fonction utilisateur par ta requête c'est la même chose.

    Il faut savoir qu'une fonction de domaine appelle une forcément une requête. Donc attention !

    Pour fonctionner ça ne que fonctionner, c'est plutot à la montée ne charge que tu risques d'avoir de surprise. Te voici prévenu.

    Je n'utilise jamais les zones de liste dans les tables c'est réservé à une utilisation sans ihm. Consultation directe des tables ou éventuellement petites requêtes légères.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Je n'utilise jamais les zones de liste dans les tables c'est réservé à une utilisation sans ihm
    Voilà ce que je voulais lire

    Comme je suis sur une petite base, je ne redoute pas trop les problèmes de performances, mais je suivrai néanmoins ton conseil à l'avenir (car j'en ai surement abusé par le passé, des fonctions de domaine !).

    Cela dit, quelle alternative aux fonctions de domaine dans mon cas ?
    Pas de longues explications requises, si tu as quelques liens ou mots clés pour m'aiguiller, je saurai creuser

    Merci encore !

    Guillaume

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Favoriser les jointures. Sinon les select dans un select peut donner de bon résultat.

    Regarde le tuto sur l'optimisation sur ma page perso.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut


    En résumé :
    - Si IHM, ne pas utiliser les options "avancées" de la création de table ACCESS (j'imagine que ça vaut plus ou moins aussi pour les forms)
    - Toujours privilégier les jointures et les requêtes imbriquées utilisant le mot clé IN aux fonctions de domaine

    J'ai trouvé ton tuto, je vais me pencher dessus, j'y apprendrai surement plein de choses (j'y ai déjà appris en feuilletant ce matin l'existence de Rushmore !)

    Merci

    Guillaume

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/12/2011, 17h11
  2. Réponses: 10
    Dernier message: 18/05/2011, 14h56
  3. Réponses: 5
    Dernier message: 18/02/2009, 09h52
  4. Réponses: 1
    Dernier message: 13/02/2009, 10h13
  5. passer d'une requêtes SGL directe en une requête normale
    Par jenniferIUP dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 04/02/2009, 08h26

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