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 :

Récupérer une valeur de liste de formulaire comme nom de champ dans une requête


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Récupérer une valeur de liste de formulaire comme nom de champ dans une requête
    Bonjour

    Tout d'abord merci à tous les contributeurs de ce site qui me sauve depuis des années de problèmes insolubles à mon niveau. Rien qu'en passant du temps à consulter les sujets, j'en ai appris bien plus que dans n'importe quel bouquin ou formation.

    voici mon problème:
    J'ai créé un formulaire de recherche multicritères.
    Je cherche à récupérer la valeur d'une liste de ce formulaire comme champ d'une requête en QBE et lui appliquer comme critère la valeur d'une autre liste du même formulaire.
    Je récupère bien les 2 valeurs de mon formulaire mais pas moyen d'en mettre une comme nom de champ.

    le paramètre de requête qui correspond à ce que je souhaite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VraiFaux(nz([forms]![RechercheGlobale]![cbotexte];"")="";"null";[rqNaissancesCherchesBase].("[forms]![RechercheGlobale]![special]") = "*" & [forms]![RechercheGlobale]![cbotexte] & "*")
    (j'ai mis "null" comme résultat dans le cas ou cboTexte est vide car c'est plus parlant que "")
    cette partie-là:

    [forms]![RechercheGlobale]![Special] est la valeur de la liste nommée Special qui doit se transformer en nom de champ de la requête rqNaissancesCherchesbase.

    j'ai essayé toutes sortes d'écritures et même une fonction qui me retourne juste la valeur du contrôle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VraiFaux(nz([forms]![RechercheGlobale]![cbotexte];"")="";"null";NomChampRq("RechercheGlobale";"Special";"rqNaissancesCherchesBase") = "*" & [forms]![RechercheGlobale]![cbotexte] & "*")
    le résultat de ce champ est toujours 0, ce que j'interprête comme le résultat de :
    valeur de [forms]![RechercheGlobale]![special] <> valeur de [forms]![RechercheGlobale]!cboTexte].
    alors que je cherche à avoir:
    nom du champ de [forms]![RechercheGlobale]![special] = valeur de [forms]![RechercheGlobale]!cboTexte].

    une précision: dès lors que le champ cboTexte est rempli, le champ Special l'est aussi, il n'est donc jamais vide dans le critère.

    Par ailleurs, la formulation de ce paramètre marche parfaitement avec tous les autres champs de mon formulaire dès lors que je nomme le champ de ma requête directement sous la forme [rqNaissancesCherchesbase].[champ_requête].
    J'ai réussi à les créer grâce à tous les topics que j'ai lus ici sur la fonction NZ et les champs nuls, et je vous en remercie tous.

    je sais qu'en VBA tout ceci serait sans doute plus simple.
    Mais je voudrais simplifier mon code au maximum et la création de requêtes enregistrées paramétrables m'a semblé la meilleure solution.

    Sinon, peut-être est-il possible de créer une sous-requête? mais je bloque toujours sur le même passage de la valeur d'un contrôle à un nom de champ.
    Merci d'avance de votre aide

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,

    A mon avis, comme [forms]![RechercheGlobale]![special] sert de variable, il ne faut pas le mettre entre "", donc cela devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VraiFaux(nz([forms]![RechercheGlobale]![cbotexte];"")="";"null";[rqNaissancesCherchesBase].([forms]![RechercheGlobale]![special]) = "*" & [forms]![RechercheGlobale]![cbotexte] & "*")
    Cordialement,
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci de vous pencher sur le problème.
    J'avais tenté ça au départ, mais la formulation est refusée:
    "l'expression entrée comporte un point (.), un point d'exclamation (!), ou des parenthèses () non valides."
    Et le curseur se place sur le point entre [rqNaissancesCherchesBase] et [forms]![RechercheGlobale]![special]) = "*" & [forms]![RechercheGlobale]![cbotexte] & "*".

    En fait, je crois avoir testé pas mal de choses avec des parenthèses ou sans, avec un point ou un point d'exclamation et aucune de ces solutions n'est acceptée comme expression.
    C'est pourquoi j'ai créé une fonction qui me retourne le nom du champ correctement libellé. L'expression qui en résulte est acceptée, donne un résultat, mais qui est toujours faux tel que je l'ai expliqué dans mon post.
    J'ai testé l'expression en utilisant un vrai nom de champ de la requête et il faut mettre Comme plutôt que le signe égal, mais ça fonctionne:
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VraiFaux(nz([forms]![rechercheglobale]![cbotexte];"")="";"null";[rqNaissancesCherchésBase].[lieu_dit] Comme "*" & [forms]![rechercheglobale]![cbotexte] & "*")
    Donc je ne comprends pas pourquoi ça ne marche pas avec ma fonction qui renvoie exactement la même présentation.
    Qu'est-ce qui cloche?

    Cordialement

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VraiFaux(nz([forms]![RechercheGlobale]![cbotexte];"")="";"null";[rqNaissancesCherchesBase].([forms]![RechercheGlobale]![special]) & " LIKE *" & [forms]![RechercheGlobale]![cbotexte] & "*")
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    ça coince toujours au niveau du point déjà. Donc j'ai tenté le coup avec la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VraiFaux(nz([forms]![RechercheGlobale]![cbotexte];"")="";"null";NomChampRq("RechercheGlobale";"Special";"rqNaissancesCherchesBase") & " Like *" & [forms]![RechercheGlobale]![cbotexte] & "*")
    l'expression n'est pas rejetée, mais le résultat est pour toutes les lignes de ma requête:
    Lieu_dit Like *kervilsic*
    Ce qui prouve au moins que les 2 variables sont lues correctement.
    Mais je voudrais avoir -1 ou 0...

  6. #6
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut madefemere et bienvenue sylviane,

    je n'ai pas tout bien compris mais d'après ce que je comprends en simplifiant le problème tu cherches à avoir une requete avec une condition:
    1. "WHERE [champ]=valeur"
    avec pour [champ] un champ présélectionné dans un contrôle (liste).
    seulement cela ne marche pas avec:
    2. "WHERE refObjet![moncontole]=valeur"
    ce qui est normale puisque au moment de l'analyse du SQL dans le cas 1. le moteur sais que [champ] est élément la requête : son type est un <objet> alors que dans le cas 2. il va chercher le contenu de refObjet![moncontrole] : son type est un <texte>.
    soit en final cela devient :
    1. "WHERE <objet>=valeur"
    2. "WHERE <texte>=valeur"
    forcément cela ne donne pas le résultat escompté.

    plusieurs pistes sont envisageables :
    en vba générer le sql approprié au choix.
    créer une condition pour chaque champ. Dans l'idée: "WHERE (<champ1>=valeur) and (refObjet![moncontrole]=valeur) OR (<champ2>=valeur) and (refObjet![moncontrole]=valeur) ..."
    il y aurait peut être une piste avec la méthode .fields() qui renverrait un objet <field> ?
    ...


  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Salut vodiem,

    Le problème, s'il y en a, dans ce genre de demande c'est que sans avoir la totalité du contexte, ça devient une question "très technique" Objets Access et SQL.
    Dans mes réponses j'avais effectivement en tête ta "proposition 3", mais j'ai zappé complètement "fields"

    Sylviane ne veut pas entendre parler de VBA pour son cas présent d'après ce qu'elle dit.

    Bonne continuation
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci de vos réponses.
    Vodiem a parfaitement exposé mon problème. Je pense que le contexte importe peu dans la solution.
    J'ai fini par comprendre effectivement que je n'arrivais qu'à avoir des chaines de caractères, quelles que soient les méthodes employées.

    Mon formulaire de recherche générique peut avoir jusqu'à 14 champs selon la table utilisée et les paramètres de la requête marchent pour tous ces champs.
    Il ne reste plus que ce petit champ supplémentaire qui coince.
    Si je choisissais de faire un test sur chacun des champs de la liste déroulante, ça me rajouterait 7 ou 8 champs minimum et je trouve que ça commence à faire beaucoup.
    Je ne suis pas contre le VBA et jusqu'à présent c'était la méthode que j'utilisais, mais je voulais tenter autre chose cette fois-ci.
    Alors la solution de la méthode .Fields() m'intéresse.
    Pouvez-vous m'en dire un peu plus sur la façon dont vous verriez les choses?

    De mon côté, j'ai pensé à modifier la fonction qui est censée me retourner le nom du champ avec Function (.., .., ..) AS Field.
    Puis j'ai déclaré les variables en fields, je vous passe les détails, mais ça collait dans la fenêtre d'éxécution.
    En tous cas Access n'a plus reconnu le nom de la fonction dans la requête.
    Du coup je ne sais pas si c'est envisageable ni comment faire ensuite.

    Merci encore de votre aide

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Donc, essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VraiFaux(nz([forms]![RechercheGlobale]![cbotexte];"")="";"null";[rqNaissancesCherchesBase].Fields([forms]![RechercheGlobale]![special]) & " LIKE *" & [forms]![RechercheGlobale]![cbotexte] & "*")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VraiFaux(nz([forms]![RechercheGlobale]![cbotexte];"")="";"null";[rqNaissancesCherchesBase].Fields([forms]![RechercheGlobale]![special]).Name & " LIKE *" & [forms]![RechercheGlobale]![cbotexte] & "*")
    Si ça ne marche pas, je suis désolé mais je n'ai plus d'autres propositions pour le moment.
    En VBA, il faut voir la totalité du contexte.

    Bon courage
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bon je crois qu'on a fait le tour.
    Rien ne marche, ni la dernière solution avec .Fields . J'ai un message soit d'erreur de syntaxe soit un message de fonction non définie.
    C'est dommage.
    Si des fois une idée vous venait par la suite, je serai toujours preneuse.
    Pour l'heure, je vais repasser au VBA.

    Bonne journée

  11. #11
    Membre éclairé
    Homme Profil pro
    Regisseur
    Inscrit en
    Octobre 2006
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Regisseur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2006
    Messages : 475
    Points : 850
    Points
    850
    Par défaut variable en tant que nom de champ
    Bonjour le forum.
    Je m'étais déjà heurté à ce problème. J' ai une solution qui marche .
    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
    Sub Champ_variable()
        Dim MaVar As String
        Dim MonSql As String, MonRst As dao.Recordset
     
        MaVar = "reservation"
     
        MonSql ="SELECT detail_resa![" & MaVar & "], detail_resa.code, detail_resa.quant" & _
               " From detail_resa" & _
               " WHERE (((detail_resa.reservation)=140943));"
        Debug.Print MonSql
        Set MonRst = CurrentDb.OpenRecordset(MonSql)
     
        MonRst.Close
        Set MonRst = Nothing
     
    End Sub
    En résumé : une variable , Matable![" & une variable & "], ...
    Bizarrement (enfin non si on réfléchis bien) ,ma variable étant de type texte ,il ne faut pas doubler les guillemets ,puisque l'on n'a pas besoin qu'ils apparaissent dans le sql.
    SELECT detail_resa![reservation], dans le bon cas
    SELECT detail_resa!["reservation"], dans l'autre cas qui ne marche pas ,puisque l'on a doubler les guillemets .

    PS: cela pourrait éventuellement figurer dans la faq ?

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bonjour Thierry

    Le problème posé n'est pas tout-à-fait celui-là: je cherche à créer un paramètre dans une requête en QBE et non en VBA.
    C'est-à-dire dans la zone de création d'une requête Access dans la partie Champ. A ce niveau, Access interprète les variables en texte et non en objets.

    En VBA j'ai trouvé une méthode simple qui est de déclarer la variable en Field:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set ReqBase = db.QueryDefs("rqNaissancesCherchesBase")
    Set rqField = ReqBase.Fields([Forms]![rechercheglobale]!Special)
     
    stCritere = ReqBase.Name & "." & rqField.Name & " Like ""*" & [Forms]![rechercheglobale]!cboTexte & "*""" 
    Req.SQL = Left(Req.SQL, Len(Req.SQL) - 3) & " AND " & stCritère
    "AND" parce qu'il y a déjà un Where dans ma requête.

    Je ne sais pas si c'est la meilleure méthode mais elle est claire et elle fonctionne.
    Je pense même que ces déclarations ne sont pas forcément nécessaires étant donné que la chaine SQL est une chaine texte.
    Dès lors que la syntaxe est bonne, ça doit marcher.
    Mais les déclarations me permettent de suivre le code au plus près pour le débogage.

Discussions similaires

  1. Récupérer les noms des champs dans une requête
    Par Nerziel dans le forum Général Python
    Réponses: 1
    Dernier message: 14/09/2009, 11h29
  2. [MySQL] nom des champs dans une liste dynamique
    Par jeinny dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/05/2009, 11h06
  3. Réponses: 17
    Dernier message: 21/04/2008, 01h21
  4. Réponses: 3
    Dernier message: 11/07/2007, 10h10
  5. Nom de Champ dans une table pour utiliser For/Next
    Par Mulele dans le forum Access
    Réponses: 6
    Dernier message: 30/10/2004, 13h28

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