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 requete paramétrée access en VBA [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Utiliser requete paramétrée access en VBA
    Bonjour à tous,

    Je possède une requête paramétrée. Pour faire simple, elle n'a qu'un paramètre, celui-ci étant issu d'un formulaire. Dans un exemple, cette requête correspond à une population, filtrée par un champ commun (le paramètre en question!).

    J'ai ensuite attaché un état à cette requête, qui m'affiche la bonne population. Jusqu'ici pas de problème. (ouf).

    Mon problème, c'est qu'à l'ouverture de mon état, je voudrais pouvoir manipuler cette requête en VBA afin de faire des calculs et d'enregistrer les resultats dans une table. Voici ce que j'ai fait jusqu'à lors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim db As Database
    Dim qdf As QueryDef
    Dim rcs As Recordset
     
    Set db = CurrentDb
     
    Set qdf = db.QueryDefs("MaRequete")
     
    With qdf
    .Parameters("MonParamètre") = MaVariable
    End With
     
    Set rcs = qdf.OpenRecordset
    Et là c'est le drame car quand j'execute, j'obtiens une phrase que je ne comprends même pas en français : "Type de données incompatibles dans l'expression du critère". En me pointant sur la dernière ligne. Autrement dit, access ne veut pas que j'utilise ma requete comme un recordset...

    J'ai des pistes qui pourraient l'expliquer, comme le fait que la requête est utilisée au moment ou je veux la manipuler en VBA, ça pourrait etre ça?

    Je vous remercie pour votre aide.

    Thomas

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 425
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    Salut,

    Peux tu donner le sql de ta requête ?

    Je suppose qu'il y a une déclaration de paramètre du style

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Parameters [Forms]![TonForm]![Valeur] Text ( 255 )
    Select ...

    et dans le bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qdf.Parameters("[Forms]![TonForm]![Valeur]")= MaVariable
    Quel est le type du paramètre et de la variable ?

    Merci

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Oui c'est exactement ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Personnes.[Numéro de sécurité sociale], Personnes.Nom, Personnes.Prénom, Personnes.[Identifiant contrat]
    FROM Personnes
    WHERE (((Personnes.[Identifiant contrat])=[Formulaires]![Interface]![Identifiant contrat]));
    J'utilise la table "Personnes" comme source de ma requête.
    J'utilise le formulaire "Interface" pour récupérer le paramètre (identifiant contrat).

    Comme décrit plus haut, j'ai attaché un état à cette requete.
    Lors de l'ouverture de l'état, l'impression a lieu et je voudrais prendre la main sur la requête, avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim db As Database
    Dim qdf As QueryDef
    Dim rcs As Recordset
     
    Set db = CurrentDb
     
    Set qdf = db.QueryDefs("Requete1")
     
    With qdf
    .Parameters("Formulaires!Interface!Identifiant contrat") = Forms![Interface].Identifiant_contrat
    End With
     
    Set rcs = qdf.OpenRecordset
    Et là ça buge...

    Merci pour ton aide

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 425
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    Re,

    Il est de quel type ton paramètre [Forms]![Interface]![Identifiant contrat] ?

    Voici la requête paramétrée
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PARAMETERS [Forms]![Interface]![Identifiant contrat] Text ( 255 )
    SELECT Personnes.[Numéro de sécurité sociale], Personnes.Nom, Personnes.Prénom, Personnes.[Identifiant contrat]
    FROM Personnes
    WHERE (((Personnes.[Identifiant contrat])=[Forms]![Interface]![Identifiant contrat]));

    voici un code possible...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim db As Database
    Dim qdf As QueryDef
    Dim rcs As Recordset
     
    Set db = CurrentDb
     
    Set qdf = db.QueryDefs("Requete1")
     
    With qdf
    .Parameters("[Forms]![Interface]![Identifiant contrat]") = Forms![Interface]![Identifiant contrat]
    End With
     
    Set rcs = qdf.OpenRecordset
    A+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Ma variable est du string et mon paramètre aussi. Lorsque j'exécute avec le bout de code que tu m'as donné, j'ai mis un point d'arret juste après la déclaration du paramètre et celui-ci est bien lu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Parameters("[Formulaires]![Interface]![Identifiant contrat]") = Forms![Interface].Identifiant_contrat
    En mode debug, lorsque je survole la partie gauche de l'égalité, j'ai bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Parameters("[Formulaires]![Interface]![Identifiant contrat]") ="123456789"
    Mais à l'étape d'après, au moment ou je lis la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rcs = qdf.OpenRecordset
    ça buge et me donne le message d'erreur cité plus haut.

    Cela m'amène à ces questions, qui permettraient de contourner le pb :
    - est-il impératif d'écrire en sql la requête dans le code ?
    - puis-je m'en sortir en effectuant mes calculs voulus dans la requête (en mode création), puis de récupérer les résultats de l'état qui y est attaché en vba?

    Merci

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 425
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    Bonjour,

    Excusez-moi d'insister, mais avez-vous bien déclaré le type de votre paramètre en haut du code sql de votre requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PARAMETERS [Forms]![Interface]![Identifiant contrat] Text ( 255 )
    SELECT...
    ...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Je comprends votre façon de faire, mais jusque là je voulais éviter d'écrire le code sql dans une fenêtre vba, car ma requête est lourde en ligne sql.

    En fait au départ ma question était de savoir si on pouvait manipuler un recordset basé sur une requête faite en mode création (sans passer par sql tout compte fait).

    Et donc je n'ai pas réussi. J'ai passé le paramètre en variable publique et je l'ai insérée dans le code sql (que j'ai fini par écrire dans la fenêtre vba!!) que vous m'avez donné (avec un nombre de guillemets qui va bien) et ça marche...

    Merci pour votre aide.

    Bonne journée

  8. #8
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 932
    Points
    932
    Par défaut
    Citation Envoyé par Smoovy35 Voir le message
    Bonjour,

    Je comprends votre façon de faire, mais jusque là je voulais éviter d'écrire le code sql dans une fenêtre vba, car ma requête est lourde en lignes sql.

    En fait au départ ma question était de savoir si on pouvait manipuler un recordset basé sur une requête faite en mode création (sans passer par sql tout compte fait).
    On peut parfaitement ajouter le typage du paramètre dans une requête Access existante.

    En mode création, clic droit pour le menu contextuel, on choisit "Paramètres" :
    Nom : Capt2.JPG
Affichages : 385
Taille : 50,1 Ko

    En ouvrant la requête existante en mode SQL, on peut aussi ajouter une instruction "parameters", sans oublier le ; à la fin de l'instruction:
    Nom : Capt1.JPG
Affichages : 367
Taille : 18,2 Ko

    Désolée, ce paramètre ne sert à rien dans mon exemple et j'utilise une antique version d'Access, mais je suppose que cela existe toujours dans les modèles récents...

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

Discussions similaires

  1. [AC-2003] requete paramétrée access->excel
    Par Beub' dans le forum VBA Access
    Réponses: 9
    Dernier message: 29/12/2010, 16h36
  2. [AC-2007] dupliquer enregistrements utilisant requete sql access
    Par eddy37fr dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/03/2010, 20h00
  3. [A-03] Recordset DAO sur requete paramétrée Access
    Par fxbrg dans le forum VBA Access
    Réponses: 12
    Dernier message: 23/03/2009, 17h34
  4. Réponses: 1
    Dernier message: 11/09/2007, 11h12
  5. requete paramétrée access
    Par LostIN dans le forum Requêtes et SQL.
    Réponses: 18
    Dernier message: 30/06/2006, 15h05

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