mettre à jour dans une table deux champs calculés en VBA
4 réponses
oualaléreur
Bonjour tout le monde,
Le code qui suit est sens=E9 mettre =E0 jour dans la table "Tbl_AdHock"
les champs "VolumeToOrder" et "Price/Part". Il parcourt la table
"Tbl_AdHock" et pour chaque enregistrement, utilise des donn=E9es
pr=E9sentes dans la table pour calculer PPP et NO, puis leurs valeurs
sont attribu=E9es =E0 "VolumeToOrder" et "Price/Part". Ces champs sont
respectivement du type Number et Currency.
"VolumeToOrder" est attribu=E9 correctement pour chaque enregistrement,
mais "Price/Part" prend soit la valeur calcul=E9e pour le premier
enregistrement, soit 0,00$.
J'esp=E8re que c'est juste un probl=E8me au niveau de l'update, mais je
me m=E9fie des recordsets ouverts =E0 chaque it=E9ration. (C'est pas tr=E8s
=E9l=E9gant, mais j'ai pas trouv=E9 mieux.) Ils servent =E0 r=E9cup=E9rer le
r=E9sultat d'une requ=EAte de recherche et ne renvoient qu'un seul champ.
( J'en colle une =E0 la fin =E0 tout hazard, elles sont toutes trois du
m=EAme type). La valeur de ce champ est attribu=E9 =E0 un variant, qui
sert dans le calcul de PPP, mais pas de NO...Suspect.
Voila, merci =E0 ceux qui auront le courage de se pencher sur le
probl=E8me.
=E0+
Benoit
Le code (dans une fonction publique d'un module ):
Dim PP100K As Variant 'Preis Per Part for 100K parts
Dim PP500K As Variant 'Preis Per Part for 100K parts
Dim PP1M As Variant 'Preis Per Part for 100K parts
Dim NPR As Variant 'Number of Parts requiered
Dim P100K As Variant 'Preis for 100K parts
Dim P500K As Variant 'Preis for 500K parts
Dim P1M As Variant 'Preis for 1M parts
Dim NormalP As Variant 'Preis if NPR parts are ordered
Dim PPP As Currency 'optimal Preis Per Part
Dim NO As Long 'Number of parts Ordered
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset
Set db =3D CurrentDb
Set rs =3D db.OpenRecordset("Tbl_AdHock", DB_OPEN_DYNASET)
Set rs2 =3D db.OpenRecordset("Tbl_HV_Price", DB_OPEN_DYNASET)
rs.MoveFirst
MainLoop:
NPR =3D NumBoard * rs![Quantity]
'assign the different prices/part in Tbl_HV_Price
Dim PPP100K As DAO.Recordset
Set PPP100K =3D db.OpenRecordset("PPP100")
PP100K =3D PPP100K![PricePP]
Dim PPP500K As DAO.Recordset
Set PPP500K =3D db.OpenRecordset("PPP500")
PP500K =3D PPP500K![PricePP]
Dim PPP1M As DAO.Recordset
Set PPP1M =3D db.OpenRecordset("PPP1000")
PP1M =3D PPP1M![PricePP]
' Ici se fait le calcul de PPP et NO
rs.Edit
rs![VolumeToOrder] =3D NO
rs![Price/Part] =3D PPP
rs.Update
PPP100K.Close
Set PPP100K =3D Nothing
PPP500K.Close
Set PPP500K =3D Nothing
PPP1M.Close
Set PPP1M =3D Nothing
PP100K =3D Null
PP500K =3D Null
PP1M =3D Null
rs.MoveNext
If rs.EOF =3D True Then
rs.Close
rs2.Close
Set rs =3D Nothing
Set rs2 =3D Nothing
db.Close
Set db =3D Nothing
Exit Function
Else
GoTo MainLoop
End If
La requ=EAte : "PPP100"
SELECT Tbl_HV_Price.PricePP
FROM Tbl_HV_Price, Tbl_AdHock
WHERE (Tbl_HV_Price.Volume=3D100000 AND
Tbl_HV_Price.ArticleNumber=3DTbl_AdHock.ArticlNumber);
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pierre CFI [mvp]
bonjour ouh là là si tu utilisais une boucle déjà do until rs.EOF .... ...... rs.movenext loop
-- Pierre CFI MVP Microsoft Access
Site pour bien commencer Access http://www.mpfa.info
"oualaléreur" a écrit dans le message de news: Bonjour tout le monde,
Le code qui suit est sensé mettre à jour dans la table "Tbl_AdHock" les champs "VolumeToOrder" et "Price/Part". Il parcourt la table "Tbl_AdHock" et pour chaque enregistrement, utilise des données présentes dans la table pour calculer PPP et NO, puis leurs valeurs sont attribuées à "VolumeToOrder" et "Price/Part". Ces champs sont respectivement du type Number et Currency. "VolumeToOrder" est attribué correctement pour chaque enregistrement, mais "Price/Part" prend soit la valeur calculée pour le premier enregistrement, soit 0,00$.
J'espère que c'est juste un problème au niveau de l'update, mais je me méfie des recordsets ouverts à chaque itération. (C'est pas très élégant, mais j'ai pas trouvé mieux.) Ils servent à récupérer le résultat d'une requête de recherche et ne renvoient qu'un seul champ. ( J'en colle une à la fin à tout hazard, elles sont toutes trois du même type). La valeur de ce champ est attribué à un variant, qui sert dans le calcul de PPP, mais pas de NO...Suspect.
Voila, merci à ceux qui auront le courage de se pencher sur le problème.
à+
Benoit
Le code (dans une fonction publique d'un module ):
Dim PP100K As Variant 'Preis Per Part for 100K parts Dim PP500K As Variant 'Preis Per Part for 100K parts Dim PP1M As Variant 'Preis Per Part for 100K parts
Dim NPR As Variant 'Number of Parts requiered Dim P100K As Variant 'Preis for 100K parts Dim P500K As Variant 'Preis for 500K parts Dim P1M As Variant 'Preis for 1M parts Dim NormalP As Variant 'Preis if NPR parts are ordered
Dim PPP As Currency 'optimal Preis Per Part Dim NO As Long 'Number of parts Ordered
Dim db As DAO.Database Dim rs As DAO.Recordset Dim rs2 As DAO.Recordset
Set db = CurrentDb Set rs = db.OpenRecordset("Tbl_AdHock", DB_OPEN_DYNASET) Set rs2 = db.OpenRecordset("Tbl_HV_Price", DB_OPEN_DYNASET)
rs.MoveFirst
MainLoop:
NPR = NumBoard * rs![Quantity]
'assign the different prices/part in Tbl_HV_Price Dim PPP100K As DAO.Recordset Set PPP100K = db.OpenRecordset("PPP100") PP100K = PPP100K![PricePP] Dim PPP500K As DAO.Recordset Set PPP500K = db.OpenRecordset("PPP500") PP500K = PPP500K![PricePP] Dim PPP1M As DAO.Recordset Set PPP1M = db.OpenRecordset("PPP1000") PP1M = PPP1M![PricePP]
' Ici se fait le calcul de PPP et NO
rs.Edit rs![VolumeToOrder] = NO rs![Price/Part] = PPP rs.Update
PPP100K.Close Set PPP100K = Nothing PPP500K.Close Set PPP500K = Nothing PPP1M.Close Set PPP1M = Nothing
PP100K = Null PP500K = Null PP1M = Null
rs.MoveNext
If rs.EOF = True Then rs.Close rs2.Close Set rs = Nothing Set rs2 = Nothing db.Close Set db = Nothing Exit Function
Else GoTo MainLoop End If
La requête : "PPP100"
SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Tbl_AdHock WHERE (Tbl_HV_Price.Volume0000 AND Tbl_HV_Price.ArticleNumber=Tbl_AdHock.ArticlNumber);
bonjour
ouh là là
si tu utilisais une boucle déjà
do until rs.EOF
....
......
rs.movenext
loop
--
Pierre CFI
MVP Microsoft Access
Site pour bien commencer
Access http://www.mpfa.info
"oualaléreur" <benoit.vrignon@cpe.fr> a écrit dans le message de news: 1138807659.993846.111890@g14g2000cwa.googlegroups.com...
Bonjour tout le monde,
Le code qui suit est sensé mettre à jour dans la table "Tbl_AdHock"
les champs "VolumeToOrder" et "Price/Part". Il parcourt la table
"Tbl_AdHock" et pour chaque enregistrement, utilise des données
présentes dans la table pour calculer PPP et NO, puis leurs valeurs
sont attribuées à "VolumeToOrder" et "Price/Part". Ces champs sont
respectivement du type Number et Currency.
"VolumeToOrder" est attribué correctement pour chaque enregistrement,
mais "Price/Part" prend soit la valeur calculée pour le premier
enregistrement, soit 0,00$.
J'espère que c'est juste un problème au niveau de l'update, mais je
me méfie des recordsets ouverts à chaque itération. (C'est pas très
élégant, mais j'ai pas trouvé mieux.) Ils servent à récupérer le
résultat d'une requête de recherche et ne renvoient qu'un seul champ.
( J'en colle une à la fin à tout hazard, elles sont toutes trois du
même type). La valeur de ce champ est attribué à un variant, qui
sert dans le calcul de PPP, mais pas de NO...Suspect.
Voila, merci à ceux qui auront le courage de se pencher sur le
problème.
à+
Benoit
Le code (dans une fonction publique d'un module ):
Dim PP100K As Variant 'Preis Per Part for 100K parts
Dim PP500K As Variant 'Preis Per Part for 100K parts
Dim PP1M As Variant 'Preis Per Part for 100K parts
Dim NPR As Variant 'Number of Parts requiered
Dim P100K As Variant 'Preis for 100K parts
Dim P500K As Variant 'Preis for 500K parts
Dim P1M As Variant 'Preis for 1M parts
Dim NormalP As Variant 'Preis if NPR parts are ordered
Dim PPP As Currency 'optimal Preis Per Part
Dim NO As Long 'Number of parts Ordered
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Tbl_AdHock", DB_OPEN_DYNASET)
Set rs2 = db.OpenRecordset("Tbl_HV_Price", DB_OPEN_DYNASET)
rs.MoveFirst
MainLoop:
NPR = NumBoard * rs![Quantity]
'assign the different prices/part in Tbl_HV_Price
Dim PPP100K As DAO.Recordset
Set PPP100K = db.OpenRecordset("PPP100")
PP100K = PPP100K![PricePP]
Dim PPP500K As DAO.Recordset
Set PPP500K = db.OpenRecordset("PPP500")
PP500K = PPP500K![PricePP]
Dim PPP1M As DAO.Recordset
Set PPP1M = db.OpenRecordset("PPP1000")
PP1M = PPP1M![PricePP]
' Ici se fait le calcul de PPP et NO
rs.Edit
rs![VolumeToOrder] = NO
rs![Price/Part] = PPP
rs.Update
PPP100K.Close
Set PPP100K = Nothing
PPP500K.Close
Set PPP500K = Nothing
PPP1M.Close
Set PPP1M = Nothing
PP100K = Null
PP500K = Null
PP1M = Null
rs.MoveNext
If rs.EOF = True Then
rs.Close
rs2.Close
Set rs = Nothing
Set rs2 = Nothing
db.Close
Set db = Nothing
Exit Function
Else
GoTo MainLoop
End If
La requête : "PPP100"
SELECT Tbl_HV_Price.PricePP
FROM Tbl_HV_Price, Tbl_AdHock
WHERE (Tbl_HV_Price.Volume0000 AND
Tbl_HV_Price.ArticleNumber=Tbl_AdHock.ArticlNumber);
bonjour ouh là là si tu utilisais une boucle déjà do until rs.EOF .... ...... rs.movenext loop
-- Pierre CFI MVP Microsoft Access
Site pour bien commencer Access http://www.mpfa.info
"oualaléreur" a écrit dans le message de news: Bonjour tout le monde,
Le code qui suit est sensé mettre à jour dans la table "Tbl_AdHock" les champs "VolumeToOrder" et "Price/Part". Il parcourt la table "Tbl_AdHock" et pour chaque enregistrement, utilise des données présentes dans la table pour calculer PPP et NO, puis leurs valeurs sont attribuées à "VolumeToOrder" et "Price/Part". Ces champs sont respectivement du type Number et Currency. "VolumeToOrder" est attribué correctement pour chaque enregistrement, mais "Price/Part" prend soit la valeur calculée pour le premier enregistrement, soit 0,00$.
J'espère que c'est juste un problème au niveau de l'update, mais je me méfie des recordsets ouverts à chaque itération. (C'est pas très élégant, mais j'ai pas trouvé mieux.) Ils servent à récupérer le résultat d'une requête de recherche et ne renvoient qu'un seul champ. ( J'en colle une à la fin à tout hazard, elles sont toutes trois du même type). La valeur de ce champ est attribué à un variant, qui sert dans le calcul de PPP, mais pas de NO...Suspect.
Voila, merci à ceux qui auront le courage de se pencher sur le problème.
à+
Benoit
Le code (dans une fonction publique d'un module ):
Dim PP100K As Variant 'Preis Per Part for 100K parts Dim PP500K As Variant 'Preis Per Part for 100K parts Dim PP1M As Variant 'Preis Per Part for 100K parts
Dim NPR As Variant 'Number of Parts requiered Dim P100K As Variant 'Preis for 100K parts Dim P500K As Variant 'Preis for 500K parts Dim P1M As Variant 'Preis for 1M parts Dim NormalP As Variant 'Preis if NPR parts are ordered
Dim PPP As Currency 'optimal Preis Per Part Dim NO As Long 'Number of parts Ordered
Dim db As DAO.Database Dim rs As DAO.Recordset Dim rs2 As DAO.Recordset
Set db = CurrentDb Set rs = db.OpenRecordset("Tbl_AdHock", DB_OPEN_DYNASET) Set rs2 = db.OpenRecordset("Tbl_HV_Price", DB_OPEN_DYNASET)
rs.MoveFirst
MainLoop:
NPR = NumBoard * rs![Quantity]
'assign the different prices/part in Tbl_HV_Price Dim PPP100K As DAO.Recordset Set PPP100K = db.OpenRecordset("PPP100") PP100K = PPP100K![PricePP] Dim PPP500K As DAO.Recordset Set PPP500K = db.OpenRecordset("PPP500") PP500K = PPP500K![PricePP] Dim PPP1M As DAO.Recordset Set PPP1M = db.OpenRecordset("PPP1000") PP1M = PPP1M![PricePP]
' Ici se fait le calcul de PPP et NO
rs.Edit rs![VolumeToOrder] = NO rs![Price/Part] = PPP rs.Update
PPP100K.Close Set PPP100K = Nothing PPP500K.Close Set PPP500K = Nothing PPP1M.Close Set PPP1M = Nothing
PP100K = Null PP500K = Null PP1M = Null
rs.MoveNext
If rs.EOF = True Then rs.Close rs2.Close Set rs = Nothing Set rs2 = Nothing db.Close Set db = Nothing Exit Function
Else GoTo MainLoop End If
La requête : "PPP100"
SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Tbl_AdHock WHERE (Tbl_HV_Price.Volume0000 AND Tbl_HV_Price.ArticleNumber=Tbl_AdHock.ArticlNumber);
oualaléreur
Salut Pierre,
Bon, je vois que je dois essayer d'être plus précis. je suis confus d'avoir collé autant de code, mais comme je ne sais pas du tout d'où le problème vient... Pour être plus précis donc : est-ce que ceci renvoie bien le contenu du champ sélectionné par la requête PPP100, et est-ce que PP100K prend bien la bonne valeur à chaque itération ? Dim PP100K As Variant Dim PPP100K As DAO.Recordset Set PPP100K = db.OpenRecordset("PPP100") PP100K = PPP100K![PricePP]
Le problème peut-il venir de ce bout de code ? rs.Edit rs![VolumeToOrder] = NO rs![Price/Part] = PPP rs.Update
Merci pour ton conseil, je l'ai suivi, j'obtient la même chose qu'avant, seulement je n'ai plus honte de montrer mon code à mes collègues :)
à+
Benoit
Salut Pierre,
Bon, je vois que je dois essayer d'être plus précis. je suis confus
d'avoir collé autant de code, mais comme je ne sais pas du tout d'où
le problème vient...
Pour être plus précis donc :
est-ce que ceci renvoie bien le contenu du champ sélectionné par la
requête PPP100, et est-ce que PP100K prend bien la bonne valeur à
chaque itération ?
Dim PP100K As Variant
Dim PPP100K As DAO.Recordset
Set PPP100K = db.OpenRecordset("PPP100")
PP100K = PPP100K![PricePP]
Le problème peut-il venir de ce bout de code ?
rs.Edit
rs![VolumeToOrder] = NO
rs![Price/Part] = PPP
rs.Update
Merci pour ton conseil, je l'ai suivi, j'obtient la même chose
qu'avant, seulement je n'ai plus honte de montrer mon code à mes
collègues :)
Bon, je vois que je dois essayer d'être plus précis. je suis confus d'avoir collé autant de code, mais comme je ne sais pas du tout d'où le problème vient... Pour être plus précis donc : est-ce que ceci renvoie bien le contenu du champ sélectionné par la requête PPP100, et est-ce que PP100K prend bien la bonne valeur à chaque itération ? Dim PP100K As Variant Dim PPP100K As DAO.Recordset Set PPP100K = db.OpenRecordset("PPP100") PP100K = PPP100K![PricePP]
Le problème peut-il venir de ce bout de code ? rs.Edit rs![VolumeToOrder] = NO rs![Price/Part] = PPP rs.Update
Merci pour ton conseil, je l'ai suivi, j'obtient la même chose qu'avant, seulement je n'ai plus honte de montrer mon code à mes collègues :)
à+
Benoit
oualaléreur
Je suis à peu près sûr maintenant que le problème vient des recordsets. La question revient donc à cela : Comment faire pour utiliser un champ résultat d'une requête de recherche dans un calcul ? Faut-il passer par une table intermédiaire ?
à +
Benoit
Je suis à peu près sûr maintenant que le problème vient des
recordsets. La question revient donc à cela : Comment faire pour
utiliser un champ résultat d'une requête de recherche dans un calcul
?
Faut-il passer par une table intermédiaire ?
Je suis à peu près sûr maintenant que le problème vient des recordsets. La question revient donc à cela : Comment faire pour utiliser un champ résultat d'une requête de recherche dans un calcul ? Faut-il passer par une table intermédiaire ?
à +
Benoit
oualaléreur
comme ca, ca marche :
Dim PPP1M As DAO.Recordset Set PPP1M = db.OpenRecordset("SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Tbl_AdHock WHERE (((Tbl_HV_Price.Volume)00000) AND ((Tbl_HV_Price.ArticleNumber)=" & rs![ArticlNumber] & "));", DB_OPEN_DYNASET) If (PPP1M.RecordCount <> 0) Then PP1M = PPP1M![PricePP] End If
comme ca, ca marche :
Dim PPP1M As DAO.Recordset
Set PPP1M = db.OpenRecordset("SELECT Tbl_HV_Price.PricePP FROM
Tbl_HV_Price, Tbl_AdHock WHERE (((Tbl_HV_Price.Volume)00000) AND
((Tbl_HV_Price.ArticleNumber)=" & rs![ArticlNumber] & "));",
DB_OPEN_DYNASET)
If (PPP1M.RecordCount <> 0) Then
PP1M = PPP1M![PricePP]
End If
Dim PPP1M As DAO.Recordset Set PPP1M = db.OpenRecordset("SELECT Tbl_HV_Price.PricePP FROM Tbl_HV_Price, Tbl_AdHock WHERE (((Tbl_HV_Price.Volume)00000) AND ((Tbl_HV_Price.ArticleNumber)=" & rs![ArticlNumber] & "));", DB_OPEN_DYNASET) If (PPP1M.RecordCount <> 0) Then PP1M = PPP1M![PricePP] End If