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 :

Variable en Mode SQL [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut Variable en Mode SQL
    Bonjour,

    je voudrais savoir s'il est possible d'utiliser une variable en mode SQL et quelle en est la syntaxe au niveau de guillemets. Attention, je parle du mode SQL (Générateur de requêtes) accessible depuis l'onglet propriétés\Données\contenu puis clic droit--> Mode SQL d'une zone de liste déroulante en l'occurrence.

    En vba c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.OpenRecordset("SELECT COL_2 FROM TABLE_A WHERE COL_1 = " & var)
    mais en Mode SQL cela serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TABLE_A.COL_2
    FROM TABLE_A
    WHERE ???????
    Merci

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 443
    Par défaut
    Bonjour.

    Tu ne peux pas passer une clause complete en variable.
    Tu ne peux travailler qu'au niveau de la valeur des champs.

    Donc c'est du SQL du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select [UneTable].* from [UneTable] where [UnTable].[UnChamp]=[IciUneValeurExterne]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select [IciUneValeurExterne] as ValeurExterme, [UneTable].* from [UneTable] where [UneTable].[UnChamp]=[IciUneValeurExterne]
    J'ai mis le Select mais ca marche avec les autres instructions.

    • En SQL "standard", il n'y a que les parametres.
      Ton parameter peut etre un nom de champ dans un formulaire ouvert du type [Forms]![UnFormulaire]![UnChamp].
    • Tu peux utiliser une function qui va recuperer la valeur de ta variable.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      Public function LireVariableGlobale() as UnType
         LireVariableGlobale=UneVariableGlobale
      end function
    • Et tu peux aussi utiliser la collection TempsVars.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      select [UneTable].* from [UneTable] where [UnTable].[UnChamp]=[TempVars].[UneTempVar]
      .
    • Sinon, le reste, il faut le faire en VBA et "pousser" la chaine soit dans le recordset comme tu l'as mis en exemple, soit dans le SQL d'une requete.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      dim db as dao.database: set db=currentdb
      dim q as dao.querydef: set q=db.querydefs("UneRequete")
      q.sql="ici ton SQL"
      .
      .
      .
      set q=nothing
      db.close: set db=nothing


    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut
    Merci Marot r,

    passer par une TempsVars me séduit bien, j'ai donc regardé https://warin.developpez.com/access/...estemporaires/.


    J'ai défini ma variable avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.TempVars.Add "Ma Variable", 82
    Puis j'ai créé la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function RetourTempVar(strTempVar As String) As Variant
        RetourTempVar = Application.TempVars(strTempVar)
    End Function
    Pour enfin utiliser dans le mode SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TABLE_A.COL_2
    FROM TABLE_A
    WHERE TABLE_A.COL_1 = RetourTempVar("Ma Variable")
    Hélas, cela ne fonctionne pas, je ne passe jamais dans la fonction, pourtant aucun message d'erreur mais pour ma zone déroulante est vide , une idée ?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 443
    Par défaut
    bonjour.

    Avec les TempVars tu n'as pas besoin de function, la collection est accessible directement depuis la requete.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select [UneTable].* from [UneTable] where [UnTable].[UnChamp]=[TempVars].[UneTempVar]
    Ceci dit, cela devrait fonctionner.
    Essaye en forcant une valeur valide dans ta function :

    Et je ne sais pas trop comment les TempVar sont typees.

    Peut-etre faut-il faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RetourTempVar = Clng(Application.TempVars(strTempVar))
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut
    Bonjour,

    j'ai essayé de forcer la variable mais cela ne change rien. Le problème c'est qu'a priori je ne passe même pas dans la fonction, j'ai mis un point d'arrêt mais rien, comme si il n'y avait pas de lien entre ce que je définis au niveau des propriétés dans le formulaire pour ma zone de liste et le code vba.

    Peut-être y a t'il une autre solution à ce que je veux faire, je vais essayer de prendre le temps d'ici peu pour expliquer mon problème dans un autre poste.

    Merci

  6. #6
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Par défaut


    As-tu regardé du coté des requêtes paramétrées ?...
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 443
    Par défaut
    Bonjour.

    Ici une mini BD avec un appel de fonction VBA dans une requête.

    FonctionDansRequete.zip

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut
    Bonjour,

    Merci pour la BD exemple, cela m'a permis de voir que je m'étais trompé, j'avais mis le code de la fonction dans le code vba du sous formulaire et non pas dans un module, l'appel à cette fonction fonctionne mieux.

    Mais malheureusement cela ne solutionne pas mon problème.

    Je voulais faire un autre poste mais tant pis, j'explique tout ça ici, si quelqu'un peut m'aider cela serait sympa car là je perd mon temps à tatillonner de droite à gauche.

    J'ai un formulaire dans lequel j'appelle un sous-formulaire. Je charge ce dernier avec une table de x colonnes et dans ce formulaire j'ajoute deux zones de liste déroulante que j'appellerais Armoires et Tiroirs. Ces deux zones sont attachées à deux tables qui sont liées entre-elles, l'armoire 1 ne peut avoir que les tiroirs 1,2,3 et l'armoire 2 ne peut avoir que les tiroirs 4,5 et 6.

    J'ai donc au final dans mon formulaire, ma table et mes deux colonnes qui me permettent de préciser pour chaque item de chaque ligne le lieu de rangement. Sauf que je n'arrive pas à lier entre elles les 2 zones de listes de façon à, lorsque je clique dans le champ armoire, il n'y ait après clic que les items ad hoc dans le champ tiroirs (ceux n'appartenant qu'à l'armoire sélectionnée). Si je bidouille pour changer les items du champs tiroirs en fonction du clic qui a été fait dans le champ Armoire cela change les sélections sur toutes les lignes !

    Je désespère de trouver une solution, une idée ?

    Merci

  9. #9
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 350
    Par défaut
    Salut
    Si je comprends bien combox1 = armoire1 et combobox2 = Armoire1.tiroir1/Armoire1.tiroir2, etc.
    Cela ressemble à s'y méprendre à la méthode de mise à jour en cascade de combobox.

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut
    Bonjour,
    merci mais ce n'est pas tout à fait cela car il ne s'agit pas de deux zones de liste liées simplement entre-elles. Là je parle d'avoir sur plusieurs lignes d'un formulaire mes 2 zones de liste (voir image ci-dessous). Aujourd'hui j'arrive à sélectionner pour chaque ligne des lieux de stockage différents mais dans ma deuxième liste je ne voudrais voir apparaitre que les éléments liés à la première, ce qui n'est pas le cas sur l'image puisque l'armoire_1 est sélectionnée il ne devrait apparaitre que les tiroirs 1 à 3. Si j'utilise la méthode que tu proposes je n'ai pas d'indépendance de ligne, si je change une sélection dans une ligne, elles changent toutes.

    Nom : 1542706747-capture.jpg
Affichages : 207
Taille : 43,1 Ko

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 443
    Par défaut
    Bonjour.

    Pour les listes dépendantes en mode feuille de données, il faut prévoir un champ pour afficher la valeur en dehors de la zone de sélection.

    Quelque chose comme :
    • ChoixValeur
    • AffValeur


    Sinon, la liste filtrée n'affichant que les valeurs qu'elle contient, si la données n'est pas dans la liste, elle n'est pas affichée même si elle est bien là dans la source.

    Donc dans ton cas, cela devrait te prendre 4 colonnes : 2 d'affichage et 2 de choix.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut
    Bonjour,

    merci marot_r, cela va avoir un rendu ergonomique nettement moins sympa mais s'il n'y a pas d'autres solutions je vais faire comme cela.

    Encore merci

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

Discussions similaires

  1. Variables dans un .sql exécuté par sqlplus
    Par ekke dans le forum Oracle
    Réponses: 10
    Dernier message: 12/04/2006, 17h03
  2. [Variable d'environement SQL] Probleme de config
    Par duelooser dans le forum Oracle
    Réponses: 2
    Dernier message: 16/12/2005, 09h16
  3. évaluation des variables en mode pas à pas
    Par Tex-Twil dans le forum MFC
    Réponses: 2
    Dernier message: 01/12/2005, 14h37
  4. une variable dans du SQL ??
    Par Black Pearl dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/06/2005, 12h55
  5. Variable globale - PL/SQL - %TYPE
    Par ogre dans le forum PL/SQL
    Réponses: 25
    Dernier message: 20/10/2004, 13h47

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