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 :

Utiliser une sélection multiple comme critère de requête


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Utiliser une sélection multiple comme critère de requête
    Bonjour,

    Après avoir parcouru la FAQ et le forum, je constate que j’ai des morceaux de la réponse à ma question, mais je n’arrive pas à « clipser » les morceaux du puzzle :

    Je voudrais (enfin, je dois !) utiliser une zone de liste pour faire une sélection multiple (simple ou étendue).

    Pour cela, j’ai bien noté :
    - qu’il me faudrait vérifier les valeurs sélectionnées (Selected) à l’aide d’un For… to…
    - que cette méthode me permettrait de générer une requête SQL en VBA (en ayant une clause WHERE du style MonChamp in (1 ;3 ;12) où 1, 3, 12 sont les valeurs des lignes choisies dans le Zone de liste)

    D’ailleurs je l’ai fait sur une petite base test ; ça fonctionne très bien.

    Mais le résultat ne peut être exploité qu’en tant que source de données d’un formulaire ou d’un état (RowSource).

    Or, (je suis pénible et) je voudrais utiliser cette requête (ou seulement le « paramètre multiple ») en tant que critère dans une requête existante.
    Pourquoi ?
    Parce que celle-ci se trouve imbriquée au beau milieu d’une cascade de requêtes successives que l’on ne peut pas toucher : je dois passer mon critère sur la requête B et mon état est basé sur la requête F.
    Et je ne peux que vous demander de me croire sur parole lorsque je vous assure que je ne peux pas faire autrement...

    Gâteau sous la cerise, c’est bien une base de données multi-utilisateurs ; je ne peux donc pas me contenter de générer (et écraser au fur et à mesure) une table « temporaire » sur laquelle je ferai un lien (un simple INNER JOIN).

    Hélas, j’ai bien peur qu’une requête Access me demande désespérément un critère « en dur » et je n’en ai qu’un virtuel à lui proposer…

    Je me suis bien lancé dans une requête paramétrée dont le paramètre serait mon instruction SQL générée en VBA mais je n’y arrive pas (1 paramètre = 1 unique valeur, je me trompe ?).

    Je ne demande pas de code « tout cuit » mais des pistes de réflexion : même si je connais très mal VBA, je veux bien me lancer dans un développement mais seulement si quelqu’un m’affirme que c’est possible…

    Bref : on peut faire SQL Access => SQL VBA, mais peut-on faire SQL VBA => SQL Access ?

    Voilà, la bouteille est jetée à la mer, merci à qui la débouchera !

  2. #2
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Bonsoir,

    Quelques réponses à tes interrogations:

    Mais le résultat ne peut être exploité qu’en tant que source de données d’un formulaire ou d’un état (RowSource).
    Tu peux en VBA définir la propriété SQL d'une requête.

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim OQry as DAO.QueryDef
     
    Set oQry = Currrentdb.Querydefs("maRequete")
    oQry.SQL ="SELECT ... IN(...)"
     
    ...


    c’est bien une base de données multi-utilisateurs ; je ne peux donc pas me contenter de générer (et écraser au fur et à mesure) une table « temporaire »
    Si tu as - comme il se doit - séparé les données de l'interface (frontal / Dorsale), une copie de la partie interface est propre à chaque utilisateur. Tu peux donc y placer une table temporaire...
    ............................................................................................

    Dans l'intérêt de tous, ne posez pas de questions techniques par messages privés.

  3. #3
    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
    à voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.CreateQueryDef "ESSAI", "SELECT * FROM Table3;"
    qui te crée une requete à partir d'un string

  4. #4
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 524
    Points
    14 524
    Par défaut
    bjr,

    Une solution (peut-être pas la plus rapide mais qui fonctionne) est de créer une petite fonction de vérification d'existante de la la donnée dans une liste au format texte délimité.

    J'ai une liste du style :
    1;3;7;56;34
    qui peut d'ailleurs être générée par une fonction GetItemSelected par exemple.

    J'ai une fonction de test d'existence qui ressemble à ça (peut-être à modifier en fonction du type de données?):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function ExistsInList(pValue As String, pList As String, pDelimiter As String) As Boolean
    Dim lList() As String
    Dim lCpt As Integer
    lList = Split(pList, pDelimiter)
    For lCpt = LBound(lList) To UBound(lList)
        If lList(clpt) = pValue Then
            ExistsInList = True
            Exit Function
        End If
    Next
    End Function
    Et la requête devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * From MaTable where ExistsInList([MonChampàTester],GetItemSelected(),";")
    C'est l'idée générale.
    Pour un exemple plus concrêt regarde ici :
    http://arkham46.developpez.com/#LII

    Dans la base de test il y a un critère de requête qui est une sélection multiple dans une liste.

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci à tous les trois pour vos réponses,


    Mout1234 :

    Je ne suis pas en client/serveur mais en terminal/serveur : tous les utilisateurs ouvrent un unique .mdb

    (Note : cette base n’est destinée qu’à la consultation de données SQL server : il existe déjà une interface professionnelle (je veux dire « faite par des professionnels »). Mon patron ne me donnera jamais le feu vert pour consacrer du temps à monter une seconde interface, sous Access, avec accès utilisateurs et compagnie ; mais j’y avais pensé… Le seul objet de cette base est de réaliser une tambouille (attention, juste, hein, la tambouille…) des données trop spécifique et évolutive pour la demander à notre prestataire)


    Vodiem :

    Oui, j’ai déjà essayé avec ça ; mais j’en reviens à mon problème de départ : si un utilisateur a déjà ouvert la requête F, je ne peux pas écraser les requête A, B, C, D ou E…
    Remarque, j’avoue que n’ai pas poussé l’essai jusqu’au bout, je vais quand même tenter d’écraser B pendant que F est utilisée (aïe aïe le VBA), mais je ne me fais pas d’illusion...

    Avec ce CreateQueryDef, j’avais emprunté la piste suivante : générer une requête temporaire avec pour nom une concaténation de l’année, du mois, du jour, de l’heure, des minutes et des secondes (20070403102258).
    Ainsi, je n’avais pas à écraser une requête existante. Je voulais me servir de cette requête temporaire comme sous-requête dans le critère d’un requête existante : le WHERE ma requête B par exemple :
    B = SELECT * FROM A WHERE MonChampReel in (SELECT MonChampVirtuel FROM 20070403102258)
    Mais impossible de générer un nom de table/requête « virtuel » après un FROM dans le générateur de requête...


    Arkham46 :

    Hmmm… j’avais bien peur que la solution ne soit dans une Fonction personnalisée… (le seul lien entre VBA et ce fichu Générateur d’expressions ).
    Je me penche là-dessus (ce n’est pas du mandarin, mais je n’ai pas de formation VBA alors je tâtonne…).


    Merci encore , je vous donnerai des nouvelles de tout cela.

  6. #6
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Je ne suis pas en client/serveur mais en terminal/serveur : tous les utilisateurs ouvrent un unique .mdb
    Soit, mais cela ne t'oblige pas à avoir un fichier d'interface unique. Tu peux, et c'est je crois bien souvent préférable, avoir une copie de ton interface pour chaque user, dans son profil Terminal Server.
    ............................................................................................

    Dans l'intérêt de tous, ne posez pas de questions techniques par messages privés.

  7. #7
    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
    tu m'explique pourquoi le nom de ta requete temporaire dois etre aléatoire?
    si tu l'appelais "la requete miracle" ca pose problème?

Discussions similaires

  1. Réponses: 20
    Dernier message: 19/11/2016, 22h32
  2. Requête sélection avec comme critère: champ vide
    Par droxyme dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/10/2007, 10h24
  3. [SQL]Utiliser une constante globale comme critère d'une requète ?
    Par marot_r dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 16/04/2007, 14h57
  4. Utiliser une clef USB comme de la ram de mémoire vive
    Par Lorponos dans le forum Composants
    Réponses: 28
    Dernier message: 18/08/2006, 18h32
  5. Réponses: 5
    Dernier message: 04/07/2006, 11h19

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