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

SQL en VBA: qu'est ce qui cloche dans cette formule?

7 réponses
Avatar
Eric Brue
Bonjour, je n'arrive pas à faire fonctionner cette formule SQL dans mon code
VBA.
Je veux simplement deux critères dont on ne tienne pas compte s'ils sont
nuls. J'ai adapté la formule SQL d'une requête affichée en SQL avec les deux
critères cote à cote rédigés selon le classique
"critère1 OU Critère1 EST NULL"

VarSerie = Me!serie_produit
VarLot = Me!lot_produit

SQL = "SELECT [num_stock] FROM stock " & _
"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;"

Set rst = bds.OpenRecordset(SQL, dbOpenDynaset)

me donne trop peu de paramètres, 2 attendus...?

merci de votre aide
--

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

7 réponses

Avatar
Eric
Bonjour,

Indépendamment qu'il doit y avoir besoin de parenthèses dans la clause
where car tu combines des Or et des And sur 2 champs, il devrait y avoir
Where (Champ1 = var1 and champ2=var2) or (champ1=var1 and champ2 ...)

le probleme vient du fait que tu termines ta clause where avec :

Where VarSerie is null or Varlot is null and VarSerie ... qui sont des
variables et non des champs de ta table. Donc le moteur sql te signale
qu'il ne trouve pas ces champs dans la table et les considère comme des
paramètres.

"AND VarSerie Is Null " & _
"OR VarLot Is Null " & _
"AND VarSerie Is Null;"


donc 2 paramèttres : VarSerie et VarLot

A+
Eric



"Eric Brue" écrivait
news:#EETIW$:

Bonjour, je n'arrive pas à faire fonctionner cette formule SQL dans
mon code VBA.
Je veux simplement deux critères dont on ne tienne pas compte s'ils
sont nuls. J'ai adapté la formule SQL d'une requête affichée en SQL
avec les deux critères cote à cote rédigés selon le classique
"critère1 OU Critère1 EST NULL"

VarSerie = Me!serie_produit
VarLot = Me!lot_produit

SQL = "SELECT [num_stock] FROM stock " & _
"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;"

Set rst = bds.OpenRecordset(SQL, dbOpenDynaset)

me donne trop peu de paramètres, 2 attendus...?

merci de votre aide


Avatar
Eric Brue
Merci
J'ai corrigé les parenthèses, enfin, je crois... mais je n'arive pas à faire
passer ces deux critères dans le code. J'imagine que c'est juste après la
formule SQL. mais je ne comprends pas comment il faut faire. Voici le
code... si tu as la possibilité de me montrer... ce serait sympa++
Merci
Eric

Dim VarSerie As Variant, VarLot As Variant
VarSerie = Me!serie_produit
VarLot = Me!lot_produit

Dim bds As DAO.Database, rst As Recordset, SQL
Set bds = CurrentDb()

SQL = "SELECT [num_stock] FROM stock " & _
"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);"

Set rst = bds.OpenRecordset(SQL, dbOpenDynaset)
Avatar
Eric Brue
J'ai trouvé
Si ça peut servir un jour à quelqu'un, voilà comment passer 2 critères SQL
en VBA sauf si l'un ou l'autre est nul:
Eric

Dim VarSerie As Variant, VarLot As Variant
VarSerie = Me!serie_produit
VarLot = Me!lot_produit

Dim bds As DAO.Database, rst As Recordset

'supprimer une éventuelle requête du même nom
Set bds = CurrentDb()
Dim qdf As QueryDef
For Each qdf In bds.QueryDefs
If qdf.Name = "produits_req_vba" Then
bds.QueryDefs.Delete qdf.Name
End If
Next qdf

Dim Rqdf As QueryDef
Set Rqdf = bds.CreateQueryDef("produits_req_vba")
'requête pour compter les enregistrements correspondants aux 2critères
'mais ne prenant pas en compte celui qui est éventuellement nul
Rqdf.SQL = _
"SELECT [num_stock] FROM stock " & _
"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!VarLot = VarLot
Rqdf!VarSerie = VarSerie

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

'et on fait ce qu'on veut de ce recordset par exemple:
Dim NbProduit As Long
NbProduit = rst.RecordCount
MsgBox NbProduit

'et on supprime tout ça
rst.Close
Set rst = Nothing
Rqdf.Close
Set Rqdf = Nothing
bds.QueryDefs.Delete ("produits_req_vba")
Set bds = Nothing
Avatar
Eric
Re bonjour Eric

Voila la procédure :
Private Sub Commande4_Click()
Dim strSQL As String, rst As DAO.Recordset, msg As String
strSQL = "": msg = ""
strSQL = strSQL & "Select numstock from stock "
strSQL = strSQL & "where (numero_lot='" & VarLot
strSQL = strSQL & " ' and numero_serie='" & VarSerie & "') "
strSQL = strSQL & "or (numero_lot is null and numero_serie='"
strSQL = strSQL & VarSerie & "') "
strSQL = strSQL & "or (numero_lot='" & VarLot
strSQL = strSQL & "' and numero_serie is null) "
strSQL = strSQL & "or (numero_lot is null and numero_serie is
null);"

Set rs = CurrentDb.OpenRecordset(strSQL)
msg = msg & "Voici les lots correspondants aux critères" & vbCrLf
msg = msg & vbCrLf & "Numero_Lot : "
msg = msg & IIf(Not IsNull(VarLot), VarLot, "Non défini") & vbCrLf
msg = msg & "Numero_Serie : "
msg = msg & IIf(Not IsNull(VarSerie), VarSerie, "Non défini") &
vbCrLf & vbCrLf
While Not rs.EOF
msg = msg & vbTab & "Lot n° : " & rs!numstock & vbCrLf
rs.MoveNext
Wend
MsgBox msg, vbInformation, "Microsoft.Public.Fr.Access"
Set rs = Nothing
End Sub

A+
Eric

--
Ceci est une signature automatique de MesNews.
Site : http://mesnews.no-ip.com
Avatar
Xavier HUE
Bonjour,

Juste en passant, tu pourrais aller à l'essentiel. Plutôt
que de supprimer la requête pour la recréer, pourquoi ne
pas la modifier directement?

Dim VarSerie As Variant, VarLot As Variant
VarSerie = Me!serie_produit
VarLot = Me!lot_produit

Dim bds As DAO.Database, rst As Recordset

Dim qdf As QueryDef

Set bds = CurrentDb()

On Error Resume Next
Err.Clear

Set qdf = bds.QueryDefs("produits_req_vba")
If Err.Number <>0 Then
Set qdf = bds.CreateQueryDef("produits_req_vba")
End If

puis ton code pour définir la propiété SQL

qdf.SQL = ...
qdf.Parameters("VarLot")...
qdf.Parameters("VarSerie")...

Et pour simplifier encore plus.

qdf.SQL = "PARAMETERS VarLot Text ( 255 ), VarSerie Text (
255 );" & _
"SELECT ..." & _
"WHERE ([numero_lot] = [VarLot] AND [numero_serie] =
[VarSerie]) " & _ ...

Note: Pour définir des paramètres, en construction de
requête, choisir l'option Requête/Paramètres...

Cordialement.
Avatar
Eric Brue
Là je suis largué, mais je vais réfléchir:-)
merci
Eric
Avatar
Eric Brue
Merci
je suis un peu laché mais je vais m'y mettre...
merci de votre aide à tous les deux
Eric