XL 2010 Erreur 3027 sur un QueryDefs.sql

Davidc57

XLDnaute Occasionnel
Bonjour le forum,

Je rencontre une difficulté sur Excel 2010. Je cherche à modifier le code SQL d'une requête stockée dans Access à partir du code SQl d'une autre requête embarquée, à laquelle je rajoute une clause WHERE.

Bug 3027 (Impossible de mettre à jour. La base de données est en lecture seule) sur la ligne :
-> Query.Sql = sSQL

Info :

sRq_O02_SELECT = Requête que je veux modifier
sRq_O02_SELECT_Origine = Requête source à laquelle je rajoute la clause WHERE que je vais lire dans mon classeur excel dans une cellule nommée.

Ce que j'ai déjà essayé :

* La requête d'origine fait un "SELECT *" sur une autre requête. j'ai donc essayé de créer une table avec la requête source de la requête d'origine. Ainsi ma requête d'origine est devenue un "SELECT *" d'une table physique. Toujours le même bug.

* La clause WHERE est défini par l'utilisateur via un Formulaire (qui se connecte à la DB) qui affiche des données d'Access dans des List. l'utilisateur fait ses choix, clique sur valider et j'enregistre la clause WHERE. J'ai également essayé de modifier la requête sans ajouter de clause WHERE, donc sans appelé le formulaire. J'ai la même erreur. Donc cela ne vient pas de mon formulaire.

* J'ai essayé aussi de refermer la DB entre les deux lignes "Set Query = " mais toujours la même erreur.


Là je ne sais plus quoi faire !! Si quelqu'un a une idée car malgré mes recherches sur internet je n'arrive pas à m'en sortir.

Voici mon code :

Code:
Sub Exporter_INFOTEL_Physique_SELECT()

Dim db As Database
Dim Query As QueryDef
Dim rst As Recordset
Dim vMessage As Variant

Dim sCheminBaseDorsale As String
Dim sFichierExcel As String
Dim sSQL As String
Dim sSQL_Clause_WHERE As String

Dim sRq_O02 As String
Dim sRq_O02_SELECT As String
Dim sRq_O02_SELECT_Origine As String
Dim sFeuille_O02 As String
Dim sDNCible_O02 As String

' ######### Ouverture formulaire de choix des sites
frmChoix_Lots_Sites.Show
If Sheets("Admin").Range("dnAdmin_sSQL_Choix_Sites") = "" Then
    vMessage = MsgBox("Vous n'avez choisi aucun site !", vbCritical, "Opération annulée.")
    Exit Sub
End If

' Variables
sCheminBaseDorsale = Sheets("Pilotage").Range("dnCheminBaseDorsale").Value
sSQL_Clause_WHERE = Sheets("Admin").Range("dnAdmin_sSQL_Choix_Sites")
sRq_O02 = "R_Exportation_Infotel_F01_O02_FINAL"
sRq_O02_SELECT = "R_Exportation_Infotel_F01_O02_FINAL_SELECT"
sRq_O02_SELECT_Origine = "R_Exportation_Infotel_F01_O02_FINAL_SELECT_Origine"

Set db = OpenDatabase(sCheminBaseDorsale, False, True)

Set Query = db.QueryDefs(sRq_O02_SELECT_Origine)
sSQL = Query.Sql
sSQL = Replace(sSQL, ";", " ")
sSQL = sSQL & "WHERE (((" & sRq_O02 & ".CODNAT) " & sSQL_Clause_WHERE & "));"

db.Close
Set db = Nothing
Set Query = Nothing
Set db = OpenDatabase(sCheminBaseDorsale, False, True)

Set Query = db.QueryDefs(sRq_O02_SELECT)
Query.Sql = sSQL

End Sub

Merci.
Cdlt,
David
 

Davidc57

XLDnaute Occasionnel
J'ai simplifié encore plus mon code.
Je cherche maintenant à créer une nouvelle requête dans Access avec 'CreateQueryDefs'. j'obtiens toujours une erreur 3027.

Ma base Access est en local.
Elle n'est pas ouverte physiquement.
Il n'y pas de fichier .lccdb dans le même répertoire que la DB.
Je n'ai aucun MSACCESS.exe ouvert dans le gestionnaire des tâches.

Voici le code qui plante sur la ligne 'CreateQueryDefs' :

VB:
Sub Exporter_INFOTEL_Physique_SELECT()

Dim db As DAO.Database
Dim Query As DAO.QueryDef
Dim rst As DAO.Recordset
Dim vMessage As Variant

Dim sCheminBaseDorsale As String

sCheminBaseDorsale = Sheets("Pilotage").Range("dnCheminBaseDorsale").Value

Set db = OpenDatabase(sCheminBaseDorsale, False, True)
Set Query = db.CreateQueryDef("RQ_DCA_001", "SELECT * FROM T_SITES;")

db.Close
Query.Close
Set db = Nothing
Set Query = Nothing

End Sub


De quoi cela pourrait venir ?

Merci d'avance.
David
 

Davidc57

XLDnaute Occasionnel
Hourraaaaaa !!!!!

J'ai trouvé la réponse à mon problème :

VB:
Set db = OpenDatabase(sCheminBaseDorsale, False, True)

VB:
Set db = OpenDatabase(sCheminBaseDorsale, False, False)

Le 2ème "True" correspond au paramètre Read-Only de l'ouverture de la DB. je l'ai remplacé par false et cela fonctionne.

cdlt,
Davd
 

Discussions similaires

Réponses
2
Affichages
330