SQL en VBA: qu'est ce qui cloche dans cette formule?
7 réponses
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"
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
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"
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;"
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"
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"
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)
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);"
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)
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
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
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
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);"