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 :

Erreur lors de l'execution d'une requête avec recordset ADODB [AC-2016]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2015
    Messages : 51
    Points : 47
    Points
    47
    Par défaut Erreur lors de l'execution d'une requête avec recordset ADODB
    Bonjour,

    J'ai une requête comportant des jointure qui fonctionne parfaitement avec l'éditeur de requête d'Access mais pas avec le recordset ADODB.

    Il est vrai que je ne suis pas très à l'aise avec les recordset et j'ai eu beau chercher dans la FAQ et dans le tuto de Jean-Marc Rabilloud https://vb.developpez.com/bidou/recordset-ado/, je n'arrive pas à comprendre pourquoi.

    Ou est l'erreur?

    Requête fonctionnant avec l'éditeur Access:

    Nom : Schéma.PNG
Affichages : 168
Taille : 13,2 Ko

    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
    30
    31
    32
    33
    34
     
    Sub testsave()
     
        Save_Architecture ("9032")
     
    End Sub
     
    Sub Save_Architecture(sNoCentrale As String)
     
        Dim cnt     As ADODB.Connection
        Dim rs      As ADODB.Recordset
        Dim sSql    As String
     
     
        sSql = "SELECT Centrale.No_centrale, Onduleur.No_serie " _
        & "FROM ((Centrale INNER JOIN Sauvegarde_architecture_centrales ON Centrale.No_centrale = Sauvegarde_architecture_centrales.No_centrale) INNER JOIN [Local] ON Centrale.No_centrale = Local.No_centrale) INNER JOIN Onduleur ON Local.Id = Onduleur.Local_id " _
        & "WHERE (((Centrale.No_centrale)='" & sNoCentrale & "') AND ((Onduleur.No_serie)=(Sauvegarde_architecture_centrales.No_serie_onduleur)));"
     
        Set cnt = CurrentProject.Connection
     
        Set rs = New ADODB.Recordset
        rs.Open sSql, cnt, adOpenKeyset, adLockBatchOptimistic, adCmdText
     
        If rs.EOF Then
            MsgBox " sauvegarde OK"
        Else
            MsgBox "Cette configuration à dèjà été sauvegardée"
        End If
     
        rs.Close
        Set rs = Nothing
        cnt.Close
        Set cnt = Nothing
    End Sub
    Message d'erreur:

    Nom : Message erreur.PNG
Affichages : 160
Taille : 5,5 Ko

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Bonjour.

    Et tu t'embêtes avec ADO parce-que ?

    Si tes données sont des tables Access dans une BD Access ou des tables liées sur un autre type de BD utiliser DAO est nettement plus simple.

    Bon revenons à ton problème, comme je ne connais pas ADO (voir remarque précédente), essaye avec une requête plus simple.

    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql="select * from Centrale;"
    Et voit si ça fonctionne.

    Si oui c'est ton SQL qui pose un problème, c'est peut-être la connexion.

    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 du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2015
    Messages : 51
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Et tu t'embêtes avec ADO parce-que ?
    Ben parce qu’il y a 2 mois je n'y connaissais rien en recorset et que comme sur les forums les avis sont partagés entre DAO et ADO, j'ai choisi de me former un peu au hasard...

    Sinon pour en revenir au problème, j'utilise ce recordset dans plusieurs code sans problème mais là la différence avec mes autre codes c'est qu'il y a des jointures.

    Effectivement j'avais bien sûr testé avec des requêtes simples et ça fonctionne.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Ok donc le pb est le SQL.

    Essaye en enlevant la valeur variable et en la remplaçant par une valeur que tu sais être bonne.
    Et tu peux faire ménage dans les parenthèses.
    Le SQL généré par Access en est plein mais c'est parce que c'est plus facile à programmer mais on en pas vraiment besoin.
    Pour les jointures je ne suis pas certain, pour la clause where c'est sûr.
    Ça rend ton SQL plus lisible pour un humain aussi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "SELECT Centrale.No_centrale, Onduleur.No_serie " _
        & "FROM ((Centrale INNER JOIN Sauvegarde_architecture_centrales ON Centrale.No_centrale = Sauvegarde_architecture_centrales.No_centrale) INNER JOIN [Local] ON Centrale.No_centrale = Local.No_centrale) INNER JOIN Onduleur ON Local.Id = Onduleur.Local_id " _
        & "WHERE Centrale.No_centrale='MettreUneBonneValeurIci' AND Onduleur.No_serie=Sauvegarde_architecture_centrales.No_serie_onduleur;"
    Si cela ne donne rien essaye en ne gardant qu'une seule jointure.

    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
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Bonjour,

    Effectivement avec des alias pour les tables et sans toutes les () inutiles ce serait plus lisible...

    Si la requete marche dans le requeteur elle devrait marcher aussi en ADO (pour une base access, sinon ce n'est pas le même sql). No_centrale est défini comme une string et non un nombre ? Sinon il ne faut pas l'encadrer de '

    Dernière piste : personnellement je me contente la plupart du temps de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rst.Open Sr, cnt, adOpenStatic

    C'est sur que le message d'erreur n'est pas trop explicite
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  6. #6
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2015
    Messages : 51
    Points : 47
    Points
    47
    Par défaut
    Bonjour a tous et merci de vous êtes intéresser à mon problème.

    J'ai pris le temps de refaire des essais calmement et j'ai trouvé précisément ou se trouvait le problème, par contre je n'ai pas de solution qui me convienne.

    Le problème vient du fait que j'ai nommé une table avec un mot réservé (j'ignorais qu'il l'était), le mot Module.

    Quand je crée ma requête dans le requêteur, il met ce mot entre crochet (voir code).

    Par contre il semble que le recorset ne sache pas gérer ces crochets. Si j'enlève les crochets dans ma requête VBA, ça ne marche pas non plus.

    J'ai fait un gros travail sur cette base et je n'ai pas franchement envie de renommer ma table. Quelqu'un connait-il une astuce pour faire un équivalent de ces crochets dans ma requête en VBA?

  7. #7
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2015
    Messages : 51
    Points : 47
    Points
    47
    Par défaut
    Pardon, dans l'exemple du code c'est le mot Local qui pose problème.

    j'ai refait les test avec une table Module qui pose exactement le même problème, c'est pour ça que je parle de cette table ci-dessus.

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Bonjour.

    Tu peux mettre des crochets dans le SQL autours du nom du champ, normalement cela marche.
    En fait moi quand j'écris du SQL à la main je fais systématiquement [NomMaTable].[NomMonChamp].
    Ça évite de se poser la question pour savoir si oui on non il en faut.

    Solution alternative, essayer avec DAO qui ne pose généralement pas de problème.

    Ça donnerai :

    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 dao.database:set db=currentdb
    sSql = Ici ta requete
    dim r as dao.Recordset:set r=db.openrecordset(SQL, dbOpenSnapshot)
     
    If r.recordcount=0 Then
            MsgBox " sauvegarde OK"
    Else
            'Attention quand on vient d'ouvrir un recordset, si il y a des données recordcount contient toujours 1 même si tu as un million d'enregistrements.
            MsgBox "Cette configuration à dèjà été sauvegardée"
    End If
     
    r.close: set r=nothng
    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.

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Alors dans le SQL met [Local].[No_centrale] au lieu de Local.No_centrale.

    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.

  10. #10
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2015
    Messages : 51
    Points : 47
    Points
    47
    Par défaut
    Merci Marot_r, les requêtes marchent nickel avec DAO.

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

Discussions similaires

  1. Erreur lors de l'exécution d'une requête avec ADOquery
    Par doolar dans le forum Bases de données
    Réponses: 2
    Dernier message: 03/05/2008, 13h26
  2. Réponses: 6
    Dernier message: 13/12/2007, 03h13
  3. Erreur lors de la conversion d'une requête SELECT en DELETE
    Par SamLeChiseuji dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/07/2007, 15h09
  4. [VS]Erreur lors de l'execution d'une fonction
    Par nephhh dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/06/2007, 14h12
  5. [MySQL] Erreur lors de la construction d'une requête
    Par gaetan24 dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 06/04/2007, 15h45

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