Erreur Syntaxe VBA sur code SQL [Résolu]

Damboushow 23 Messages postés vendredi 1 janvier 2016Date d'inscription 9 mai 2016 Dernière intervention - 1 janv. 2016 à 11:57 - Dernière réponse : Damboushow 23 Messages postés vendredi 1 janvier 2016Date d'inscription 9 mai 2016 Dernière intervention
- 3 janv. 2016 à 09:38
Bonjour, je tente de monter un petit système d'inventaire temporaire avec acces 2007. Je ne suis vraiment pas un connaisseur acces. Je veux avec la présente fonction que la quantité de l'item soit retiré de la base de données. J'ai l'erreur 3219 sur ma ligne de code de la requete SQL.

Dim db As Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.Execute("UPDATE Items SET QteStock = QteStock - Me.Quantité WHERE Items.N° = Me.Items")


J'ai essayé avec des guillemets et des double guillemets pour les Me, mais ça me donne une erreur de syntaxe également.

Me.Quantité est une zone de texte avec la quantité à déduire
Me.Item est une liste déroulante avec les items.

Merci!

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 

15 réponses

Répondre au sujet
ucfoutu 18035 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 17 février 2018 Dernière intervention - Modifié par ucfoutu le 1/01/2016 à 18:57
+1
Utile
Bonjour,
je ne vois pas où as déclaré db.
db devrait être déclarée (avant le set), comme étant le sgdb utilisé.
mets donc ceci :
If db Is Nothing Then
MsgBox "l'objet db n'existe pas"
Else
MsgBox "l'objet db existe"
End If

juste avant ta ligne disant :
Set db = CurrentDb

et dis-nous ce qu'affiche la msgbox

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ucfoutu
NHenry 14057 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 14 février 2018 Dernière intervention - 1 janv. 2016 à 14:19
0
Utile
6
Il te faut concaténer les chaines, pas simplement les mettre dans la chaine :
"Texte" & Variable & "Texte"
Damboushow 23 Messages postés vendredi 1 janvier 2016Date d'inscription 9 mai 2016 Dernière intervention - 1 janv. 2016 à 15:08
Merci, J'ai donc trouvé la solution il me manquait un +

Set rs = db.Execute("UPDATE Items SET QteStock = QteStock - "&qte& + " WHERE Items.N° = "&itm&)
Damboushow 23 Messages postés vendredi 1 janvier 2016Date d'inscription 9 mai 2016 Dernière intervention - 1 janv. 2016 à 16:15
J'ai effectué plusieurs test et voici le code dont je n'ai plus l'erreur qu'il manque un séparateur, par contre il me dit que Le caractère de déclaration de type ne correspond pas au type de données déclaré.

J'ai fait plusieurs test, meme un msgBox pour vérifier la valeur envoyé et c'Est bien un int et mon champ de table est bien en numérique. Il me donne la même erreur pour mes 2 variables.


Dim qte As Integer
qte = CInt(Me.Quantité.Value)
Dim itm As Integer
itm = CInt(Me.Items.Value)
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.Execute("UPDATE Items SET QteStock = QteStock - " & qte& + " WHERE Items.N° = " & itm&)


En modifiant le code comme suit, il me dit qu'il manque un opérateur de fin, à noter que le + n'y est plus, dès que j'ajoute les espaces il me retire mon signe + automatiquement.

Set rs = db.Execute("UPDATE Items SET QteStock = QteStock - " & qte & " WHERE Items.N° = " & itm &)


Avec le code comme suite, il me dit objet requis:

Set rs = db.Execute("UPDATE Items SET QteStock = QteStock - " & qte & " WHERE Items.N° = " & itm & "")
NHenry 14057 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 14 février 2018 Dernière intervention - 1 janv. 2016 à 16:19
Met un espace avant et après les & et retire les +.
et si à la fin il n'y a plus rien à concaténer, ne met pas de &
Damboushow 23 Messages postés vendredi 1 janvier 2016Date d'inscription 9 mai 2016 Dernière intervention > NHenry 14057 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 14 février 2018 Dernière intervention - 1 janv. 2016 à 16:38
Merci, je reçois toujours le message: objet requis.

Merci pour ton aide grandement apprécié.
NHenry 14057 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 14 février 2018 Dernière intervention - 1 janv. 2016 à 20:14
Sur quelle expression ?
Commenter la réponse de NHenry
Damboushow 23 Messages postés vendredi 1 janvier 2016Date d'inscription 9 mai 2016 Dernière intervention - 2 janv. 2016 à 09:59
0
Utile
Suite à plusieurs recherche hier, j'en suis venu au code suivant, dont j'ai ajouté votre IF, me reportant effectivement le message : db n'existe pas

Set Database = DBEngine.OpenDatabase("C:\Users\MONFICHIER1.accdb", False, False, "MS Access;PWD=")
Dim qte As Integer
qte = CInt(Me.Quantité.Value)
Dim itm As Integer
itm = CInt(Me.Items.Value)
Dim rs As DAO.Recordset
Dim db As DAO.Database
If db Is Nothing Then
MsgBox "l'objet db n'existe pas"
Else
MsgBox "l'objet db existe"
End If
'Set db = CurrentDb
'Set rs = db.Execute("UPDATE Items SET QteStock = QteStock - " & qte & " WHERE Items.N° = " & itm)
'db.Close

Merci de m'aider.
Commenter la réponse de Damboushow
ucfoutu 18035 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 17 février 2018 Dernière intervention - 2 janv. 2016 à 11:38
0
Utile
Je ne comprends pas ta manière de penser.
Un objet se déclare puis se définit, quel que soit l'objet !
Si l'on doit utiliser l'objet toto :
1) on le déclare
Dim toto as son_type
puis
2) on le définit
set toto = un_objet_du_type son_type
Commenter la réponse de ucfoutu
ucfoutu 18035 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 17 février 2018 Dernière intervention - Modifié par ucfoutu le 2/01/2016 à 13:24
0
Utile
On va y voir clair ...
Développes-tu directement en VBA/Access ou appelles-tu Access depuis une appli autre que Access ?

Je n'ai pas access sur ma machine, mais voilà comment et dans quel ordre je "vois" les choses (avec DAO, que tu dis avoir choisi) si ton appli est faite directement avec VBA/Access :
 Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim ta_requête As String
' Ouverture de la base de données
Set db = DBEngine.OpenDatabase ("chemin_de_ton_fichier.mdb") ' définis et ouvre la base
ta_requête = "........expression_de_ta_requête ......."
Set rs = db.OpenRecordset ( ta_requête, dbOpenForwardOnly, dbReadOnly) ' définition du jeu d'enregistrement par exécution de ta requête

A toi de fixer tes paramètres d'exécution comme TU l'entends(dbOpenForwardOnly ou autre, dbReadOnly ou autre, selon ce que tu veux faire)
Il est par ailleurs clair que tu dois avoir coché la référence Microsoft DAO #.# Object Library (où #.# est bien sûr à remplacer par ta version DAO)


________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
Damboushow 23 Messages postés vendredi 1 janvier 2016Date d'inscription 9 mai 2016 Dernière intervention - 2 janv. 2016 à 14:20
0
Utile
Dans un premier temps, c'est une application directement dans access avec les tables dans le même fichier.

Dans ta solution proposé ci haut, je l'avais déja testé dans cette séquence. J'ai remis le tout sous cette forme et oui DAO est sélectionné.

Voici le code actuel dont j'ai toujours le message d'objet inexistant.

Dim qte As Integer
qte = CInt(Me.Quantité.Value)
Dim itm As Integer
itm = CInt(Me.Items.Value)
Dim db As DAO.Database
Dim rs As DAO.Recordset
If db Is Nothing Then
MsgBox "l'objet db n'existe pas"
Else
MsgBox "l'objet db existe"
End If


De plus mon fichier est un accdb et non un mdb et il donne une erreur de type. Je ne veux pas séparer la base de donnée de l'interface. C'est une transition entre un fichier excel et un vrai service web dans quelques mois.

Merci!
Commenter la réponse de Damboushow
ucfoutu 18035 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 17 février 2018 Dernière intervention - 2 janv. 2016 à 17:43
0
Utile
accdb, donc ...
tu trouveras toutes les manières ici :
http://warin.developpez.com/tutoriels/access/specificites-dao-sous-microsoft-access-2007-et-ulterieurs/
je n'ai pas access et ne peux en tester aucune.
Commenter la réponse de ucfoutu
Damboushow 23 Messages postés vendredi 1 janvier 2016Date d'inscription 9 mai 2016 Dernière intervention - 2 janv. 2016 à 18:17
0
Utile
1
Merci, exactement la procédure que je cherche depuis hier, ton aide est grandement apprécié.
Damboushow 23 Messages postés vendredi 1 janvier 2016Date d'inscription 9 mai 2016 Dernière intervention - 3 janv. 2016 à 09:38
Si cela peut aider certain:

Private Sub SauvegarderDeclinaison_Click()
Dim qte As Integer
qte = CInt(Me.Quantité.Value)
Dim itm As Integer
itm = CInt(Me.Items.Value)
Dim db As DAO.Database
Dim strChemin As String
strChemin = "c:\Users\FICHIER.accdb"
Set db = Application.DBEngine.OpenDatabase(strChemin, False, False)
db.Execute ("UPDATE Items SET QteStock = QteStock - " & qte & " WHERE Items.N° = " & itm)
db.Close

End Sub
Commenter la réponse de Damboushow

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.