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 3027 : Objet ou base de données en lecture seule [AC-2003]


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Erreur 3027 : Objet ou base de données en lecture seule
    Bonjour à tous !

    Je rencontre l'erreur suivante lors de l'exéution d'un code VB sous Access 2003.
    Erreur 3027 : Mise à jour impossible. La base de données ou l'objet est en lecture seule.
    Le code est le suivant :
    Code sql : 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Public Sub Budget_Mensualisé_Douzième()
     
    Dim db As Database
    Dim rs, rs2 As Recordset
    Dim sql As String
    Dim i As Integer
     
    Set db = CurrentDb
     
    sql = "SELECT * FROM Budget WHERE Type='Budget' AND libellé_N3='Frais postaux' or Type Like 'E?' AND libellé_N3='Frais postaux' UNION "
    sql = sql & " SELECT * FROM Budget WHERE Type='Budget' AND libellé_N3='Cessions d''immobilisations corporelles' OR Type Like 'E?' AND libellé_N3='Cessions d''immobilisations corporelles' UNION"
    sql = sql & " SELECT * FROM Budget WHERE Type='Budget' AND libellé_N3='Formation' or Type Like 'E?' AND libellé_N3='Formation' UNION "
    sql = sql & " SELECT * FROM Budget WHERE Type='Budget' AND libellé_N3='Litiges sociaux' or Type Like 'E?' AND libellé_N3='Litiges sociaux' UNION"
    sql = sql & " SELECT * FROM Budget WHERE Type='Budget' AND libellé_N3='Personnel extérieur' or Type Like 'E?' AND libellé_N3='Personnel extérieur' UNION"
    sql = sql & " SELECT * FROM Budget WHERE Type='Budget' AND libellé_N3='Charges variables Locaux' or Type Like 'E?' AND libellé_N3='Charges variables Locaux';"
     
    Set rs = db.OpenRecordset(sql)
    Set rs2 = db.OpenRecordset(sql)
     
    If rs.EOF = False Then rs.MoveFirst
    If rs2.EOF = False Then rs2.MoveFirst
     
    Do While rs.EOF = False And rs2.EOF = False
     
    For i = 1 To 12 Step 1
     
    rs.AddNew
    rs!Type = rs2!Type & "_mensualisé_douzième"
    rs!Libellé_N3 = rs2!Libellé_N3
    rs!CC_DEPT = rs2!CC_DEPT
    rs!Année = rs2!Année
    rs!Entité = rs2!Entité
    rs!Solde = rs2!Solde / 12
    rs!Mois = i
    rs.Update
     
    Next
     
    rs.MoveNext
    rs2.MoveNext
     
    Loop
     
    DoCmd.RunSQL ("INSERT INTO Archive_Budget VALUES(Date(), 'Budget_mensualisé_douzième','8.333','8.333','8.333','8.333','8.333','8.333','8.333','8.333','8.333','8.333','8.333','8.333')")
     
    End Sub

    Le problème provient du rs.Addnew et du fait que la requête soit multiple. En effet, je l'ai testé avec une requête simple et donc un seul SELECT et ça marche.

    Est-ce que vous avez des idées sur la source du problème, parce que j'ai presque tout essayé et je suis à court d'idée.
    Merci d'avance !

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    1/ On ne peut pas mettre à jour/ajouter des données d'une requête UNION
    2/ Le mode d'ouverture de tes Recordsets doit être préciser selon ce que l'on veut faire.

    Donc tu dois procéder autrement.

    Entre (), je ne comprends pas ton code (les 2 RS ouvrent la même requête); explique ce que tu veux faire, on va trouver une alternative.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Tout d'abord, merci d'avoir donné une réponse aussi rapidement.

    Ensuite, j'ouvre deux recordsets avec la même requête parce que je souhaite dupliquer une ligne en plusieurs lignes en répartissant la valeur de la colonne "Solde" entre toutes les lignes créées.(c'est un peu barbare peut-être comme méthode mais ça reste efficace sur d'autres procédures...)

    En effet, j'ai ma table Budget sur laquel je fais mon recordset. Je souhaite récupérer différents "libellé_N3" dans la requête et je n'ai de solution que d'utiliser une requête UNION.

    D'ailleurs, je ne savais pas que l'on ne pouvait ajouter de données lors d'une requête UNION.

    Ensuite pour le 2/, j'ai déjà essayé de préciser le mode d'ouverture mais ça ne changeait rien au problème. (j'ai essayé dbOpenDynaset,dbPessimistic comme l'avait conseillé l'aide Microsoft mais n'y a fait).

    Donc, je suis un peu perdu pour ajouter des données. Dois-je plutot ouvrir mon recordset avec dbOpenTable et appliquer un filtre ?

    Encore merci pour ton aide

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Eh bien plus simplement, créé une table "temporaire" avec ta requête UNION :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ListeDesChampSouhaités FROM [Requête_UNION] INTO [Table_Cible] [WHERE Condition = Valeur]
    Si cette table existe, supprime-là avant (tu peux vérifier avec un:
    par exemple...
    De là, tu ouvres un Recordset sur cette table et tu procèdes aux ajouts nécessaires.
    Une fois cela fait, tu inserts alors les valeurs de cette table dans la table cible via un INSERT.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Oui, certes, c'est une très bonne méthode mais je pense avoir trouvé plus rapide et efficace à mon problème.

    En fait, j'utilisais des UNION pour récupérer des données provenant d'une seule table. Je pensais que ça allait simplifier le process hors ça l'a complètement bloqué (car je ne savais pas que l'instruction .AddNew ne s'appliquait pas avoir une requête multiple).
    Donc dans ma requête j'ai remplacé les UNION par des
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    OR Libellé_N3='Frais de déplacement' OR Libellé_N3...
    et cela a marché.

    Donc merci quand même pour tes lumières qui m'aderont surement plus tard et j'ai appris quelque chose grâce à toi !

    et encore

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

Discussions similaires

  1. Echange de base de données en lecture seule à chaud
    Par benjamin.morelle dans le forum Administration
    Réponses: 3
    Dernier message: 28/02/2013, 19h17
  2. [AC-2003] Ouvrir une base de données en lecture seule
    Par tototiti2008 dans le forum VBA Access
    Réponses: 3
    Dernier message: 08/12/2010, 22h24
  3. Code VBA-Base de données en lecture seule
    Par @lex7020 dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/11/2007, 16h12
  4. [Ouverture Base] Base de données en lecture seule
    Par Zartak dans le forum VBA Access
    Réponses: 7
    Dernier message: 10/05/2007, 15h22
  5. base de donnée en lecture seule
    Par LeXo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 09/02/2007, 16h14

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