OVH Cloud OVH Cloud

mettre à jour dans une table deux champs calculés en VBA

4 réponses
Avatar
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);

4 réponses

Avatar
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);
Avatar
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
Avatar
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
Avatar
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