Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème requete d'insertion

2 réponses
Avatar
flyght
Bonjour,
Je débute en VBA, j'ai une base de données access qui comporte des produits qui rentrent et sortent d'un stock.
J'ai une table produit, une achat et une vente dans lequel j'ai un numero unique, une date, une quantité, la reference de mon produit ,l'id du fournisseur pour la table achat et l'id des client pour la table vente.
Ce que je souhaite faire c'est à partir d'un formulaire, je tape la date, la quantité et le fournisseur ou client, puis quand je clique sur mon bouton "valider" que j'ai créé, qu'il insert la date saisi dans la table correspondante, avec le bon produit (saisi dans un sous formulaire), le bon fournisseur ou client (avec son id) puis qu'il me calcul la quantité en stock.

Par exemple :
Dans mon formulaire je saisi la date, le nom du produit via une liste déroulante, le nom du fournisseur via un sous formulaire, puis la quantité que je souhaite acheter.
La date saisi sera stockée dans la table achat avec le fournisseur et produit corrects puis que ma quantité saisi s'ajoute à celle initiale du stock.
Si mon stock de départ été 5 et que j'ai tapé 2 dans la quantité de mon formulaire, je doit avoir d'apparaitre 7 dans ma table.
Un cas complexe et pas simple à expliquer.

Mon code est le suivant ( j'ai essayé avec des update ou des insert into, ma synthaxe ne doit pas etre bonne du tout):
Dim req As String
Dim req2 As String

'Requete req
req = "UPDATE ACHAT SET Quantite='" & Me.Quantite & "' WHERE PRODUIT.Reference='" & Me.Reference_achat "'"

'insertion de la quantite (Me.quantite etant le nom de ma zone de texte "quantite") dans la table achat par rapport à la bonne référence produit
'Execution de la requete req
CurrentDb.Execute req

'Requete req2
req2 = "UPDATE PRODUIT SET QuantiteEnStock=QuantiteEnStock+Me.Quantite WHERE Reference=Me.Reference_achat"

'mise à jour du stock de la table produit, la quantité saisi (Me.quantite) vien s'ajouter à la quantité initiale selon tel produit.
'Execution de la requete req2
CurrentDb.Execute req2


Je vous remercie d'avance pour votre aide

2 réponses

Avatar
Gloops
flyght a écrit, le 30/01/2011 16:00 :
Bonjour,
Je débute en VBA, j'ai une base de données access qui comporte des produits qui
rentrent et sortent d'un stock.
J'ai une table produit, une achat et une vente dans lequel j'ai un nume ro
unique, une date, une quantité, la reference de mon produit ,l'id du fournisseur
pour la table achat et l'id des client pour la table vente.
Ce que je souhaite faire c'est à partir d'un formulaire, je tape la d ate, la
quantité et le fournisseur ou client, puis quand je clique sur mon bo uton
"valider" que j'ai créé, qu'il insert la date saisi dans la table
correspondante, avec le bon produit (saisi dans un sous formulaire), le bon
fournisseur ou client (avec son id) puis qu'il me calcul la quantité en stock.

Par exemple :
Dans mon formulaire je saisi la date, le nom du produit via une liste
déroulante, le nom du fournisseur via un sous formulaire, puis la qua ntité que
je souhaite acheter.
La date saisi sera stockée dans la table achat avec le fournisseur et produit
corrects puis que ma quantité saisi s'ajoute à celle initiale du st ock.
Si mon stock de départ été 5 et que j'ai tapé 2 dans la quantit é de mon
formulaire, je doit avoir d'apparaitre 7 dans ma table.
Un cas complexe et pas simple à expliquer.

Mon code est le suivant ( j'ai essayé avec des update ou des insert i nto, ma
synthaxe ne doit pas etre bonne du tout):
Dim req As String
Dim req2 As String

'Requete req
req = "UPDATE ACHAT SET Quantite='"& Me.Quantite& "' WHERE
PRODUIT.Reference='"& Me.Reference_achat "'"

'insertion de la quantite (Me.quantite etant le nom de ma zone de texte
"quantite") dans la table achat par rapport à la bonne référence produit
'Execution de la requete req
CurrentDb.Execute req

'Requete req2
req2 = "UPDATE PRODUIT SET QuantiteEnStock=QuantiteEnStock+Me. Quantite
WHERE Reference=Me.Reference_achat"

'mise à jour du stock de la table produit, la quantité saisi (Me.qu antite) vien
s'ajouter à la quantité initiale selon tel produit.
'Execution de la requete req2
CurrentDb.Execute req2


Je vous remercie d'avance pour votre aide




Ah, oui, j'ai peut-être été un peu sec dans le fil plus récent .. .

Alors il va y avoir plusieurs points à assimiler.

La structure des tables ne paraît pas trop délirante, j'imagine que t u
as appliqué une méthode pour les mettre en place ? Il y a par exemple
Merise qui est pas mal, je cite le nom des fois que tu sois arrivé par
hasard sur une formule valable :)
C'est le premier point à traiter, pas forcément celui qui prend le pl us
de temps, mais celui sur lequel s'appuie tout le reste, donc il ne faut
pas le négliger. Il est important de bien assimiler les principes de la
méthode d'analyse, et de bien être capable de les transposer en
questions claires pour obtenir des informations fiables des utilisateurs
et leur faire valider le résultat le plus tôt possible.

Ensuite on peut allumer la machine, et là une fois la structure des
tables créée il va falloir savoir insérer un enregistrement dans un e
table, et le mettre à jour.

Tu trouveras de précieux points de repère dans le site de 3stone, qui
intervenait fréquemment ici récemment :
http://www.3stone.be/access/

Il y a quelques années c'était Raymond Sénèque qui assurait le pl us gros
des réponses, son site est là :
http://officesystemaccess.seneque.net/

Pour entrer dans le vif du sujet, on peut ajouter ou mettre à jour des
enregistrements dans une table par le biais de deux outils
essentiellement, au choix :
- un jeu d'enregistrements
- une requête SQL

Plus précisément, une requête SQL peut servir de support à un jeu
d'enregistrements, mais on peut aussi l'exécuter directement par
DoCmd.RunSQL strSQL

Dans ce dernier cas, Access va avertir l'utilisateur de l'action qu'il
s'apprête à accomplir et du nombre d'enregistrements concernés, et cela
table par table, et sans préciser le nom de la table. D'un point de vue
ergonomique, il est fréquent qu'on trouve mieux, donc on souhaitera
désactiver ce message, et on n'oubliera pas de le réactiver pour que par
défaut une requête ne s'exécute pas par surprise.

On exécutera donc la requête comme suit :

With DoCmd
.SetWarnings False
.RunSQL strSQL
.SetWarnings True
End With

Pour ce qui est du jeu d'enregistrements, si on préfère utiliser cet
outil, on va le déclarer en début de procédure
Dim Rs As Recordset

et un peu plus loin on va l'initialiser
Set Rs = CurrentDb().OpenRecordset(strSQL)

On va réaliser un certain nombre d'opérations, ajout, suppressions,
mises à jour, et puis à la fin il ne faudra pas oublier de fermer le jeu
d'enregistrements.

Rs.Close
Set Rs = Nothing

Je n'entrerai pas dans la distinction de plusieurs types de jeux
d'enregistrements, on n'aurait pas fini.

ça, c'est pour la structure d'appel.

Maintenant, voyons voir quoi faire avec.
Nous parlions d'ajouter des enregistrements, et d'en mettre à jour.

Ajouter, d'abord.

En SQL :

INSERT INTO nomtable(champ1, champ2, champ3)
VALUES(valeurchamp1, valeurchamp2, valeurchamp3)

Ah, d'ailleurs, j'ai découvert tout-à-l'heure sur le site de 3stone q ue
les parenthèses derrière VALUES sont facultatives. Bon, l'essentiel e st
de ne pas oublier, si on a ouvert une parenthèse, de la refermer, et
inversement.

Un autre point sur lequel il faut être attentif : le type de champ. Si
il est numérique, rien à ajouter. Si c'est une chaîne de caractèr es, il
faut mettre des guillemets autour, qu'on remplace souvent par des
apostrophes. Si le champ doit contenir ce caractère (l'apostrophe, pour
garder le dernier mentionné), il faut le doubler. Ainsi :

strSQL = strSQL + "'" + Replace(valeurChamp1, "'", "''")

Nous avons dans cette formule, deux fois, un guillemet suivi d'une
apostrophe puis d'un autre guillemet, et la troisième fois, c'est un
guillemet suivi de deux apostrophes successives, et un autre guillemet.

Si on se contente de
strSQL = strSQL + "'" + valeurChamp1 + "'"
ça va marcher tant que valeurChamp1 ne contient pas d'apostrophe, et
puis quand le cas va se présenter on va avoir une faute de syntaxe et i l
va falloir un petit moment pour comprendre ce qui se passe.

Bon, voilà donc pour SQL, pour ce qui est d'ajouter un enregistrement.

La même chose avec un jeu d'enregistrements, maintenant.

L'ouverture a été un peu plus lourde, en revanche la commande tient e n
peu de lignes (je prends l'exemple d'un jeu d'enregistrements qui
comporte deux champs, Quantite de type entier, et ReferenceAchat de type
chaîne de caractères) :

Rs.AddNew
Rs!Quantite = intQuantite
Rs!ReferenceAchat = strReferenceAchat
If MsgBox("Bon alors là c'est bon ?", vbYesNo) = vbYes Then
Rs.Update 'là c'est fait
Else
Rs.RollBack 'et du coup on n'a rien changé
End If

Nous avons vu comment ajouter un enregistrement, par requête SQL, par
jeu d'enregistrement.

Maintenant, la mise à jour.

Par requête SQL.

UPDATE nomtable SET champ1=valeurChamp1, champ2=valeurChamp2, ...

et ainsi de suite pour tous les champs (à la place du point de suspensi on).

La même précision que ci-dessus est valable en fonction des types de
champs (il n'a pas été question de date, ça tombe bien je suis dé jà
assez long ...).

Maintenant par jeux d'enregistrements, en fait la syntaxe est la même
que pour l'ajout, si ce n'est qu'on remplace Rs.AddNew par Rs.Edit. Tout
de même un point supplémentaire : avant de modifier un enregistrement ,
il convient de le sélectionner. Selon les cas on utilisera la commande
Rs.Seek (uniquement pour un jeu d'enregistrements portant sur une table)
ou Rs.FindFirst, suivi l'un comme l'autre de Rs.NoMatch pour savoir si
la sélection a réussi. Regarder dans l'aide pour plus de précision.

Ne reste plus qu'à ajouter une procédure d'erreur, mais là je vais
peut-être glisser (dans l'aide : On Error Goto).

Il reste les différents contrôles du formulaire, zone de texte,
étiquette, zone de liste simple, zone de liste déroulante ...
Je n'ai pas étudié en détail les sites que j'ai mentionnés, mais
j'imagine qu'ils doivent expliquer ça bien. Sinon, on y revient.

Pour chacun il faudra être attentif à trois points :
- comment indiquer quelles données il doit afficher
- comment indiquer quelle valeur il retourne
- comment lui faire exécuter des procédures et quand elles s'exécut ent


Bon, ben on va déjà laisser mijoter la nuit :)
Avatar
flyght
Gloops a écrit le 06/02/2011 à 21h53 :
flyght a écrit, le 30/01/2011 16:00 :
Bonjour,
Je débute en VBA, j'ai une base de données access qui comporte
des produits qui
rentrent et sortent d'un stock.
J'ai une table produit, une achat et une vente dans lequel j'ai un nume ro
unique, une date, une quantité, la reference de mon produit ,l'id du
fournisseur
pour la table achat et l'id des client pour la table vente.
Ce que je souhaite faire c'est à partir d'un formulaire, je tape la d
ate, la
quantité et le fournisseur ou client, puis quand je clique sur mon bo
uton
"valider" que j'ai créé, qu'il insert la date saisi
dans la table
correspondante, avec le bon produit (saisi dans un sous formulaire), le bon
fournisseur ou client (avec son id) puis qu'il me calcul la quantité
en stock.

Par exemple :
Dans mon formulaire je saisi la date, le nom du produit via une liste
déroulante, le nom du fournisseur via un sous formulaire, puis la qua
ntité que
je souhaite acheter.
La date saisi sera stockée dans la table achat avec le fournisseur et
produit
corrects puis que ma quantité saisi s'ajoute à celle initiale du
st ock.
Si mon stock de départ été 5 et que j'ai tapé 2
dans la quantit é de mon
formulaire, je doit avoir d'apparaitre 7 dans ma table.
Un cas complexe et pas simple à expliquer.

Mon code est le suivant ( j'ai essayé avec des update ou des insert i
nto, ma
synthaxe ne doit pas etre bonne du tout):
Dim req As String
Dim req2 As String

'Requete req
req = "UPDATE ACHAT SET Quantite='"& Me.Quantite& "'
WHERE
PRODUIT.Reference='"& Me.Reference_achat "'"

'insertion de la quantite (Me.quantite etant le nom de ma zone de texte
"quantite") dans la table achat par rapport à la bonne
référence produit
'Execution de la requete req
CurrentDb.Execute req

'Requete req2
req2 = "UPDATE PRODUIT SET QuantiteEnStock=QuantiteEnStock+Me. Quantite
WHERE Reference=Me.Reference_achat"

'mise à jour du stock de la table produit, la quantité saisi
(Me.qu antite) vien
s'ajouter à la quantité initiale selon tel produit.
'Execution de la requete req2
CurrentDb.Execute req2


Je vous remercie d'avance pour votre aide





Ah, oui, j'ai peut-être été un peu sec dans le fil plus
récent .. .

Alors il va y avoir plusieurs points à assimiler.

La structure des tables ne paraît pas trop délirante, j'imagine
que t u
as appliqué une méthode pour les mettre en place ? Il y a par
exemple
Merise qui est pas mal, je cite le nom des fois que tu sois arrivé par
hasard sur une formule valable :)
C'est le premier point à traiter, pas forcément celui qui prend
le pl us
de temps, mais celui sur lequel s'appuie tout le reste, donc il ne faut
pas le négliger. Il est important de bien assimiler les principes de la
méthode d'analyse, et de bien être capable de les transposer en
questions claires pour obtenir des informations fiables des utilisateurs
et leur faire valider le résultat le plus tôt possible.

Ensuite on peut allumer la machine, et là une fois la structure des
tables créée il va falloir savoir insérer un
enregistrement dans un e
table, et le mettre à jour.

Tu trouveras de précieux points de repère dans le site de 3stone,
qui
intervenait fréquemment ici récemment :
http://www.3stone.be/access/

Il y a quelques années c'était Raymond Sénèque qui
assurait le pl us gros
des réponses, son site est là :
http://officesystemaccess.seneque.net/

Pour entrer dans le vif du sujet, on peut ajouter ou mettre à jour des
enregistrements dans une table par le biais de deux outils
essentiellement, au choix :
- un jeu d'enregistrements
- une requête SQL

Plus précisément, une requête SQL peut servir de support
à un jeu
d'enregistrements, mais on peut aussi l'exécuter directement par
DoCmd.RunSQL strSQL

Dans ce dernier cas, Access va avertir l'utilisateur de l'action qu'il
s'apprête à accomplir et du nombre d'enregistrements
concernés, et cela
table par table, et sans préciser le nom de la table. D'un point de vue
ergonomique, il est fréquent qu'on trouve mieux, donc on souhaitera
désactiver ce message, et on n'oubliera pas de le réactiver pour
que par
défaut une requête ne s'exécute pas par surprise.

On exécutera donc la requête comme suit :

With DoCmd
.SetWarnings False
.RunSQL strSQL
.SetWarnings True
End With

Pour ce qui est du jeu d'enregistrements, si on préfère utiliser
cet
outil, on va le déclarer en début de procédure
Dim Rs As Recordset

et un peu plus loin on va l'initialiser
Set Rs = CurrentDb().OpenRecordset(strSQL)

On va réaliser un certain nombre d'opérations, ajout,
suppressions,
mises à jour, et puis à la fin il ne faudra pas oublier de fermer
le jeu
d'enregistrements.

Rs.Close
Set Rs = Nothing

Je n'entrerai pas dans la distinction de plusieurs types de jeux
d'enregistrements, on n'aurait pas fini.

ça, c'est pour la structure d'appel.

Maintenant, voyons voir quoi faire avec.
Nous parlions d'ajouter des enregistrements, et d'en mettre à jour.

Ajouter, d'abord.

En SQL :

INSERT INTO nomtable(champ1, champ2, champ3)
VALUES(valeurchamp1, valeurchamp2, valeurchamp3)

Ah, d'ailleurs, j'ai découvert tout-à-l'heure sur le site de
3stone q ue
les parenthèses derrière VALUES sont facultatives. Bon,
l'essentiel e st
de ne pas oublier, si on a ouvert une parenthèse, de la refermer, et
inversement.

Un autre point sur lequel il faut être attentif : le type de champ. Si
il est numérique, rien à ajouter. Si c'est une chaîne de
caractèr es, il
faut mettre des guillemets autour, qu'on remplace souvent par des
apostrophes. Si le champ doit contenir ce caractère (l'apostrophe, pour
garder le dernier mentionné), il faut le doubler. Ainsi :

strSQL = strSQL + "'" + Replace(valeurChamp1, "'",
"''")

Nous avons dans cette formule, deux fois, un guillemet suivi d'une
apostrophe puis d'un autre guillemet, et la troisième fois, c'est un
guillemet suivi de deux apostrophes successives, et un autre guillemet.

Si on se contente de
strSQL = strSQL + "'" + valeurChamp1 + "'"
ça va marcher tant que valeurChamp1 ne contient pas d'apostrophe, et
puis quand le cas va se présenter on va avoir une faute de syntaxe et i
l
va falloir un petit moment pour comprendre ce qui se passe.

Bon, voilà donc pour SQL, pour ce qui est d'ajouter un enregistrement.

La même chose avec un jeu d'enregistrements, maintenant.

L'ouverture a été un peu plus lourde, en revanche la commande
tient e n
peu de lignes (je prends l'exemple d'un jeu d'enregistrements qui
comporte deux champs, Quantite de type entier, et ReferenceAchat de type
chaîne de caractères) :

Rs.AddNew
Rs!Quantite = intQuantite
Rs!ReferenceAchat = strReferenceAchat
If MsgBox("Bon alors là c'est bon ?", vbYesNo) = vbYes Then
Rs.Update 'là c'est fait
Else
Rs.RollBack 'et du coup on n'a rien changé
End If

Nous avons vu comment ajouter un enregistrement, par requête SQL, par
jeu d'enregistrement.

Maintenant, la mise à jour.

Par requête SQL.

UPDATE nomtable SET champ1=valeurChamp1, champ2=valeurChamp2, ...

et ainsi de suite pour tous les champs (à la place du point de suspensi
on).

La même précision que ci-dessus est valable en fonction des types
de
champs (il n'a pas été question de date, ça tombe bien je
suis dé jà
assez long ...).

Maintenant par jeux d'enregistrements, en fait la syntaxe est la même
que pour l'ajout, si ce n'est qu'on remplace Rs.AddNew par Rs.Edit. Tout
de même un point supplémentaire : avant de modifier un
enregistrement ,
il convient de le sélectionner. Selon les cas on utilisera la commande
Rs.Seek (uniquement pour un jeu d'enregistrements portant sur une table)
ou Rs.FindFirst, suivi l'un comme l'autre de Rs.NoMatch pour savoir si
la sélection a réussi. Regarder dans l'aide pour plus de
précision.

Ne reste plus qu'à ajouter une procédure d'erreur, mais là
je vais
peut-être glisser (dans l'aide : On Error Goto).

Il reste les différents contrôles du formulaire, zone de texte,
étiquette, zone de liste simple, zone de liste déroulante ...
Je n'ai pas étudié en détail les sites que j'ai
mentionnés, mais
j'imagine qu'ils doivent expliquer ça bien. Sinon, on y revient.

Pour chacun il faudra être attentif à trois points :
- comment indiquer quelles données il doit afficher
- comment indiquer quelle valeur il retourne
- comment lui faire exécuter des procédures et quand elles
s'exécut ent


Bon, ben on va déjà laisser mijoter la nuit :)


Bonjour,
Avant toutes choses merci pour votre réponse, certes complexe mais merci
En effet j'ai bien appliqué la methode Merise que j'ai appris en cours avec tout ce qui est MCD et MLD.
Mon soucis est le manques de maitrise du langage VBA et des synthaxes. Alors je vais essayer tout ce que tu m'a indiqué. J'ai déjà etudié les jeux d'enregistrements et requete SQL en revanche mes requetes ne fonctionnées pas surement car je n'avais pas mis quelques chose pour l'executer ^^'' . Je vais réessayer tout cela.

Je vous remercie