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

VBA Access Discussion :

[VBA] Modification de la clause where d'une requête


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2004
    Messages : 159
    Par défaut [VBA] Modification de la clause where d'une requête
    Bonjour,

    Je souhaiterais modifier à partir de VBA les valeurs servant à filtrer certains champs d'une requête sans avoir à travailler directement sur le code SQL.

    Y a-t'il un moyen en passant par l'objet querydef de modifié les valeurs des filtres ?

    Merci d'avance.

  2. #2
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2004
    Messages : 159
    Par défaut Précision
    Suite à la réponse de marot_r (qui ne s'affiche pas sur le forum )

    Je précise que cette requête est utilisée ensuite dans une sous-requête.
    Je ne peux donc pas utiliser les filtres des recordset, il faut vraiment que je modifie la requête.

    Jusqu'à présent, j'utilisais une requête modèle avec une chaîne particulière pour chaque paramètre, mais c'est pénible car ça m'oblige à doubler un nombre important de requête et à faire tout un cirque de copie et remplacement des paramètres dans la chaîne SQL du query def.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Oui, j'ai supprimé le message car je croyaisi qu'il était faux.

    Et non :-( ce qui suis n'est pas une réponse à ton besoin.

    Tu peux le faire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Dim db As DAO.database: Set db = CurrentDb
        Dim r As DAO.Recordset: Set r = db.OpenRecordset("Table1", dbOpenDynaset)
        Dim rf As DAO.Recordset
        r.Filter = "[C1]>""1"""
        Set rf = r.OpenRecordset
        Debug.Print rf![C1]
        rf.Close:set f=nothing
        r.Close: Set r = Nothing
        db.Close: Set db = Nothing
    Tu crées un recordset, tu appliques un filtre et tu ouvres un nouveau recordset basé sur celui qui est filtré.

    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.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Tu pourrais ajouter un champ calculé avec ne fonction qui retourne True/False et de mettre une condition vrai sur ce champ.

    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Table1.C1, Test([c1]) AS T
    FROM Table1
    WHERE (((Test([c1]))=True));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Function Test(prm As Variant) As Boolean
        Test = (prm > "1")
    End Function
    Comme dans Test tu es en VBA tu pourrais utiliser des variables globales pour influencer tes décisions et aussi la fonction Eval(String) pourrait être utile.

    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é
    Inscrit en
    Août 2004
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2004
    Messages : 159
    Par défaut
    Merci pour tes réponses Marot_r.

    J'avoue que ta première solution me laisse perplexe.
    D'autant que j'ai vraiment besoin de modifier en dur le code de la requête et non de filtrer de manière dynamique les données sortie par cette requête. (toujours cette manie d'imbriquer des requêtes...)

    Par contre la deuxième est chafouine.
    J'ai juste un peu peur qu'elle me plombe le temps de traitement (surtout que nous avons des administrateurs qui ont réussit à rendre un dual core 2 Ghz sous XP aussi rapide qu'un céléron 200 Mhz sous vista ).

    Vu le nombre de réponse, il semble qu'il n'y ait pas de manière "propre" d'obtenir les valeurs des filtres par champ à partir de querydef.
    Est-ce au moins possible d'obtenir la clause where de la requête sabs avoir à fair edu traitement texte sur la cha'ine SQL ? par exemple avec un truc équivalent à filter pour les recordset.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Citation Envoyé par Julien Dufour Voir le message
    Merci pour tes réponses Marot_r.

    J'avoue que ta première solution me laisse perplexe.
    D'autant que j'ai vraiment besoin de modifier en dur le code de la requête et non de filtrer de manière dynamique les données sortie par cette requête.
    Oui, oublie la, je n'avais pas toutes tes contraintes quand je l'ai écrite.

    (toujours cette manie d'imbriquer des requêtes...)
    C'est une trés bonne idée, cela diminue la compléxité de chacun des éléments et cela rend les choses plus compréhensible généralement. Au prix de l'heure d'un informaticien, l'optimisation doit être faite pour les humains plus pour les machines !

    Par contre la deuxième est chafouine.
    Non :-), elle utilise les particularités d'Access (d'aprés mes test, cela ne marche pas en Oracle) et de la logique c'est tout :-).

    J'ai juste un peu peur qu'elle me plombe le temps de traitement (surtout que nous avons des administrateurs qui ont réussit à rendre un dual core 2 Ghz sous XP aussi rapide qu'un céléron 200 Mhz sous vista ).
    Fait un essais avant de supposer. Tu mesure le temps d'execution avant, puis après et tu vois si c'est correct.

    Vu le nombre de réponse, il semble qu'il n'y ait pas de manière "propre" d'obtenir les valeurs des filtres par champ à partir de querydef.
    Est-ce au moins possible d'obtenir la clause where de la requête sabs avoir à fair edu traitement texte sur la cha'ine SQL ? par exemple avec un truc équivalent à filter pour les recordset.
    Si elle existe je ne la connais pas.

    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.

  7. #7
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 043
    Par défaut
    Voici un exemple de code pour manier les requetes
    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
    18
    19
    20
    Dim maBD As DAO.Database
        Dim strSQL As String
        Dim maReq1 As DAO.QueryDef
       Dim sNomRQ As String, nouveauNom As String
     
     
        Set maBD = CurrentDb
     
        'Constituer le nom de la nouvelle requete
        sNomRQ = "tmp_1"
     
        strSQL = " SELECT ...  je tape ma requete sql 1 ; "
     
        ' supprimer la requete si elle existe
        If ExistQuery(sNomRQ) Then DoCmd.DeleteObject acQuery, sNomRQ
     
        Set maReq1 = maBD.CreateQueryDef(sNomRQ, strSQL)
     
        DoCmd.OpenQuery sNomRQ, acViewNormal, acReadOnly
    ...
    je joins l'utilitaire :
    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
    18
    19
    Public Function ExistQuery(ByVal str As String) As Boolean
        On Error GoTo Err_
        Dim qry As QueryDef
     
        ExistQuery = False
        For Each qry In CurrentDb.QueryDefs
            If qry.Name = str Then
                ExistQuery = True
                Exit Function
            End If
        Next qry
     
    exit_:
        Exit Function
    Err_:
        MsgBox Err.Description, vbCritical, "ERREUR dans ExistQuery"
        Resume exit_
     
    End Function

Discussions similaires

  1. Utilisation des alias dans la clause WHERE d'une requête SELECT
    Par OursRêveur dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 13/07/2013, 04h34
  2. [AC-2010] Clause WHERE dans une requète
    Par Brëzz dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 12/04/2013, 15h38
  3. Réponses: 8
    Dernier message: 02/11/2007, 14h51
  4. Réponses: 2
    Dernier message: 29/01/2007, 13h41
  5. Clause Where sur une Date
    Par Zebulonn dans le forum Installation
    Réponses: 31
    Dernier message: 20/10/2005, 11h56

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