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 :

Erreur 3073 : l'opération doit utiliser une requête qui peut être mise à jour.


Sujet :

VBA Access

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut Erreur 3073 : l'opération doit utiliser une requête qui peut être mise à jour.
    bonsoir a tous,

    j'ai une base mysql que j'attaque avec Excel. Pas de liens avec access sauf que apparemment le même problème apparaît avec access donnant le même message d'erreur.

    Je veux faire un UPDATE de valeur d'un enregistrement donné.

    J'avais fait une requête UPDATE avec une sous requête SELECT mais j'avais l'erreur 3073.

    Je me suis dit que la sous requête posait problème.

    J'ai donc fait le "truc" en 2 fois :

    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
     
            requete_num_ligne = "select serial_lvl3 from lvl3_pieces " & _
                                " where contrat = " & Chr("34") & contract_xls & Chr("34") & _
                                " AND item = " & Chr("34") & item_xls & Chr("34") & _
                                " AND element = " & Chr("34") & element_xls & Chr("34") & _
                                " AND reference = " & Chr("34") & reference_xls & Chr("34") & ""
     
            Set monRS_numligne = maBDD.OpenRecordSet(requete_num_ligne, dbOpenDynaset)
     
            toto = monRS_numligne.Fields("serial_lvl3")
     
            requete_test = "UPDATE lvl3_pieces SET bordereau1= " & Chr("34") & TN1 & Chr("34") & "," & _
                                                    "date_envoi1= " & Chr("34") & TD1 & Chr("34") & "," & _
                                                    "bordereau2= " & Chr("34") & TN2 & Chr("34") & "," & _
                                                    "date_envoi2= " & Chr("34") & TN2 & Chr("34") & "," & _
                                                    "bordereau3= " & Chr("34") & TN2 & Chr("34") & "," & _
                                                    "date_envoi3= " & Chr("34") & TN2 & Chr("34") & "," & _
                                                    "bordereau4= " & Chr("34") & TN2 & Chr("34") & "," & _
                                                    "date_envoi4= " & Chr("34") & TN2 & Chr("34") & _
                                            " WHERE lvl3_pieces.serial_lvl3 = " & toto
     
              maBDD.Execute requete_test
    mais j'ai le même message d'erreur et je sèche...

    merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    canichon

    & Chr("34")

    plutôt un chr(34).

    en affichant le contenu de : (debug.print)

    requete_num_ligne et requete_test tu aurais pu t'apercevoir du rendu de ta requête

    jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  3. #3
    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,

    Est-ce que lvl3_pieces est une table liée (ODBC) à une table MySql ?
    Si oui, est-elle bien accessible en écriture ?
    Il n'est pas rare qu'une table liée ODBC soit en lecture seule.

    A+

  4. #4
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    canichon, LedZeppII

    après un rapide test, je me rends compte effectivement que la façon de passer le double quote fonctionnne aussi

    c'est la remarque de ledzeppII, et son absence de commentaire sur mon post (il a peut-être pas osé me traiter de par gentillesse) qui m'ont fait douter de moi...

    je m'en excuse donc : suivre la piste de ledzeppII

    jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  5. #5
    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 Jimbolion,
    Citation Envoyé par jimbolion Voir le message
    ...
    c'est la remarque de ledzeppII, et son absence de commentaire sur mon post (il a peut-être pas osé me traiter de par gentillesse) qui m'ont fait douter de moi...

    je m'en excuse donc : suivre la piste de ledzeppII

    jimbolion
    Je n'ai pas commenté ton post car, bien qu'ayant vu que Chr("34") n'était pas la cause du problème (cast implicite VBA de "34" vers 34), je n'avais pas compris que tu incriminais le seul Chr("34").
    Je me suis contenté de donner une piste qui me paraissait vraisemblable.

    En tous cas, c'est tout à ton honneur de reconnaitre que ta piste n'était sans doute pas la bonne .

    Attendons de voir ce que canichon va nous dire sur la nature exacte de lvl3_pieces.

    A+

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    Merci pour vos réponses.

    toutes les tables sont des tables mysql et toutes est en lecture/écriture.

    Je fais des mises a jour en masse de la BDD a partir d'excel sans problèmes.

    le SELECT fonctionne, l'ajout de nouveau enregistrements fonctionne mais pas l'update.

    J'avais déjà investigué sur internet et c'est apparemment la sous requête qui poserait problème d'où mon code en 2 requêtes séparées mais ceci est au conditionnel vues mes compétences en sql.

  7. #7
    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
    Bonsoir,

    Bon, il semble que la piste à laquelle je pensais ne soit pas la bonne.
    Si je comprends bien, lvl3_pieces est une table liée (ODBC) à la table lvl3_pieces dans mySql.
    Dans Access tu peux ouvrir cette table liée, ajouter des enregistrements, modifier des enregistrements.
    Je ne vois donc pas pourquoi l'exécution de la requête UPDATE est refusée par Access, sous le motif que la requête ne peut pas être mise à jour, sous-entendant que la table lvl3_pieces est en lecture seule (dans Access).

    Avant...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              maBDD.Execute requete_test
    ... ajoute un Debug.Print comme l'a suggéré Jimbolion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              debug.Print requete_test
              maBDD.Execute requete_test
    Il y aura peut-être quelque chose qui va te sauter au yeux.

    Par ailleurs, quelque chose me parait suspect: tu affectes le contenu de TN2 aussi bien à des champs dont le nom commence par "bordereau", qu'à des champs dont le nom commence par "date_envoi".
    Ça n'a peut-être rien à voir avec le problème, mais on sait jamais.

    A+

  8. #8
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 869
    Points : 3 448
    Points
    3 448
    Par défaut
    Bonjour canichon, LedZeppII, jimbolion,

    Je ne sais pas si ça peut être si simple, mais est-ce qu'il y a une clé primaire défini?

    http://stackoverflow.com/questions/1...crosoft-access

    This occurs when there is not a UNIQUE MS-ACCESS key for the table(s) being updated. (Regardless of the SQL schema).

    When creating MS-Access Links to SQL tables, you are asked to specify the index (key) at link time. If this is done incorrectly, or not at all, the query against the linked table is not updatable

    When linking SQL tables into Access MAKE SURE that when Access prompts you for the index (key) you use exactly what SQL uses to avoid problem(s), although specifying any unique key is all Access needs to update the table.

    If you were not the person who originally linked the table, delete the linked table from MS-ACCESS (the link only gets deleted) and re-link it specifying the key properly and all will work correctly.
    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  9. #9
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Cher tous,

    ajoute un Debug.Print comme l'a suggéré Jimbolion:
    Code :Sélectionner tout - Visualiser dans une fenêtre à part
    bebug.Print requete
    maBDD.Execute requete_test
    Il y aura peut-être quelque chose qui va te sauter au yeux.

    à corriger par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    debug.Print requete
    maBDD.Execute requete_test
    Lorsque tu auras récupéré ta requête (via l'éditeur), essaie de l’exécuter dans l'assistant en la copiant-collant (mode sql) et affiche la en mode création.

    La piste de Robert semble aussi intéressante.

    Cordialement

    Jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  10. #10
    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,
    Citation Envoyé par jimbolion Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bebug.Print requete
    maBDD.Execute requete_test
    à corriger par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    debug.Print requete
    maBDD.Execute requete_test
    corrigé dans mon post. Merci.

    La piste de Robert1957 est celle à laquelle je pensais: Absence de clé ou d'index unique rendant la table liée ODBC accessible uniquement en lecture.

    Sinon, une alternative est de passer par ADODB (Microsoft ActiveX Data Objects x.x Library).
    Exemple avec une table dépourvue de clé et d'index (fournisseurs2 dans l'exemple):
    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
    35
    36
    Dim oCnMySQL As ADODB.Connection
    Dim strConn As String
    Dim sSql As String, lgRecsAffected As Long
    Dim sPilote As String, sServer As String, sDb As String, sUser As String, sPwd As String
     
     
    ' Crée objet Connexion ADO
    Set oCnMySQL = New ADODB.Connection
    ' Définit chaîne de connexion
            sPilote = "MySQL ODBC 5.2 Unicode Driver"   ' Nom du pilote odbc
            sServer = "XXXXXX"                          ' Nom du serveur
                sDb = "test"                            ' Nom de la base de données mySql
              sUser = "xxxxx"                           ' Nom utilisateur mySql
               sPwd = "xxxxx"                           ' Mot de passe utilisateur
    strConn = "Provider=MSDASQL" & _
             ";Driver=" & sPilote & _
             ";SERVER=" & sServer & _
             ";DATABASE=" & sDb & _
             ";UID=" & sUser & _
             ";PWD=" & sPwd
    ' Ouvre la connexion
    oCnMySQL.Open strConn
     
    ' Execute instruction sql updates #1
    sSql = "update fournisseurs2 set `Page accueil` = 'about:blank' where `N° fournisseur` = 10"
    oCnMySQL.Execute sSql, lgRecsAffected
    Debug.Print lgRecsAffected & " enregistrement(s) mis à jour"
     
    ' Execute instruction sql updates #2
    sSql = "update fournisseurs2 set `Page accueil`= null where `N° fournisseur` = 10"
    oCnMySQL.Execute sSql, lgRecsAffected
    Debug.Print lgRecsAffected & " enregistrement(s) mis à jour"
     
    ' Fermeture connexion
    oCnMySQL.Close
    Set oCnMySQL = Nothing
    Remarques:
    - la syntaxe du sql ci-dessus est celle de mySql, d'où les noms de champs entre guillemets obliques (`nom de champ` au lieu de [nom de champ])
    - remplacer MySQL ODBC 5.2 Unicode Driver par le nom exact du pilote odbc mySql présent sur la station de travail.

    A+

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    bonjour a tous,

    comme je l'ai mentionné dans mon message d'origine, je n'utilise pas access... tout se passe entre mysql et excel. Donc pas de table "tampon" access et pas de double liaison excel/access et acces/mysql le cas échéant.

    Sinon il existe bien une clé primaire à ma table
    lvl3_pieces
    qui est
    serial_lvl3
    . Ma sous requète n'est utile que pour retrouver la clé primaire de mon enregistrement à updater donc oui, il existe bien une clé primaire à ma table.

    J'ai pu faire le test d'exécuter ma requête dans XAMPP à partir d'un copier/coller de ma variable
    requete_test
    et ça marche. Il n'y a donc pas d'erreur de syntaxe dans ma requête et pas de soucis de droit en lecture/écriture a moins que les droits soient différents !!!

    est ce que le problème ne viendrait pas des "possibilités restreintes" que propose Microsoft par rapport à du sql "pur" ??

    Merci pour votre aide

  12. #12
    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,

    Citation Envoyé par canichon Voir le message
    comme je l'ai mentionné dans mon message d'origine, je n'utilise pas access... tout se passe entre mysql et excel.
    Je croyais que le code posté ici était un test dans Access, d'autant plus que le recordset est un recordset DAO et que le message d'erreur est un message typiquement Access.
    Est-ce que tu utilises la bibliothèque DAO dans Excel pour te connecter à la base mySQL ?
    Si oui, je pense que c'est elle le problème, depuis Office 2007 et l'abandon des espaces de travail ODBC dans DAO.

    Essaie mon code ADODB. Il fonctionne aussi bien dans Access que dans Excel, Word, Outlook, PowerPoint ...
    En bref il est prévu pour fonctionner en VBA, quelle que soit l'application hôte.

    A toute fin utile, voici un autre exemple ADODB dans Excel.
    Il fait la même chose que mon exemple de la fois précédente.
    Les différences sont ...
    - mon classeur Excel (2007) a une connexion OLE DB (celles qu'on voit dans l'onglet Données, groupe Connexions) à ma table mySql
    - je récupère la chaîne de connexion utilisée par l'objet connexion d'Excel pour importer la table mySql dans le classeur.
    - je crée mon objet ADODB en liaison tardive.
    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
    Dim oWks As Worksheet
    Dim oWbkConn As WorkbookConnection
     
    Dim oConn As Object
    Dim sADOConnStr As String
    Dim sSql As String, lgRecs As Long
     
    Set oWks = Me
    Set oWbkConn = oWks.ListObjects(1).QueryTable.WorkbookConnection
    sADOConnStr = oWbkConn.OLEDBConnection.Connection
     
    Set oConn = CreateObject("ADODB.Connection")
    oConn.Open sADOConnStr
     
    sSql = "update fournisseurs2 set `Page accueil` = 'about:blank' where `N° fournisseur` = 10"
    oConn.Execute sSql, lgRecs
     
    sSql = "update fournisseurs2 set `Page accueil`= null where `N° fournisseur` = 10"
    oConn.Execute sSql, lgRecs
     
    If Not (oConn Is Nothing) Then
       If oConn.State <> 0 Then oConn.Close
    End If
    Set oConn = Nothing
    A+

  13. #13
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    OK OK... OK...

    heu... va falloir me laisser un moment pour digérer tout ça parce que là, je comprends pas grand chose...

    Je reviens vers toi/vous si le problème persiste.

    Merci

Discussions similaires

  1. [XL-2007] Erreur:L'opération doit utiliser une requête qui peut être mise à jour.
    Par gerard.degreve dans le forum Excel
    Réponses: 1
    Dernier message: 06/01/2012, 14h12
  2. Réponses: 8
    Dernier message: 20/01/2011, 08h57
  3. Réponses: 1
    Dernier message: 18/12/2009, 10h29
  4. Réponses: 1
    Dernier message: 23/05/2008, 11h45
  5. Réponses: 7
    Dernier message: 29/04/2008, 12h16

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