OVH Cloud OVH Cloud

SQL et VBA : problème de paramètres

4 réponses
Avatar
Eric Brue
Bonjour
Je suis toujours empêtré dans mon pb de paramètres SQL en VBA.
J'ai rempli un recordset avec succès à partir de cette requête mais je dois
maintenant ouvrir un formulaire qui a pour source cette requête construite
en VBA. Le problème il me demande encore les paramètres et je ne comprends
pas comment les indiquer dans mon code...?
Merci pour votre aide...
Le code: que dois je ajouter à la dernière ligne docmd.openform...?

Dim Rqdf As QueryDef
Set Rqdf = bds.CreateQueryDef("produits_req_vba")
Rqdf.SQL = _
"SELECT stock.num_stock, produits.nom_produit, stock.numero_lot,
stock.numero_serie " & _
"FROM produits INNER JOIN stock ON produits.num_produit = stock.num_produit
" & _
"WHERE ([numero_lot] = '" & VarLot & "' AND [numero_serie] = '" & VarSerie &
"') " & _
"OR ([numero_serie] = '" & VarSerie & "' AND VarLot Is Null) " & _
"OR ([numero_lot] = '" & VarLot & "' AND VarSerie Is Null) " & _
"OR (VarLot Is Null AND VarSerie Is Null);"
'définition des deux paramètres SQL
Rqdf.Parameters("VarLot") = VarLot
Rqdf.Parameters("VarSerie") = VarSerie

Set rst = Rqdf.OpenRecordset()
Do Until rst.EOF
rst.MoveNext
Loop

Dim NbProduit As Long
NbProduit = rst.RecordCount
DoCmd.OpenForm "nom_produit_2"

--

Eric BRÜE
http://e.brue.free.fr

4 réponses

Avatar
Eric
Bonsoir

Je ne comprends pas ce que tu veux obtenir avec ta requête.

Tu veux les no de stocks pour lesquels
N° Serie= VarSerie Et N° Lot = VarLot
ou
N° Serie= VarSerie
ou
N° Lot = VarLot

C'est ca ?


Eric


"Eric Brue" écrivait
news::

Bonjour
Je suis toujours empêtré dans mon pb de paramètres SQL en VBA.
J'ai rempli un recordset avec succès à partir de cette requête mais je
dois maintenant ouvrir un formulaire qui a pour source cette requête
construite en VBA. Le problème il me demande encore les paramètres et
je ne comprends pas comment les indiquer dans mon code...?
Merci pour votre aide...
Le code: que dois je ajouter à la dernière ligne docmd.openform...?

Dim Rqdf As QueryDef
Set Rqdf = bds.CreateQueryDef("produits_req_vba")
Rqdf.SQL = _
"SELECT stock.num_stock, produits.nom_produit, stock.numero_lot,
stock.numero_serie " & _
"FROM produits INNER JOIN stock ON produits.num_produit > stock.num_produit " & _
"WHERE ([numero_lot] = '" & VarLot & "' AND [numero_serie] = '" &
VarSerie & "') " & _
"OR ([numero_serie] = '" & VarSerie & "' AND VarLot Is Null) " & _
"OR ([numero_lot] = '" & VarLot & "' AND VarSerie Is Null) " & _
"OR (VarLot Is Null AND VarSerie Is Null);"
'définition des deux paramètres SQL
Rqdf.Parameters("VarLot") = VarLot
Rqdf.Parameters("VarSerie") = VarSerie

Set rst = Rqdf.OpenRecordset()
Do Until rst.EOF
rst.MoveNext
Loop

Dim NbProduit As Long
NbProduit = rst.RecordCount
DoCmd.OpenForm "nom_produit_2"



Avatar
Eric Brue
Tu veux les no de stocks pour lesquels
N° Serie= VarSerie Et N° Lot = VarLot
ou
N° Serie= VarSerie
ou
N° Lot = VarLot
C'est ca ?


C'est: no stock pour
N° Serie= VarSerie Et N° Lot = VarLot
ou
N° Serie= VarSerie (si VarLot est Nul)
ou
N° Lot = VarLot (si VarSerie Est Nul)

Mais peu importe car la requête fonctionne bien après ton aide sur les
paramètres. Je l'utilise pour compter les enregistrements du recordset et
c'est parfait. Mais maintenant je veux aussi ouvrir un formulaire qui me
propose le résultat de cette requête. Donc je mets docmd.openform "mon form"
à la suite du rst.count et là il me redemande les paramètres mais je ne sais
pas comment les indiquer pour l'ouverture du formulaire...
Merci

Avatar
Eric
Re,

Une solution parmi d'autres serait de demander les valeurs du n° de serie
et du n° de lot à l'ouverture d'un formulaire indépendant(pas de source)
qui n'aurait qu'un controle nommé NbProduit(label ou zone de texte, en
principe un label pour l'affichage). Ce formulaire est appelé par la
méthode de ton choix (un bouton par exemple).

En partie déclarative du module du formulaire, tu declares tes variables:
Dim Varlot, VarSerie ' je ne les ai pas typées

et sur l'évènement Ouverture du formulaire tu mets:

Private Sub Form_Open(Cancel As Integer)
Varlot = InputBox("N° de lot")
Varserie = InputBox("N° de serie")
If Varlot = "" Then Varlot = Null '-- Pas utile, ca passe si non
rempli
If Varserie = "" Then Varserie = Null '-- Pas utile, ca passe si non
rempli
Dim Rqdf As DAO.QueryDef, bds As DAO.Database
Set bds = CurrentDb
Set Rqdf = bds.CreateQueryDef("produits_req_vba")
sql = _
"SELECT stock.num_stock, produits.nom_produit, stock.numero_lot,
stock.numero_serie " & _
"FROM produits INNER JOIN stock ON produits.num_produit =
stock.num_produit " & _
"WHERE ([numero_lot] = '" & Varlot & "' AND [numero_serie] = '" &
Varserie & "') " & _
"OR ([numero_serie] = '" & Varserie & "' AND Varlot Is Null) " & _
"OR ([numero_lot] = '" & Varlot & "' AND Varserie Is Null) " & _
"OR ( Varlot Is Null AND Varserie Is Null);"
'définition des deux paramètres SQL
Rqdf.sql = sql
Rqdf.Parameters("VarLot") = Varlot
Rqdf.Parameters("VarSerie") = Varserie

Set rst = Rqdf.OpenRecordset()
rst.MoveLast '-- plus rapide
'Do Until rst.EOF
' rst.MoveNext
'Loop

'Dim NbProduit As Long -- Inutile
'NbProduit = rst.RecordCount -- Inutile
Me.NbProduit.Caption = rst.RecordCount ' si label
'Me.NbProduit = rst.RecordCount ' si zone de texte
bds.QueryDefs.Delete "produits_req_vba" ' nécessaire

End Sub

Dans tous les cas, tu ne saisiras qu'une seule fois les valeurs de
VarSerie et de Varlot.

Rem : Si tu annules(Bouton Annuler) lors des inputbox, ca te renverra
quand même quelque chose, la derniere condition de ton where.(les 2
variables sont Null même si tu ne mets pas les 2 If du début.

A+
Eric


"Eric Brue" écrivait
news:OgLo$:

Tu veux les no de stocks pour lesquels
N° Serie= VarSerie Et N° Lot = VarLot
ou
N° Serie= VarSerie
ou
N° Lot = VarLot
C'est ca ?


C'est: no stock pour
N° Serie= VarSerie Et N° Lot = VarLot
ou
N° Serie= VarSerie (si VarLot est Nul)
ou
N° Lot = VarLot (si VarSerie Est Nul)

Mais peu importe car la requête fonctionne bien après ton aide sur les
paramètres. Je l'utilise pour compter les enregistrements du recordset
et c'est parfait. Mais maintenant je veux aussi ouvrir un formulaire
qui me propose le résultat de cette requête. Donc je mets
docmd.openform "mon form" à la suite du rst.count et là il me
redemande les paramètres mais je ne sais pas comment les indiquer pour
l'ouverture du formulaire... Merci





Avatar
Eric Brue
Merci je vais étudier cette piste. L'intérêt de cette requête paramétrée VBA
était d'ouvrir toujours le même formulaire d'affichage du résultat de
plusieurs requête basées sur des champs différents proposées par plusieurs
formulaires différents. Ceci afin d'alléger l'application. Mais il semble
effectivement que l'on ne puisse pas tout faire à partir de VBA en ce qui
concerne le SQL.
Merci de ton aide
Eric