Recordset, Pour mise à jour d'un champ, Probleme

Signaler
Messages postés
35
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
9 avril 2008
-
Messages postés
35
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
9 avril 2008
-
Bonjour, je travails sous  ACCESS 2003

J'essais de mettre à jour le champ [MAJ Quantite] de la table "Taille Stock" avec du vb code
mais rien ne se produit, ni le resultat escompté, ni  erreur signalée par access.

Ci-dessous  les deux tables Vente  et  " Taille stock"  ainsi que le code vb

A signaler que le code est placer dans le formulaire Vente  sur  " apres mise à jour"  event

<caption>Vente</caption>----
SaleID |Date |Reference |Taille |Quantite |----
1, 02/03/2008, Ref1, 3940, 1, ----
2, 02/03/2008, Ref2, 2, 2, ----
3, 02/03/2008, Ref2, 4, 1, ----
4, 03/03/2008, Ref1, 3940, 2, ----
5, 03/03/2008, Ref3, 40, 1, ----
6, 03/03/2008, Ref2, 3, 1, ----
7, 03/03/2008, Ref2, 3, 1, ----
8, 04/03/2008, Ref2, 2, 1, ----
9, 15/03/2008, Ref3, 44, 2, ----
10, 15/03/2008, Ref1, 4142, 3, ----
11, 15/03/2008, Ref3, 44, 1, ----
12, 18/03/2008, Ref2, 4, 2, ----
13, 18/03/2008, Ref1, 4344, 1, ----
14, 18/03/2008, Ref2, 2, 1, <tfoot></tfoot>

<caption>Taille Stock</caption>----
ID |Reference |Taille |Quantite |MAJ Quantite |----
1, Ref1, 3738, 5, 5, ----
2, Ref1, 3940, 8, 8, ----
3, Ref1, 4142, 10, 10, ----
4, Ref1, 4344, 8, 8, ----
5, Ref2, 2, 10, 10, ----
6, Ref2, 3, 6, 6, ----
7, Ref2, 4, 12, 12, ----
8, Ref2, 5, 9, 9, ----
9, Ref3, 40, 10, 10, ----
10, Ref3, 42, 8, 8, ----
11, Ref3, 44, 6, 6, ----
12, Ref3, 46, 8, 8, <tfoot></tfoot>

Le code:

------------------------------------------------------------------------------

Private Sub Form_AfterUpdate()

        ' If an error occurs, jump down to the DataAccessError section.
        
On Error GoTo DataAccessError

          ' Create a SELECT command.
 Dim Query As String

 Query = "SELECT Reference, Taille, Quantite FROM Vente"

          ' Get a recordset using this command.

 Dim RS As DAO.Recordset

 Set RS = CurrentDb.OpenRecordset(Query)

  ' Move through the recordset, looking at each record.
  ' Each record is a separate item in the order.
       
 Do Until Recordset.EOF

              ' For each item, get the product ID and quantity details.
            

 

Dim vReference As String

Dim vTaille    As String

Dim vQuantite  As Long

        
 vReference = Recordset("Reference")
          
 vTaille = Recordset("Taille")
           
 vQuantite = Recordset("Quantite")
           

              ' Using this information, create an UPDATE command that
              ' changes the Size and stock levels.
           
Dim UpdateCommand  As String
     UpdateCommand UpdateCommand "UPDATE Taille_Stock SET [MAJ Quantite] = Quantite -" & vQuantite & " WHERE Reference =" & vReference And "Taille =" & vTaille

              ' Run the command.
       
 CurrentDb.Execute UpdateCommand

              ' Move to the next order item (if there is one).
         
 Recordset.MoveNext

      
 Loop

           ' Time to clean up.
      
 Recordset.Close
      
Exit_Block:

    
  Exit Sub

DataAccessError:

           ' You only get here if an error occured.
           ' Show the error.
        MsgBox Err.Description
        Resume Exit_Block

    End Sub
-------------------------------------------------------------------------

Quelqu'un pourrais me dire ou se trouve le problem SVP?

Merci à toute les bonnes volontés

Health & Peace

12 réponses

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
107
Salut,

Si tu travaille sous Access (et donc en VBA), pourquoi tu poste dans le forum VB2005 qui n'a absolument rien à voir ???

Je déplace vers le forum approprié !
______________________________________
DarK Sidious
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
12
Salut,

Est-ce normal cela :
UpdateCommand <gras>UpdateCommand</gras> "UPDATE.......... ?

A+
Exploreur

 Linux a un noyau, Windows un pépin
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Bonjour,
aucune idée sur le problème mais une suggestion.
Si tu comptes utiliser un recordset, autant en utiliser deux.


L' un vers TaillesStock, tu récupère la reference et la taille.
(vRefernce, vTaille)
L' autre vers Selection de vente where Reference=vRefernce et Taille=vTaille order by Date.


Et dans une boucle tu parcours Rs1 , et dans une autre Rs2,
et tu met à jour TailleStock.MAJQte à chaque itération

ps: n' oublies pas ma réponse dans l' ancien topic.
                        
<hr />
... Y'en a même qui disent qu'ils l'ont vu voler.
/PRE>
Messages postés
2
Date d'inscription
mardi 10 mars 2009
Statut
Membre
Dernière intervention
30 mars 2008

sbeihassen

les mot en gras sont les codes correctes

Private Sub Form_AfterUpdate()

        ' If an error occurs, jump down to the DataAccessError section.
        
On Error GoTo DataAccessError

          ' Create a SELECT command.
 Dim Query As String

 Query = "SELECT Reference, Taille, Quantite FROM Vente ici il vous monque la codition WHERE "

          ' Get a recordset using this command.

 Dim RS As DAO.Recordset

 Set RS = CurrentDb.OpenRecordset(Query)

  ' Move through the recordset, looking at each record.
  ' Each record is a separate item in the order.
       
 Do Until Recordset.EOF

              ' For each item, get the product ID and quantity details.
            

 

Dim vReference As String

Dim vTaille    As String

Dim vQuantite  As Long

        
 vReference = Recordset .fields ("Reference")
          
 vTaille = Recordset.fields("Taille")
           
 vQuantite = Recordset .fields ("Quantite")
           

              ' Using this information, create an UPDATE command that
              ' changes the Size and stock levels.
           
Dim UpdateCommand  As String
     UpdateCommand  "UPDATE Taille_Stock SET [MAJ<gras>_Quantite]</gras> Quantite -" & vQuantite & " WHERE Reference =" & vReference And "Taille =" & vTaille

              ' Run the command.
       
 CurrentDb.Execute UpdateCommand

              ' Move to the next order item (if there is one).
         
 Recordset.MoveNext

      
 Loop

           ' Time to clean up.
      
 Recordset.Close
      
Exit_Block:

    
  Exit Sub

DataAccessError:

           ' You only get here if an error occured.
           ' Show the error.
        MsgBox Err.Description
        Resume Exit_Block

    End Sub
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
12
Re,

Rajoutons pour être plus clair :

Recordset.fields("Reference").Value

A+
Exploreur

 Linux a un noyau, Windows un pépin
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
SELECT Reference, Taille, Quantite FROM Vente ici il vous monque la codition WHERE...
te renvoie plusieurs lignes.
TaillesStock quantité va être mise à jour par quelle quantité de vente  avec ta requete  "Update TailleStock.... ???
vReference=Reference And vQuantité=Quantite ne suffisentt pas.

<hr />
... Y'en a même qui disent qu'ils l'ont vu voler.
/PRE>
Messages postés
35
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
9 avril 2008

Salut,

Merci pour vos reponses,

Malheureusement,  j'ai fais les modifications suggérées de votre part mais toujours pareil, càd, ni erreur, ni changement sur [Taille Stock]![MAJ Quantite]
voici le code, en rouge les modifications:
---------------------------------------------------------------------------------------------------
Private Sub Form_AfterUpdate()

        ' If an error occurs, jump down to the DataAccessError section.
        
On Error GoTo DataAccessError

          ' Create a SELECT command.
 Dim Query As String
 Query "SELECT Reference, Taille, Quantite FROM Vente WHERE Reference" & Me.Reference & "and Taille =" & Me.Taille

          ' Get a recordset using this command.

 Dim RS As DAO.Recordset

 Set RS = CurrentDb.OpenRecordset(Query)

  ' Move through the recordset, looking at each record.
  ' Each record is a separate item in the order.
       
 Do Until Recordset.EOF

              ' For each item, get the product ID and quantity details.
            

Dim vReference As String

Dim vTaille    As String

Dim vQuantite  As Long

        
 vReference = Recordset.Fields("Reference").Value
          
 vTaille = Recordset.Fields("Taille").Value
           
 vQuantite = Recordset.Fields("Quantite").Value
 
           

              ' Using this information, create an UPDATE command that
              ' changes the Size and stock levels.
           
Dim UpdateCommand  As String
     ' de moi meme j'ai aussi changé Taille_Stock en [Taille Stock]UpdateCommand "UPDATE [Taille Stock] SET [MAJ Quantite] Quantite -" & vQuantite & " WHERE Reference =" & vReference And "Taille =" & vTaille

              ' Run the command.
       
 CurrentDb.Execute UpdateCommand

              ' Move to the next order item (if there is one).
         
 Recordset.MoveNext

      
 Loop

           ' Time to clean up.
      
 Recordset.Close
      
Exit_Block:

    
  Exit Sub

DataAccessError:

           ' You only get here if an error occured.
           ' Show the error.
        MsgBox Err.Description
        Resume Exit_Block

End Sub
---------------------------------------------------------------------------------------------------

Libre_Max: j'ai pas compris comment utiliser deux recordset pour mon cas.
Aussi, la requete mise à jour ...
UpdateCommand "UPDATE Taille_Stock SET [MAJ Quantite] Quantite -"
& vQuantite & " WHERE Reference =" & vReference And "Taille
=" & vTaille

Est sensée mettre à jour [Taille Stock]![MAJ Quantite] en  deduisant le recordset vQuantite de [Taille Stock]![Quantite] et ce, seulement quand les deux conditions sont reunies càd
WHERE Reference =" & vReference And "Taille
=" & vTaille

Exple:  Voir les tables du projets  plus haut...

Quand : Vente.Reference Ref1  et  Vente.Taille 3940  ( c'est la taille d'une chemise, juste pour info)
on voit que  Quantite = 1
et à ce stade dans le code  ces données sont sensées etre regroupées ainsi :
vReference = Ref1
vTaille = 3940
vQuantite = 1
Alors Apres que le rcordset a parcouru cet enregistrement 

Mise à jour requise de ACCESS  ( s'il veut bien)

Je demande à access de mettre à jour [MAJ Quantite]  comme suit:

[Taille Stock]![MAJ Quantite] = [Taille Stock]![Quantite] - vQuantite
numeriquement:                       =          8                            -     1

Voilà j'espere que ca vous aidera  afin que vous me aidiez  à resoudre cette enigme que j'ai posté meme
dans des forums anglais en vain.

Merci à toutes les bonnes volontées.   

Health & Peace
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Bonsoir,


"SELECT Reference, Taille, Quantite FROM Vente WHERE Reference =" & Me.Reference & "and Taille =" & Me.Taille


te renvoies
1 02/03/2008 Ref1 3940 1
4 03/03/2008 Ref1 3940 2


si vReference=Ref1 et vTaille=3940


Quand tu lui dis de mettre à jour TaillesStock en ajoutant Quantité,
il ne sait pas si c' est celle de la première ligne ou la deuxième.
(imagines ensuite si tu as plusieurs ventes de la même  Ref et la même taille.)


Et donc tu dois trier le résultat de ta requete sur l' ordre de vente TdVente.Puis parcourir cette requete et lire lire par ligne et mettre à jour TailleStock avec la quantité de la ligne courante.
C' est ça le RS2 dont je parlais.
Au lieu donc de ta requete mise à jour tu fais un Edit puis update
à chaque itération de la boucle RS2 imbriquée.


ps: tu te souviens de SommeDeQte ?
Eh bien la requete regroupement te renvoie une ligne par ref et taille.


Mais question:
Pourquoi tu ne mets pas à jour TailleStock.Quantité au moment de la vente ?
Quand tu es sur un BL, tu n' as qu' une ligne par Ref et Taille.


                        
<hr />
... Y'en a même qui disent qu'ils l'ont vu voler.
/PRE>
Messages postés
35
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
9 avril 2008

Bonsoir,

Justement comme tu me l'as preconisé en dernier,  c'est comme ca que j'ai  procedé, car sur mon formulaire
j'ai  Reference,  Taille,  Quantite  et autres données et  donc les enregistrements sont traités un par un  or  la procedure n'est appelées à s'executer qu'apres validation de chaque operation, et qu'apres avoir seulement appuyé sur le bouton suivant  lequel marque  l'evenement " Mis à Jour"  et moi j'appel la procedure sur l'evenement " Apres mise à jour" Donc sur Apres mise à jour  j'ai qu'une seule ligne d'enregistrement or je precise à  ACCESS  de selectionner : Query "SELECT Reference, Taille, Quantite FROM Vente WHERE Reference " & Me.Reference & "and Taille = " & Me.Taille
et en utilisant les donnés de cette selection  de mettre à jour la table taille_Stock  : UpdateCommand "UPDATE [Taille Stock] SET [MAJ Quantite] Quantite -" & vQuantite & " WHERE Reference =" & vReference And "Taille =" & vTaille

Et comme tu peux bien le voir la condition where est la meme pour la Requete selection et Requete mise à jour, et comme je l'ai mentionné plus haut, sur le formulaire les données sont Affichées et traitées ligne par ligne, et enregistrement par enregistrement.

Pour la requete Tdvente que
tu me preconise de créer j'ai bien compris  comment faire, mais pour
l'utiliser dans un 2em RS j'ai du mal à voir surtout que je comprends
pas ...à chaque itération de la boucle RS2 imbriquée, et puis entre nous,  un RS  ca passe pas alors deux!


Merci mon ami

PS:  c'est par erreur si j'ai pas posté mon probleme sur le bon forum, mais comme la discussion est déjà entammée et que c'est souvent notre ami  Libre_Max qui repond alors je prefere rester enocre sur se forum, si ca vous derange pas biensur.

Health & Peace
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Bonsoir,



j'ai qu'une seule ligne d'enregistrement or je precise à  ACCESS  de selectionner : Query "SELECT Reference, Taille, Quantite FROM VenteWHERE Reference" & Me.Reference & "and Taille =" & Me.Taille




NON !



Pour preuve:
Si dans Vente tu as


1 02/03/2008 Ref1 3940 1
2 02/03/2008 Ref2 2 2
3 02/03/2008 Ref2 4 1
4 03/03/2008 Ref1 3940 2
5 03/03/2008 Ref3 40 1
6 03/03/2008 Ref2 3 1
7 03/03/2008 Ref2 3 1
8 04/03/2008 Ref2 2 1
9 15/03/2008 Ref3 44 2
10 15/03/2008 Ref1 4142 3
11 15/03/2008 Ref3 44 1
12 18/03/2008 Ref2 4 2
13 18/03/2008 Ref1 4344 1
14 18/03/2008 Ref2 2 1



Et que Me.Reference =Ref2 et Me.Taille=2


 Query "SELECT Reference, Taille, Quantite FROM Vente WHERE Reference" & Me.Reference & "and Taille =" & Me.Taille


te renvoie:
2 02/03/2008 Ref2 2 2
8 04/03/2008 Ref2 2 1
14 18/03/2008 Ref2 2 1


Tu dois donc parcourir cet ensemble d' enregistrements.


Ah si tu m' avais écouté et modifier la structure de vente
en remplaçant Reference et Taille par ID, tu n' en serais pas là.Ni dans le premier post ni dans celui-ci.
ça t' évitera au moins la double jointure.

Car en définitif, à quoi servirait un Identifiant (clé primaire) d' un article s' il n' est pas utilisé comme clé secondaire dans ta table vente ?

PS:
en relisant ton premier post, j' ai relevé ceci:


Dim RS As DAO.Recordset


 Set RS = CurrentDb.OpenRecordset(Query)


  ' Move through the recordset, looking at each record.
  ' Each record is a separate item in the order.
       
 Do Until Recordset.EOF


c' est plitôt:
Do While Not RS.Eof




                         
<hr />
... Y'en a même qui disent qu'ils l'ont vu voler.
/PRE>
Messages postés
35
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
9 avril 2008

Bonjour,

Dabord, je m'excuse pour le retard, problemes de system...


J'ai déjà essayé de m'en servir du champ venteID de la table vente et du ID de la table


Taille_Stock, mais voilà!, la table Taille_Stock est elle meme une table de JONCTION,


et puis   j'ai pensé  qu'effectivement à quoi ca sert d'avoir une clé primaire dans la table vente
si elle n'est pas utile, mais le problem dans mon code, et dans la requete selection de la table vente est commme ceci:Query "SELECT Reference, Taille, Quantite FROM Vente WHERE VenteID à quoi  ????


l'ideal c de remplacer la reference et taille au meme temp par un ID unique mais les deux se trouvent dans deux tables differentes.

Il y a aussi un souci de rapidité d'execution des ventes, je m'explique, si j'avais inseré le ID de la table Taille_Stock dans la table Vente Apres avoir relié les deux tables,  sur le formulaire
vente le champ ID  en question ne serais pas inseré automatiquement à chaque nouvel enregistrement, or il faudrait le choisir dans une liste deroulante à chaque vente, d'ou une lenteure consequente.

Et puis franchement une proposition de configuration de votre part à meme d'ameliorer mon application serait la bienvenue

Enfin, j'ai essayé de changer Do until Recordset.EOF par  Do While Not RS.Eof

et puis pour mise à jour voici le code :
---------------------------------------------------------
Option Compare Database
Option Explicit
------------------------------------------------------------------------------------

Private Sub Form_AfterUpdate()


' If an error occurs, jump down to the DataAccessError section.
On Error GoTo DataAccessError
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim UpdateCommand As String
Dim Query As String
Dim vReference As String
Dim vTaille As String
Dim vQuantite As Long
' Create a SELECT command.
Query = "SELECT Reference, Taille, Quantite FROM Vente Where Reference=" & Me.Ref_General & "and taille=" & Me.Taille


' Get a recordset using this command.
Set DB = CurrentDb()
Set RS = DB.OpenRecordset(Query)
' Move through the recordset, looking at each record.
' Each record is a separate item in the order.
'Do Until RS.EOF
Do While Not RS.EOF


' For each item, get the product Reference, Size and quantity details.
vReference = RS("Reference")
vTaille = RS("Taille")
vQuantite = RS("Quantite")
' Using this information, create an UPDATE command that
' changes the Quantity of product size level.UpdateCommand "UPDATE [Taille Stock] SET [MAJ Quantite] Quantite -" & _
vQuantite & " WHERE Reference =" & vReference & " And Taille =" & vTaille


' Run the command.
DB.Execute UpdateCommand
' Move to the next order item (if there is one).
RS.MoveNext
Loop
' Time to clean up.
RS.Close
Set RS = Nothing
Set DB = Nothing
Exit_Block:
Exit Sub
DataAccessError:
' You only get here if an error occured.' Show the error.
MsgBox Err.Description
Resume Exit_Block


End Sub

----------------------------------------------------------------------------

Merci à toutes les bonnes volontés et  plus spécialement à toi Libre_Max

Health & Peace
Messages postés
35
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
9 avril 2008

Bonjour,

Des suggestions, propositions, SVP?

Merci.

Health & Peace