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 :

[A97] Erreur d'éxécution 3061


Sujet :

VBA Access

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2007
    Messages : 184
    Points : 188
    Points
    188
    Par défaut [A97] Erreur d'éxécution 3061
    Salut à tous,

    La requête suivante fonctionne parfaitement en mode SQL
    (il y 2 paramètres définis)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PARAMETERS Forms![STATS PS BILANS]![D1] DateTime, Forms![STATS PS BILANS]![D2] DateTime;
    SELECT Articles.Libelle, LignesOrdonnances.Quantite, Troupeaux.CodeTroupeau
    FROM Troupeaux INNER JOIN (Ordonnances INNER JOIN ((SousFamilles RIGHT JOIN (Familles RIGHT JOIN (Articles RIGHT JOIN LignesOrdonnances ON Articles.CodeArticle = LignesOrdonnances.CodeArticle) ON Familles.CodeFamille = Articles.CodeFamille) ON SousFamilles.CodeSousFamille = Articles.CodeSousFamille) LEFT JOIN Categories ON Articles.CodeCategorie = Categories.Cle) ON Ordonnances.CodeOrdonnance = LignesOrdonnances.CodeOrdonnance) ON Troupeaux.CodeTroupeau = Ordonnances.CodeTroupeau
    WHERE (((Troupeaux.CodeTroupeau)=[codeT]) AND ((Categories.LibelleCategorie)='Curatif' Or (Categories.LibelleCategorie)='Préventif' Or (Categories.LibelleCategorie)='Matériel' Or (Categories.LibelleCategorie)='Hygiène') AND ((Ordonnances.DateOrdonnance) Between [Forms]![STATS PS BILANS]![D1] And [Forms]![STATS PS BILANS]![D2]) AND (([Familles]![LibelleFamille]+'\'+[SousFamilles]![Libelle]) Like 'Vaccin*'));
    Le message d'erreur apparait lorsque je veux appeler la requête dans du code VBA pour obtenir un recordset.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim res As DAO.Recordset
    Dim strSQL As String
     
    strSQL = "PARAMETERS Forms![STATS PS BILANS]![D1] DateTime, Forms![STATS PS BILANS]![D2] DateTime;" _
    & "SELECT Articles.Libelle, LignesOrdonnances.Quantite, Troupeaux.CodeTroupeau FROM Troupeaux INNER JOIN (Ordonnances INNER JOIN ((SousFamilles RIGHT JOIN (Familles RIGHT JOIN (Articles RIGHT JOIN LignesOrdonnances ON Articles.CodeArticle = LignesOrdonnances.CodeArticle) ON Familles.CodeFamille = Articles.CodeFamille) ON SousFamilles.CodeSousFamille = Articles.CodeSousFamille) LEFT JOIN Categories ON Articles.CodeCategorie = Categories.Cle) ON Ordonnances.CodeOrdonnance = LignesOrdonnances.CodeOrdonnance) ON Troupeaux.CodeTroupeau = Ordonnances.CodeTroupeau " _
    & "WHERE (((Troupeaux.CodeTroupeau)= '" & CodeT & "') AND ((Categories.LibelleCategorie)='Curatif' Or (Categories.LibelleCategorie)='Préventif' Or (Categories.LibelleCategorie)='Matériel' Or (Categories.LibelleCategorie)='Hygiène') AND ((Ordonnances.DateOrdonnance) Between [Forms]![STATS PS BILANS]![D1] And [Forms]![STATS PS BILANS]![D2]) AND (([Familles]![LibelleFamille]+'\'+[SousFamilles]![Libelle]) Like 'Vaccin*'));"
     
    ' affichage du SQL
    MsgBox strSQL
    ' création du recordset
    Set res = CurrentDb.OpenRecordset(strSQL)

    Le message dit Trop peu de paramètres attendu..
    Comment ce fait il que 2 paramètres suffisent dans l'éditeur de requête
    et qu'ici, il faille plus de paramètres ?
    J'ai essayé d'en rajouter à la fin de la logne Parameters (par exemple "CodeT Text")
    mais rien n'y fait.

    Une petite piste....
    D'avance merci...


    Cordialement,
    fevec

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Regarde dans cette discussion et dans la faq.

    Pour la première méthode (qui consiste à concaténer la valeur du paramètre, comme tu l'a fais avec CodeT) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim res As DAO.Recordset
    Dim strSQL As String
    Dim strD1 As String, strD2 As String
     
    strD1 = "#" & Format([Forms]![STATS PS BILANS]![D1],"mm\/dd\/yyyy") & "#"
    strD2 = "#" & Format([Forms]![STATS PS BILANS]![D2],"mm\/dd\/yyyy") & "#"
    strSQL = "SELECT Articles.Libelle, LignesOrdonnances.Quantite, Troupeaux.CodeTroupeau FROM Troupeaux INNER JOIN (Ordonnances INNER JOIN ((SousFamilles RIGHT JOIN (Familles RIGHT JOIN (Articles RIGHT JOIN LignesOrdonnances ON Articles.CodeArticle = LignesOrdonnances.CodeArticle) ON Familles.CodeFamille = Articles.CodeFamille) ON SousFamilles.CodeSousFamille = Articles.CodeSousFamille) LEFT JOIN Categories ON Articles.CodeCategorie = Categories.Cle) ON Ordonnances.CodeOrdonnance = LignesOrdonnances.CodeOrdonnance) ON Troupeaux.CodeTroupeau = Ordonnances.CodeTroupeau " _
    & "WHERE (((Troupeaux.CodeTroupeau)= '" & CodeT & "') AND ((Categories.LibelleCategorie)='Curatif' Or (Categories.LibelleCategorie)='Préventif' Or (Categories.LibelleCategorie)='Matériel' Or (Categories.LibelleCategorie)='Hygiène') AND ((Ordonnances.DateOrdonnance) Between " & strD1 & " And " & strD2 & ") AND (([Familles]![LibelleFamille]+'\'+[SousFamilles]![Libelle]) Like 'Vaccin*'));"
     
    ' affichage du SQL
    MsgBox strSQL
    ' création du recordset
    Set res = CurrentDb.OpenRecordset(strSQL)
    A+

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2007
    Messages : 184
    Points : 188
    Points
    188
    Par défaut
    Merci LedZeppII,
    J'avais bien vu l'article de la FAQ...mais je butais visiblement sur la syntaxe des paramètres date
    Est ce que le code de la FAQ est supposé fonctionner sous Access97 ?

    Bien sur ta solution marche parfaitement,
    Vraiment merci beaucoup.
    Cordialement,
    fevec

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Je pense que la méthode avec DAO et requête paramétrée doit fonctionner.

    Exemple simple :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Dim db As DAO.Database, qd As DAO.QueryDef, rs As DAO.Recordset
    Dim strSQL As String
     
    strSQL = "PARAMETERS Dt1 DateTime, Dt2 DateTime;" & vbCrLf & _
             "SELECT [N° commande], [Code client], [Date commande]" & vbCrLf & _
             "FROM Commandes" & vbCrLf & _
             "WHERE (([Date commande]) Between [Dt1] And [Dt2]);"
     
    ' Création requête temporaire
    Set db = CurrentDb
    Set qd = db.CreateQueryDef("", strSQL)
     
    ' Paramètres de la requête
    qd.Parameters("Dt1").Value = #1/1/1996#
    qd.Parameters("Dt2").Value = #12/31/1996#
     
    ' ouverture de la requête et récupération d'un recordset
    Set rs = qd.OpenRecordset(dbOpenDynaset)
    If Not rs.EOF Then rs.MoveLast
    Debug.Print rs.RecordCount
     
    ' Fermeture et libération des objets
    rs.Close
    Set rs = Nothing
    qd.Close
    Set qd = Nothing
    db.Close
    Set db = Nothing
    Dans mon exemple les paramètres sont entrés sous formes de date littérales VB.
    Dans ton cas tu écrirai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' Paramètres de la requête
    qd.Parameters("Dt1").Value = [Forms]![STATS PS BILANS]![D1]
    qd.Parameters("Dt2").Value = [Forms]![STATS PS BILANS]![D2]
    Les paramètres de la requêtes étant déclarés de type Date,
    VB convertit [Forms]![STATS PS BILANS]![D1] et [Forms]![STATS PS BILANS]![D2] dans ce type.
    On ne met pas de # car on affecte une valeur stockée à une autre valeur stockée.
    C'est comme si on affectait le contenu d'une variable à une autre variable.

    A+

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

Discussions similaires

  1. [AC-2003] Erreur d'éxécution '3061'
    Par cobaye13 dans le forum VBA Access
    Réponses: 4
    Dernier message: 18/04/2015, 23h19
  2. Erreur d'éxécution '3061'
    Par pit88 dans le forum VBA Access
    Réponses: 3
    Dernier message: 15/06/2007, 05h55
  3. mySQL - Erreur d'éxécution 3061
    Par sbeprod dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 10/04/2007, 17h55
  4. [Etat][Requête] Erreur d'éxécution '3364'
    Par Optimus dans le forum IHM
    Réponses: 2
    Dernier message: 05/01/2006, 14h24
  5. Réponses: 3
    Dernier message: 03/11/2005, 18h41

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