Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/06/2011, 11h54   #1
Invité de passage
 
Homme Jonathan Collet
Étudiant
Inscription : juin 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Jonathan Collet
Localisation : France, Nord (Nord Pas de Calais)

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

Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
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.
Citation:
Erreur 3027 : Mise à jour impossible. La base de données ou l'objet est en lecture seule.
Le code est le suivant :
Code sql :
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 !
cocols59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 12h57   #2
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 209
Points : 6 209
Envoyer un message via MSN à argyronet
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
__________________
Ils comptent sur vous...

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.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 13h41   #3
Invité de passage
 
Homme Jonathan Collet
Étudiant
Inscription : juin 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Jonathan Collet
Localisation : France, Nord (Nord Pas de Calais)

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

Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
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
cocols59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 14h26   #4
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 209
Points : 6 209
Envoyer un message via MSN à argyronet
Eh bien plus simplement, créé une table "temporaire" avec ta requête UNION :
Code :
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
__________________
Ils comptent sur vous...

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.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 15h19   #5
Invité de passage
 
Homme Jonathan Collet
Étudiant
Inscription : juin 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Jonathan Collet
Localisation : France, Nord (Nord Pas de Calais)

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

Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
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 :
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
cocols59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h46.


 
 
 
 
Partenaires

Hébergement Web