OVH Cloud OVH Cloud

CreateQueryDef et erreur 3622

3 réponses
Avatar
HervéR
Bonjour à tous,
Dans un formulaire Access XP, j'utlise le code suivant pour mettre à jour
une table liée présente sur un MS SQL Server 2000 :

Dim MaBase As Database
Dim MaRequêteTemp As QueryDef
Dim MonSQL as String
Dim TheValeur as integer
[initialisation de la valeur TheValeur]
MonSQL = "UPDATE MaTable set MonChamp = " & Chr(34) & "X" & Chr(34)
MonSQL = MonSQL & " where MonID = " & TheValeur & ";"
Set MaBase = CurrentDb
Set MaRequêteTemp = MaBase.CreateQueryDef("", MonSQL)
MaRequêteTemp.Execute
MaRequêteTemp.Close
Set MaBase = Nothing

Le «MaRequêteTemp.Execute» remonte une erreur 3622 :
Vous devez utiliser l'option dbSeeChanges avec OpenRecordset lors de l'accès
à une table serveur SQL ayant une colonne IDENTITY. (Erreur 3622)

Je précise que :
1) le texte de ma requête est correct. Pour le tester, j'ai mis dans mon
code
Set MaRequêteTemp = MaBase.CreateQueryDef("toto", MonSQL)
puis lancé "à la main" la requête "toto" qui a parfaitement rempli son
office.
2) si à la place de
MaRequêteTemp.Close
j'utilise le code :
MonSQL = Left(MonSQL, Len(MonSQL) - 1) ' afin denlever le « ; »
DoCmd.RunSQL MonSQL
cela fonctionne parfaitement, mais avec la mise en garde «Vous allez mettre
à jour 1 ligne(s). ...»
3) Ma table liée possède effectivement une colonne Identity mais je vois pas
le rapport avec le OpenRecordset du message d'erreur !

Merci d'avance pour votre aide.

3 réponses

Avatar
HervéR
Comme indiqué dans le 1), j'ai testé en faisant un
Set MaRequêteTemp = MaBase.CreateQueryDef("toto", MonSQL)
Lancée à la main, la requête qui porte le nom original de "toto" a
parfaitement fonctionné.
Du coup, je viens d'ajouter à mon code:
MaBase.Execute ("toto")
et cela me renvoie ma même erreur 3622 !!

Je ne vois vraiment pas ce qu'il peut y avoir :(
Avatar
HervéR
C'est encore moi :), -- ou plutôt :(

J'ai testé avec une instruction INSERT : ça passe bien.
J'ai testé avec une instruction DELETE: même erreur 3622.

Quelqu'un aurait-il une idée ?
Merci d'avance.
Avatar
HervéR
C'est bon !

Il me suffisait d'écrire :
MaRequêteTemp.Execute dbSeeChanges