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

utiliser le résultat d'une requête de recherche dans un calcul en VBA

8 réponses
Avatar
oualaléreur
Comment faire pour utiliser un champ r=E9sultat d'une requ=EAte de
recherche dans un calcul en VBA ?
Pour l'instant j'utilise ceci, mais ca ne fonctionne pas :

Dim Utilisable As Variant
Dim Rec As DAO.Recordset
Set Rec =3D db.OpenRecordset("Nom_requete")
Utilisable =3D Rec![Champ_selectionn=E9]

Ce code tourne sur chaque ligne d'une table et il renvoie la bonne
valeur la premi=E8re fois, mais apr=E8s c'est soit la m=EAme, soit 0. J'ai
beau rouvrir et fermer Rec pour chaque it=E9ration :

Rec.Close
Set Rec =3D Nothing
Utilisable =3D Null

Je ne r=E9cup=E8re pas la bonne valeur.
Faut-il passer par une table interm=E9diaire ?=20


=E0 +=20


Benoit

8 réponses

Avatar
Gilbert
Bonjour,

Il faut faire une boucle sur tous les enregistrements de ton recordset
Do While not Rec.EOF
Utilisable = Rec![Champ_selectionné]
.
.
Rec.MoveNext
Loop

Gilbert

"oualaléreur" a écrit dans le message de
news:
Comment faire pour utiliser un champ résultat d'une requête de
recherche dans un calcul en VBA ?
Pour l'instant j'utilise ceci, mais ca ne fonctionne pas :

Dim Utilisable As Variant
Dim Rec As DAO.Recordset
Set Rec = db.OpenRecordset("Nom_requete")
Utilisable = Rec![Champ_selectionné]

Ce code tourne sur chaque ligne d'une table et il renvoie la bonne
valeur la première fois, mais après c'est soit la même, soit 0. J'ai
beau rouvrir et fermer Rec pour chaque itération :

Rec.Close
Set Rec = Nothing
Utilisable = Null

Je ne récupère pas la bonne valeur.
Faut-il passer par une table intermédiaire ?


à +


Benoit
Avatar
oualaléreur
Oui oui, c'est bien ce que je fais
Avatar
Gilbert
Alors c'est que ta requete ne renvoie qu'un enregistrement.
Quel est ton code exactement?

Gilbert

"oualaléreur" a écrit dans le message de
news:
Oui oui, c'est bien ce que je fais



Avatar
oualaléreur
Merci de te pencher sur le problème. Normalement, ma requête ne
renvoie qu'un enregistrement en effet, mais elle est sensée être
lancée à chaque fois qu'on passe dans la boucle. Ce qui effectivement
n'a pas l'air d'être le cas. Voici une partie du code :

Dim Utilisable As Variant
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("Table", DB_OPEN_DYNASET)

rs.MoveFirst

Do Until rs.EOF
Dim Rec As DAO.Recordset
Set Rec = db.OpenRecordset("Requête_Recherche")
Utiliseable = Rec![Nom_Champ_Retourné]

' Calculs

rs.Edit
rs![Champ_mis_à_Jour] = Résultat_calcul_Utiliseant_Utiliseable
rs.Update


Utiliseable= Null
Rec.Close
Set Rec= Nothing

rs.MoveNext
Loop

rs.Close
Set rs = Nothing

Voici le code SQL de la Requête de recherche :

SELECT Tbl_HV_Price.PricePP
FROM Tbl_HV_Price, Table
WHERE (((Tbl_HV_Price.Volume)0000) AND
((Tbl_HV_Price.ArticleNumber)=[Table].[ArticlNumber]));

"Table", c'est la même que dans le module, et en écrivant, je me
rends compte qu'il y a de fortes chances que le problème vienne du
"Articl(e)Number", le champ qui fait le lien entre les deux tables. En
effet, j'ai peur que celui-ci n'évolue pas d'une itération à
l'autre, or [Table].[ArticlNumber] est sensé suivre le même
avancement dans la table que le recordset.
Il faudrait soit envoyer un paramètre à la requête ( c'est possible,
ca ?), soit pouvoir effectuer la même recherche en VBA dans le module,
ce que je ne sais pas faire.


Benoit
Avatar
Gilbert
Si j'ai bien compris, ta requete de recherche utilise la valeur de
l'enregistrement de 'Table'.
Dans ce cas utilise :

Set Rec = Db.OpenRecordset("SELECT Tbl_HV_Price.PricePP FROM
Tbl_HV_Price, Table WHERE (((Tbl_HV_Price.Volume)0000) AND
((Tbl_HV_Price.ArticleNumber)=" & rs![ArticlNumber] & "));")
Je suppose que ArticlNumber est numérique, si c'est une chaine de
caractères, il faut rajouter des '
((Tbl_HV_Price.ArticleNumber)='" & rs![ArticlNumber] & "');")


Gilbert


"oualaléreur" a écrit dans le message de
news:
Merci de te pencher sur le problème. Normalement, ma requête ne
renvoie qu'un enregistrement en effet, mais elle est sensée être
lancée à chaque fois qu'on passe dans la boucle. Ce qui effectivement
n'a pas l'air d'être le cas. Voici une partie du code :

Dim Utilisable As Variant
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("Table", DB_OPEN_DYNASET)

rs.MoveFirst

Do Until rs.EOF
Dim Rec As DAO.Recordset
Set Rec = db.OpenRecordset("Requête_Recherche")
Utiliseable = Rec![Nom_Champ_Retourné]

' Calculs

rs.Edit
rs![Champ_mis_à_Jour] = Résultat_calcul_Utiliseant_Utiliseable
rs.Update


Utiliseable= Null
Rec.Close
Set Rec= Nothing

rs.MoveNext
Loop

rs.Close
Set rs = Nothing

Voici le code SQL de la Requête de recherche :

SELECT Tbl_HV_Price.PricePP
FROM Tbl_HV_Price, Table
WHERE (((Tbl_HV_Price.Volume)0000) AND
((Tbl_HV_Price.ArticleNumber)=[Table].[ArticlNumber]));

"Table", c'est la même que dans le module, et en écrivant, je me
rends compte qu'il y a de fortes chances que le problème vienne du
"Articl(e)Number", le champ qui fait le lien entre les deux tables. En
effet, j'ai peur que celui-ci n'évolue pas d'une itération à
l'autre, or [Table].[ArticlNumber] est sensé suivre le même
avancement dans la table que le recordset.
Il faudrait soit envoyer un paramètre à la requête ( c'est possible,
ca ?), soit pouvoir effectuer la même recherche en VBA dans le module,
ce que je ne sais pas faire.


Benoit
Avatar
oualaléreur
Bonjour Gilbert, et merci bien,

J'ai encore un problème, quand je veux utiliser le résultat de la
requête : soit j'utilise la variable Utilisable, comme ceci :
Utiliseable = Rec![PricePP ] et j'obtient un " no current record",
soit comme ceci : Utiliseable = Rec et j'obtient "automation error"
mais au niveau de la première utilisation de Utilisable dans le calcul
cette fois.
J'ai essayé Rec.MoveFirst pour palier au "no current record" sans
succès, et si j'utilise directement rec dans le calcul, j'obtient
"datatype mismatch".

Bref, j'arrive pas à utiliser ce que retourne la requête que tu m'as
envoyée.

à +

Benoit
Avatar
Gilbert
Bonsoir,

Ta variable est déclarée comme
Dim Utilisable As Variant
est ensuite tu as un 'e' en plus
Utiliseable = Rec![PricePP ]
Est-ce une faute de frappe?

Sinon il est possible que ta requete n'envoie rien dans ton recordset Rec.
Tu devrais tester en utilisant le débogueur.
Mets des points d'arrêt dans ton code et teste la valeur de Rec.RecordCount
et des différents champs.
Ca devrait te permettre de trouver la source de ton problème.

Gilbert


"oualaléreur" a écrit dans le message de
news:
Bonjour Gilbert, et merci bien,

J'ai encore un problème, quand je veux utiliser le résultat de la
requête : soit j'utilise la variable Utilisable, comme ceci :
Utiliseable = Rec![PricePP ] et j'obtient un " no current record",
soit comme ceci : Utiliseable = Rec et j'obtient "automation error"
mais au niveau de la première utilisation de Utilisable dans le calcul
cette fois.
J'ai essayé Rec.MoveFirst pour palier au "no current record" sans
succès, et si j'utilise directement rec dans le calcul, j'obtient
"datatype mismatch".

Bref, j'arrive pas à utiliser ce que retourne la requête que tu m'as
envoyée.

à +

Benoit
Avatar
oualaléreur
Merci Gilbert,
le 'e' n'est qu'une faute de frappe, ma variable a en fait un autre nom
trop tordu pour le rendre publique :)
Selon les conseils de garfich, j'ai effectivement utilisé
Rec.RecordCount, ce qui fonctionne parfaitement.
Voici le code à titre indicatif :

Dim Var As Variant
Dim rec As DAO.Recordset

Set rec = db.OpenRecordset("SELECT Tbl_HV_Price.PricePP FROM
Tbl_HV_Price, Tbl_AdHock WHERE (((Tbl_HV_Price.Volume)0000) AND
((Tbl_HV_Price.ArticleNumber)=" & rs![ArticlNumber] & "));",
DB_OPEN_DYNASET)

If (rec.RecordCount <> 0) Then
Var = rec![PricePP]
End If

Avec ceci, on initialise la variable Var par l'intermédiaire d'un
recordset, qui applique un filtre sur une table. dans mon cas, il ne
peut y avoir qu'une valeur retournée. Sinon, méfiance...

Merci et à +

Benoit