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

SQL qui ne fonctionne pas en VBA

20 réponses
Avatar
pascal58
Bonjour,
En VBA je construit une chaine contenant du SQL. Le recordset ne
renvoie rien. Par contre si je colle la chaine dans l'=E9diteur de
requ=EAte dans Access, il retourne bien les 21 lignes attendues.

Quelqu'un a t'il une id=E9e ?

Grand merci !

Code VBA (les param=E8tres/crit=E8res sont des contr=F4les du formulaire)

Dim sSql As String
Dim Rst As New ADODB.Recordset
Dim CN As ADODB.Connection
Set CN =3D CurrentProject.Connection
Dim j1 As Integer, j2 As Integer
Dim I As Integer, L As Integer, C As Integer

j1 =3D (Val(TxtS1) - 1) * 7
j2 =3D Val(TxtS2) * 7

sSql =3D "SELECT DatePart('w',[quot_date],2,2) AS J,
Count(DatePart('w',[quot_date],2,2)) AS nJ,
Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ, Sum(Tbl_D_Hebdo.Heb_Qtite) AS
QS, Tbl_D_Implementations.Cnl_Id" _
& " FROM ((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=3DTbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=3DTbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=3DTbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=3DTbl_D_Quotidien.Imp_Id" _
& " WHERE (DatePart('ww',[Quot_Date],2,2)=3D[heb_sem])" _
& " AND (Tbl_D_Quotidien.Quot_Type<>3)" _
& " AND (Tbl_D_Quotidien.Quot_Date>=3D[imp_dep]+" & j1 & ")" _
& " AND (Tbl_D_Quotidien.Quot_Date<=3D[imp_dep]+" & j2 & ")" _
& " AND (Year([Quot_Date])>=3D" & Txt_An & ")" _
& " AND (Tbl_D_Actions.Act_Cnl_Dif Like '" & Lst_Diff & "')" _
& " AND (Tbl_D_Actions.Act_Saison Like '" & Lst_Sais & "')" _
& " GROUP BY Tbl_D_Canaux.Cnl_Desc, DatePart('w',[quot_date],2,2),
Tbl_D_Implementations.Cnl_Id" _
& " ORDER BY Tbl_D_Implementations.Cnl_Id, DatePart('w',
[quot_date],2,2);"

Rst.Open sSql, CN, adOpenStatic
...

le SQL :
SELECT DatePart('w',[quot_date],2,2) AS J, Count(DatePart('w',
[quot_date],2,2)) AS nJ, Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ,
Sum(Tbl_D_Hebdo.Heb_Qtite) AS QS, Tbl_D_Implementations.Cnl_Id FROM
((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=3DTbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=3DTbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=3DTbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=3DTbl_D_Quotidien.Imp_Id WHERE
(DatePart('ww',[Quot_Date],2,2)=3D[heb_sem]) AND
(Tbl_D_Quotidien.Quot_Type<>3) AND
(Tbl_D_Quotidien.Quot_Date>=3D[imp_dep]+14) AND
(Tbl_D_Quotidien.Quot_Date<=3D[imp_dep]+42) AND
(Year([Quot_Date])>=3D2008) AND (Tbl_D_Actions.Act_Cnl_Dif Like '*') AND
(Tbl_D_Actions.Act_Saison Like '*') GROUP BY Tbl_D_Canaux.Cnl_Desc,
DatePart('w',[quot_date],2,2), Tbl_D_Implementations.Cnl_Id ORDER BY
Tbl_D_Implementations.Cnl_Id, DatePart('w',[quot_date],2,2);

Le r=E9sultat dans Access
J nJ QJ QS Canal
1 151 23378 84388 1
2 161 23264 110992 1
3 158 22329 119655 1
4 145 17168 110176 1
5 151 14696 115829 1
6 147 7684 125032 1
7 150 3479 125911 1
1 150 5669 23599 2
2 160 5699 29873 2
3 159 5581 33114 2
4 146 4524 32698 2
5 151 3924 32912 2
6 147 2609 35287 2
7 150 2490 35403 2
1 151 14569 56784 3
2 161 18302 77840 3
3 158 15790 86973 3
4 145 13292 83518 3
5 151 10154 82428 3
6 147 3078 90267 3
7 150 2695 91042 3

10 réponses

1 2
Avatar
pascal58
En fait le phénomène se produit à partir du moment où j'ai un Like
'*' (ou Like "*")
Avatar
jero
Salut,
Je crois avoir eu ce pb.
Là où tu as des "Like"... (par ex. Tbl_D_Actions.Act_Cnl_Dif Like '*') :
Nz(Tbl_D_Actions.Act_Cnl_Dif,'') Like '*'...
Attention : Nz(...,''<= 2 guillemets simples pour un control "texte")
A+
"pascal58" a écrit dans le message de news:

Bonjour,
En VBA je construit une chaine contenant du SQL. Le recordset ne
renvoie rien. Par contre si je colle la chaine dans l'éditeur de
requête dans Access, il retourne bien les 21 lignes attendues.

Quelqu'un a t'il une idée ?

Grand merci !

Code VBA (les paramètres/critères sont des contrôles du formulaire)

Dim sSql As String
Dim Rst As New ADODB.Recordset
Dim CN As ADODB.Connection
Set CN = CurrentProject.Connection
Dim j1 As Integer, j2 As Integer
Dim I As Integer, L As Integer, C As Integer

j1 = (Val(TxtS1) - 1) * 7
j2 = Val(TxtS2) * 7

sSql = "SELECT DatePart('w',[quot_date],2,2) AS J,
Count(DatePart('w',[quot_date],2,2)) AS nJ,
Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ, Sum(Tbl_D_Hebdo.Heb_Qtite) AS
QS, Tbl_D_Implementations.Cnl_Id" _
& " FROM ((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id" _
& " WHERE (DatePart('ww',[Quot_Date],2,2)=[heb_sem])" _
& " AND (Tbl_D_Quotidien.Quot_Type<>3)" _
& " AND (Tbl_D_Quotidien.Quot_Date>=[imp_dep]+" & j1 & ")" _
& " AND (Tbl_D_Quotidien.Quot_Date<=[imp_dep]+" & j2 & ")" _
& " AND (Year([Quot_Date])>=" & Txt_An & ")" _
& " AND (Tbl_D_Actions.Act_Cnl_Dif Like '" & Lst_Diff & "')" _
& " AND (Tbl_D_Actions.Act_Saison Like '" & Lst_Sais & "')" _
& " GROUP BY Tbl_D_Canaux.Cnl_Desc, DatePart('w',[quot_date],2,2),
Tbl_D_Implementations.Cnl_Id" _
& " ORDER BY Tbl_D_Implementations.Cnl_Id, DatePart('w',
[quot_date],2,2);"

Rst.Open sSql, CN, adOpenStatic
...

le SQL :
SELECT DatePart('w',[quot_date],2,2) AS J, Count(DatePart('w',
[quot_date],2,2)) AS nJ, Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ,
Sum(Tbl_D_Hebdo.Heb_Qtite) AS QS, Tbl_D_Implementations.Cnl_Id FROM
((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id WHERE
(DatePart('ww',[Quot_Date],2,2)=[heb_sem]) AND
(Tbl_D_Quotidien.Quot_Type<>3) AND
(Tbl_D_Quotidien.Quot_Date>=[imp_dep]+14) AND
(Tbl_D_Quotidien.Quot_Date<=[imp_dep]+42) AND
(Year([Quot_Date])> 08) AND (Tbl_D_Actions.Act_Cnl_Dif Like '*') AND
(Tbl_D_Actions.Act_Saison Like '*') GROUP BY Tbl_D_Canaux.Cnl_Desc,
DatePart('w',[quot_date],2,2), Tbl_D_Implementations.Cnl_Id ORDER BY
Tbl_D_Implementations.Cnl_Id, DatePart('w',[quot_date],2,2);

Le résultat dans Access
J nJ QJ QS Canal
1 151 23378 84388 1
2 161 23264 110992 1
3 158 22329 119655 1
4 145 17168 110176 1
5 151 14696 115829 1
6 147 7684 125032 1
7 150 3479 125911 1
1 150 5669 23599 2
2 160 5699 29873 2
3 159 5581 33114 2
4 146 4524 32698 2
5 151 3924 32912 2
6 147 2609 35287 2
7 150 2490 35403 2
1 151 14569 56784 3
2 161 18302 77840 3
3 158 15790 86973 3
4 145 13292 83518 3
5 151 10154 82428 3
6 147 3078 90267 3
7 150 2695 91042 3
Avatar
Sylvain Lafontaine
La première chose à faire serait d'afficher le résultat sSQL dans une boîte
de dialogue ou dans la fenêtre de debuggage avec Debug.Print et de la
comparer ensuite avec l'autre.

--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Blogue/site web: http://paparazzi-codeur.sylvainlafontaine.com
Consultant indépendant et programmation à distance pour Access et
SQL-Server.


"pascal58" wrote in message
news:
Bonjour,
En VBA je construit une chaine contenant du SQL. Le recordset ne
renvoie rien. Par contre si je colle la chaine dans l'éditeur de
requête dans Access, il retourne bien les 21 lignes attendues.

Quelqu'un a t'il une idée ?

Grand merci !

Code VBA (les paramètres/critères sont des contrôles du formulaire)

Dim sSql As String
Dim Rst As New ADODB.Recordset
Dim CN As ADODB.Connection
Set CN = CurrentProject.Connection
Dim j1 As Integer, j2 As Integer
Dim I As Integer, L As Integer, C As Integer

j1 = (Val(TxtS1) - 1) * 7
j2 = Val(TxtS2) * 7

sSql = "SELECT DatePart('w',[quot_date],2,2) AS J,
Count(DatePart('w',[quot_date],2,2)) AS nJ,
Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ, Sum(Tbl_D_Hebdo.Heb_Qtite) AS
QS, Tbl_D_Implementations.Cnl_Id" _
& " FROM ((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id" _
& " WHERE (DatePart('ww',[Quot_Date],2,2)=[heb_sem])" _
& " AND (Tbl_D_Quotidien.Quot_Type<>3)" _
& " AND (Tbl_D_Quotidien.Quot_Date>=[imp_dep]+" & j1 & ")" _
& " AND (Tbl_D_Quotidien.Quot_Date<=[imp_dep]+" & j2 & ")" _
& " AND (Year([Quot_Date])>=" & Txt_An & ")" _
& " AND (Tbl_D_Actions.Act_Cnl_Dif Like '" & Lst_Diff & "')" _
& " AND (Tbl_D_Actions.Act_Saison Like '" & Lst_Sais & "')" _
& " GROUP BY Tbl_D_Canaux.Cnl_Desc, DatePart('w',[quot_date],2,2),
Tbl_D_Implementations.Cnl_Id" _
& " ORDER BY Tbl_D_Implementations.Cnl_Id, DatePart('w',
[quot_date],2,2);"

Rst.Open sSql, CN, adOpenStatic
...

le SQL :
SELECT DatePart('w',[quot_date],2,2) AS J, Count(DatePart('w',
[quot_date],2,2)) AS nJ, Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ,
Sum(Tbl_D_Hebdo.Heb_Qtite) AS QS, Tbl_D_Implementations.Cnl_Id FROM
((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id WHERE
(DatePart('ww',[Quot_Date],2,2)=[heb_sem]) AND
(Tbl_D_Quotidien.Quot_Type<>3) AND
(Tbl_D_Quotidien.Quot_Date>=[imp_dep]+14) AND
(Tbl_D_Quotidien.Quot_Date<=[imp_dep]+42) AND
(Year([Quot_Date])> 08) AND (Tbl_D_Actions.Act_Cnl_Dif Like '*') AND
(Tbl_D_Actions.Act_Saison Like '*') GROUP BY Tbl_D_Canaux.Cnl_Desc,
DatePart('w',[quot_date],2,2), Tbl_D_Implementations.Cnl_Id ORDER BY
Tbl_D_Implementations.Cnl_Id, DatePart('w',[quot_date],2,2);

Le résultat dans Access
J nJ QJ QS Canal
1 151 23378 84388 1
2 161 23264 110992 1
3 158 22329 119655 1
4 145 17168 110176 1
5 151 14696 115829 1
6 147 7684 125032 1
7 150 3479 125911 1
1 150 5669 23599 2
2 160 5699 29873 2
3 159 5581 33114 2
4 146 4524 32698 2
5 151 3924 32912 2
6 147 2609 35287 2
7 150 2490 35403 2
1 151 14569 56784 3
2 161 18302 77840 3
3 158 15790 86973 3
4 145 13292 83518 3
5 151 10154 82428 3
6 147 3078 90267 3
7 150 2695 91042 3
Avatar
pascal58
Bonjour Sylvain, le code SQL plus bas est un debug.print sSql

On 30 avr, 21:51, "Sylvain Lafontaine"
wrote:
La première chose à faire serait d'afficher le résultat sSQL dans u ne boîte
de dialogue ou dans la fenêtre de debuggage avec Debug.Print et de la
comparer ensuite avec l'autre.

--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Blogue/site web:http://paparazzi-codeur.sylvainlafontaine.com
Consultant indépendant et programmation à distance pour Access et
SQL-Server.

"pascal58" wrote in message

news:
Bonjour,
En VBA je construit une chaine contenant du SQL.  Le recordset ne
renvoie rien.  Par contre si je colle la chaine dans l'éditeur de
requête dans Access, il retourne bien les 21 lignes attendues.

Quelqu'un a t'il une idée ?

Grand merci !

Code VBA (les paramètres/critères sont des contrôles du formulaire)

    Dim sSql As String
    Dim Rst As New ADODB.Recordset
    Dim CN As ADODB.Connection
    Set CN = CurrentProject.Connection
    Dim j1 As Integer, j2 As Integer
    Dim I As Integer, L As Integer, C As Integer

    j1 = (Val(TxtS1) - 1) * 7
    j2 = Val(TxtS2) * 7

    sSql = "SELECT DatePart('w',[quot_date],2,2) AS J,
Count(DatePart('w',[quot_date],2,2)) AS nJ,
Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ, Sum(Tbl_D_Hebdo.Heb_Qtite) AS
QS, Tbl_D_Implementations.Cnl_Id" _
    & " FROM ((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id" _
    & " WHERE (DatePart('ww',[Quot_Date],2,2)=[heb_sem])" _
    & " AND (Tbl_D_Quotidien.Quot_Type<>3)" _
    & " AND (Tbl_D_Quotidien.Quot_Date>=[imp_dep]+" & j1 & ")" _
    & " AND (Tbl_D_Quotidien.Quot_Date<=[imp_dep]+" & j2 & ")" _
    & " AND (Year([Quot_Date])>=" & Txt_An & ")" _
    & " AND (Tbl_D_Actions.Act_Cnl_Dif Like '" & Lst_Diff & "')" _
    & " AND (Tbl_D_Actions.Act_Saison Like '" & Lst_Sais & "')" _
    & " GROUP BY Tbl_D_Canaux.Cnl_Desc, DatePart('w',[quot_date],2,2) ,
Tbl_D_Implementations.Cnl_Id" _
    & " ORDER BY Tbl_D_Implementations.Cnl_Id, DatePart('w',
[quot_date],2,2);"

    Rst.Open sSql, CN, adOpenStatic
...

le SQL :
SELECT DatePart('w',[quot_date],2,2) AS J, Count(DatePart('w',
[quot_date],2,2)) AS nJ, Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ,
Sum(Tbl_D_Hebdo.Heb_Qtite) AS QS, Tbl_D_Implementations.Cnl_Id FROM
((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id WHERE
(DatePart('ww',[Quot_Date],2,2)=[heb_sem]) AND
(Tbl_D_Quotidien.Quot_Type<>3) AND
(Tbl_D_Quotidien.Quot_Date>=[imp_dep]+14) AND
(Tbl_D_Quotidien.Quot_Date<=[imp_dep]+42) AND
(Year([Quot_Date])> 08) AND (Tbl_D_Actions.Act_Cnl_Dif Like '*') AND
(Tbl_D_Actions.Act_Saison Like '*') GROUP BY Tbl_D_Canaux.Cnl_Desc,
DatePart('w',[quot_date],2,2), Tbl_D_Implementations.Cnl_Id ORDER BY
Tbl_D_Implementations.Cnl_Id, DatePart('w',[quot_date],2,2);

Le résultat dans Access
J nJ QJ QS Canal
1 151 23378 84388 1
2 161 23264 110992 1
3 158 22329 119655 1
4 145 17168 110176 1
5 151 14696 115829 1
6 147 7684 125032 1
7 150 3479 125911 1
1 150 5669 23599 2
2 160 5699 29873 2
3 159 5581 33114 2
4 146 4524 32698 2
5 151 3924 32912 2
6 147 2609 35287 2
7 150 2490 35403 2
1 151 14569 56784 3
2 161 18302 77840 3
3 158 15790 86973 3
4 145 13292 83518 3
5 151 10154 82428 3
6 147 3078 90267 3
7 150 2695 91042 3
Avatar
pascal58
Bonjour Thierry

Voilà un outil qui m'aurait fait gagner beaucoup de temps.
Mais mon code fonctionne : la chaine SQL plus bas est son résultat (?
sSql dans debug)
Merci en tout cas.

On 30 avr, 18:01, "Thierry" wrote:
Bonjour,
J'ai utilisé SQL Formatterhttp://www.smccall.demon.co.uk/Downloads.htm# SQLFormat
pour transformer votre code SQL en VBA.
Le résultat dans le fichier joint.
C'est plus lisible et si cela peut vous aider...
Bon courage.

"pascal58" a écrit dans le message denews:8e
Bonjour,
En VBA je construit une chaine contenant du SQL.  Le recordset ne
renvoie rien.  Par contre si je colle la chaine dans l'éditeur de
requête dans Access, il retourne bien les 21 lignes attendues.

Quelqu'un a t'il une idée ?

Grand merci !

Code VBA (les paramètres/critères sont des contrôles du formulaire)

    Dim sSql As String
    Dim Rst As New ADODB.Recordset
    Dim CN As ADODB.Connection
    Set CN = CurrentProject.Connection
    Dim j1 As Integer, j2 As Integer
    Dim I As Integer, L As Integer, C As Integer

    j1 = (Val(TxtS1) - 1) * 7
    j2 = Val(TxtS2) * 7

    sSql = "SELECT DatePart('w',[quot_date],2,2) AS J,
Count(DatePart('w',[quot_date],2,2)) AS nJ,
Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ, Sum(Tbl_D_Hebdo.Heb_Qtite) AS
QS, Tbl_D_Implementations.Cnl_Id" _
    & " FROM ((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id" _
    & " WHERE (DatePart('ww',[Quot_Date],2,2)=[heb_sem])" _
    & " AND (Tbl_D_Quotidien.Quot_Type<>3)" _
    & " AND (Tbl_D_Quotidien.Quot_Date>=[imp_dep]+" & j1 & ")" _
    & " AND (Tbl_D_Quotidien.Quot_Date<=[imp_dep]+" & j2 & ")" _
    & " AND (Year([Quot_Date])>=" & Txt_An & ")" _
    & " AND (Tbl_D_Actions.Act_Cnl_Dif Like '" & Lst_Diff & "')" _
    & " AND (Tbl_D_Actions.Act_Saison Like '" & Lst_Sais & "')" _
    & " GROUP BY Tbl_D_Canaux.Cnl_Desc, DatePart('w',[quot_date],2,2) ,
Tbl_D_Implementations.Cnl_Id" _
    & " ORDER BY Tbl_D_Implementations.Cnl_Id, DatePart('w',
[quot_date],2,2);"

    Rst.Open sSql, CN, adOpenStatic
...

le SQL :
SELECT DatePart('w',[quot_date],2,2) AS J, Count(DatePart('w',
[quot_date],2,2)) AS nJ, Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ,
Sum(Tbl_D_Hebdo.Heb_Qtite) AS QS, Tbl_D_Implementations.Cnl_Id FROM
((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id WHERE
(DatePart('ww',[Quot_Date],2,2)=[heb_sem]) AND
(Tbl_D_Quotidien.Quot_Type<>3) AND
(Tbl_D_Quotidien.Quot_Date>=[imp_dep]+14) AND
(Tbl_D_Quotidien.Quot_Date<=[imp_dep]+42) AND
(Year([Quot_Date])> 08) AND (Tbl_D_Actions.Act_Cnl_Dif Like '*') AND
(Tbl_D_Actions.Act_Saison Like '*') GROUP BY Tbl_D_Canaux.Cnl_Desc,
DatePart('w',[quot_date],2,2), Tbl_D_Implementations.Cnl_Id ORDER BY
Tbl_D_Implementations.Cnl_Id, DatePart('w',[quot_date],2,2);

Avatar
Michel__D
Bonjour,

pascal58 a écrit :
Bonjour Sylvain, le code SQL plus bas est un debug.print sSql



Mouais, l'on t'a dis de comparer le contenu de la variable sSQL avec le
code SQL qui fonctionne.

Tu peux aussi fixer les valeurs dans la variable sSQL.
Avatar
Sylvain Lafontaine
Votre commentaire « paramètres/critères sont des contrôles du formulaire »
est très confus. J'espère que vous n'essayez pas de transmettre le nom d'un
contrôle au travers d'ADO au lieu d'utiliser sa valeur et que vous n'oublier
de mettre entre quotes (simples ou doubles) les valeurs de type chaîne de
caractères; chose que vous n'avez pas à faire lorsque vous utilisez
directement un contrôle dans l'éditeur de requête.

Comme vous n'avez pas fourni la structure de vos tables - avec example de
données - et le nom de vos contrôles, il est impossible d'en dire plus.

Finalement, n'utilisez jamais un dimensionnement du genre « Dim Rst As New
ADODB.Recordset » avec ADO ou avec n'importe quelle hiérarchie d'objet
complexe et séparer le dimensionnement de la création de l'objet lui-même:

Dim Rst As ADODB.Recordset
Set Rst = New ADODB.Recordset

--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Blogue/site web: http://paparazzi-codeur.sylvainlafontaine.com
Consultant indépendant et programmation à distance pour Access et
SQL-Server.


"pascal58" wrote in message
news:
Bonjour Sylvain, le code SQL plus bas est un debug.print sSql

On 30 avr, 21:51, "Sylvain Lafontaine"
wrote:
La première chose à faire serait d'afficher le résultat sSQL dans une
boîte
de dialogue ou dans la fenêtre de debuggage avec Debug.Print et de la
comparer ensuite avec l'autre.

--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Blogue/site web:http://paparazzi-codeur.sylvainlafontaine.com
Consultant indépendant et programmation à distance pour Access et
SQL-Server.

"pascal58" wrote in message

news:
Bonjour,
En VBA je construit une chaine contenant du SQL. Le recordset ne
renvoie rien. Par contre si je colle la chaine dans l'éditeur de
requête dans Access, il retourne bien les 21 lignes attendues.

Quelqu'un a t'il une idée ?

Grand merci !

Code VBA (les paramètres/critères sont des contrôles du formulaire)

Dim sSql As String
Dim Rst As New ADODB.Recordset
Dim CN As ADODB.Connection
Set CN = CurrentProject.Connection
Dim j1 As Integer, j2 As Integer
Dim I As Integer, L As Integer, C As Integer

j1 = (Val(TxtS1) - 1) * 7
j2 = Val(TxtS2) * 7

sSql = "SELECT DatePart('w',[quot_date],2,2) AS J,
Count(DatePart('w',[quot_date],2,2)) AS nJ,
Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ, Sum(Tbl_D_Hebdo.Heb_Qtite) AS
QS, Tbl_D_Implementations.Cnl_Id" _
& " FROM ((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id" _
& " WHERE (DatePart('ww',[Quot_Date],2,2)=[heb_sem])" _
& " AND (Tbl_D_Quotidien.Quot_Type<>3)" _
& " AND (Tbl_D_Quotidien.Quot_Date>=[imp_dep]+" & j1 & ")" _
& " AND (Tbl_D_Quotidien.Quot_Date<=[imp_dep]+" & j2 & ")" _
& " AND (Year([Quot_Date])>=" & Txt_An & ")" _
& " AND (Tbl_D_Actions.Act_Cnl_Dif Like '" & Lst_Diff & "')" _
& " AND (Tbl_D_Actions.Act_Saison Like '" & Lst_Sais & "')" _
& " GROUP BY Tbl_D_Canaux.Cnl_Desc, DatePart('w',[quot_date],2,2),
Tbl_D_Implementations.Cnl_Id" _
& " ORDER BY Tbl_D_Implementations.Cnl_Id, DatePart('w',
[quot_date],2,2);"

Rst.Open sSql, CN, adOpenStatic
...

le SQL :
SELECT DatePart('w',[quot_date],2,2) AS J, Count(DatePart('w',
[quot_date],2,2)) AS nJ, Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ,
Sum(Tbl_D_Hebdo.Heb_Qtite) AS QS, Tbl_D_Implementations.Cnl_Id FROM
((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
Tbl_D_Implementations ON
Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
JOIN Tbl_D_Quotidien ON
Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id WHERE
(DatePart('ww',[Quot_Date],2,2)=[heb_sem]) AND
(Tbl_D_Quotidien.Quot_Type<>3) AND
(Tbl_D_Quotidien.Quot_Date>=[imp_dep]+14) AND
(Tbl_D_Quotidien.Quot_Date<=[imp_dep]+42) AND
(Year([Quot_Date])> 08) AND (Tbl_D_Actions.Act_Cnl_Dif Like '*') AND
(Tbl_D_Actions.Act_Saison Like '*') GROUP BY Tbl_D_Canaux.Cnl_Desc,
DatePart('w',[quot_date],2,2), Tbl_D_Implementations.Cnl_Id ORDER BY
Tbl_D_Implementations.Cnl_Id, DatePart('w',[quot_date],2,2);

Le résultat dans Access
J nJ QJ QS Canal
1 151 23378 84388 1
2 161 23264 110992 1
3 158 22329 119655 1
4 145 17168 110176 1
5 151 14696 115829 1
6 147 7684 125032 1
7 150 3479 125911 1
1 150 5669 23599 2
2 160 5699 29873 2
3 159 5581 33114 2
4 146 4524 32698 2
5 151 3924 32912 2
6 147 2609 35287 2
7 150 2490 35403 2
1 151 14569 56784 3
2 161 18302 77840 3
3 158 15790 86973 3
4 145 13292 83518 3
5 151 10154 82428 3
6 147 3078 90267 3
7 150 2695 91042 3
Avatar
pascal58
On 1 mai, 12:52, Michel__D
wrote:
Bonjour,

pascal58 a écrit :

> Bonjour Sylvain, le code SQL plus bas est un debug.print sSql

Mouais, l'on t'a dis de comparer le contenu de la variable sSQL avec le
code SQL qui fonctionne.

Tu peux aussi fixer les valeurs dans la variable sSQL.



Michel,

Je m'évertue à vous dire que *justement* le SQL est strictement le
même que lorsque je le fais à partir d'une requête ou à partir des
concaténations en VBA.
Que la requête en Access fonctionne, mais pas celle en VBA !
Et que les variables sont bien dans la chaine (code VBA : «... Like '"
& Lst_Diff & "'...» ) où Lst_Diff retourne son contenu, par exemple
ici * star étoile. Et que donc je ne fais pas référence à un crit ère
du style forms!form....

---
Autre chose, cela fait trois ou quatre fois que je répond à Jero sans
effet. Oui, je le fais à partir de l'interface de Groups.Google.
Bon, donc, s'il me lit, cela ne change rien car sa solution est un
solution (couteuse) pour résoudre le cas de valeurs "Null".
---

Merci à tous D'autres idées ?

Pascal
Avatar
pascal58
Merci Sylvain pour l'attention que vous portez à mon foutu
problème ;-)

On 2 mai, 01:49, "Sylvain Lafontaine"
wrote:
Votre commentaire « paramètres/critères sont des contrôles du for mulaire »
est très confus.  J'espère que vous n'essayez pas de transmettre le nom d'un
contrôle au travers d'ADO au lieu d'utiliser sa valeur et que vous n'ou blier
de mettre entre quotes (simples ou doubles)  les valeurs de type chaî ne de
caractères; chose que vous n'avez pas à faire lorsque vous utilisez
directement un contrôle dans l'éditeur de requête.
---



Oui confus (?)..., c'est pour expliquer la présence de "Txt_An", de
"Lst_Diff" (and Cie) dans le code VBA que j'ai fait cette remarque.
Vous remarquerez aussi que les quotes sont là où il le faut puisque,
je me répète, le code SQL est strictement identique à une utilisation
dans Access et au sein du recordset du VBA :
« ...
& " AND (Year([Quot_Date])>=" & Txt_An & ")" _
& " AND (Tbl_D_Actions.Act_Cnl_Dif Like '" & Lst_Diff & "')" _
...»


Comme vous n'avez pas fourni la structure de vos tables - avec example de
données - et le nom de vos contrôles, il est impossible d'en dire plu s.




Ben disons que c'est assez confidentiel (24000 données en phase test)
et donc je vais devoir être assez vague. Mais, ayant +sieurs dizaines
d'année d'expérience, je suis confiant en ma structure.
Alors :
Des Actions (Tbl_D_Actions) et des Canaux (Tbl_D_Canaux) vers une
table d'implémentations (Tbl_D_Implementations) qui distribue vers des
chiffres quotidiens (Tbl_D_Quotidien) et hebdomadaires (Tbl_D_Hebdo)
préalablement calculés.
Le but est d'extraire pour chaque jour de la semaine (lu, ma, me ...)
une sum Qtité journalière par rapport à une sum qtité hebdo, suivan t
une série de critères dont le like '*' sont dans la table
"T_D_Actions"


Finalement, n'utilisez jamais un dimensionnement du genre « Dim Rst As New
ADODB.Recordset » avec ADO ou avec n'importe quelle hiérarchie d'obje t
complexe et séparer le dimensionnement de la création de l'objet lui- même:

Dim Rst As ADODB.Recordset
Set Rst = New ADODB.Recordset




Ah.
Par acquis de conscience, j'ai essayé, et cela n'a rien changé.


Bien à vous tous, Pascal


--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Blogue/site web:http://paparazzi-codeur.sylvainlafontaine.com
Consultant indépendant et programmation à distance pour Access et
SQL-Server.

"pascal58" wrote in message

news:
Bonjour Sylvain, le code SQL plus bas est un debug.print sSql

On 30 avr, 21:51, "Sylvain Lafontaine"



wrote:
> La première chose à faire serait d'afficher le résultat sSQL dans une
> boîte
> de dialogue ou dans la fenêtre de debuggage avec Debug.Print et de la
> comparer ensuite avec l'autre.

> --
> Sylvain Lafontaine, ing.
> MVP pour « Windows Live Platform »
> Blogue/site web:http://paparazzi-codeur.sylvainlafontaine.com
> Consultant indépendant et programmation à distance pour Access et
> SQL-Server.

> "pascal58" wrote in message

>news: .
> Bonjour,
> En VBA je construit une chaine contenant du SQL. Le recordset ne
> renvoie rien. Par contre si je colle la chaine dans l'éditeur de
> requête dans Access, il retourne bien les 21 lignes attendues.

> Quelqu'un a t'il une idée ?

> Grand merci !

> Code VBA (les paramètres/critères sont des contrôles du formulair e)

> Dim sSql As String
> Dim Rst As New ADODB.Recordset
> Dim CN As ADODB.Connection
> Set CN = CurrentProject.Connection
> Dim j1 As Integer, j2 As Integer
> Dim I As Integer, L As Integer, C As Integer

> j1 = (Val(TxtS1) - 1) * 7
> j2 = Val(TxtS2) * 7

> sSql = "SELECT DatePart('w',[quot_date],2,2) AS J,
> Count(DatePart('w',[quot_date],2,2)) AS nJ,
> Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ, Sum(Tbl_D_Hebdo.Heb_Qtite) AS
> QS, Tbl_D_Implementations.Cnl_Id" _
> & " FROM ((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
> Tbl_D_Implementations ON
> Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
> Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
> Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
> JOIN Tbl_D_Quotidien ON
> Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id" _
> & " WHERE (DatePart('ww',[Quot_Date],2,2)=[heb_sem])" _
> & " AND (Tbl_D_Quotidien.Quot_Type<>3)" _
> & " AND (Tbl_D_Quotidien.Quot_Date>=[imp_dep]+" & j1 & ")" _
> & " AND (Tbl_D_Quotidien.Quot_Date<=[imp_dep]+" & j2 & ")" _
> & " AND (Year([Quot_Date])>=" & Txt_An & ")" _
> & " AND (Tbl_D_Actions.Act_Cnl_Dif Like '" & Lst_Diff & "')" _
> & " AND (Tbl_D_Actions.Act_Saison Like '" & Lst_Sais & "')" _
> & " GROUP BY Tbl_D_Canaux.Cnl_Desc, DatePart('w',[quot_date],2,2),
> Tbl_D_Implementations.Cnl_Id" _
> & " ORDER BY Tbl_D_Implementations.Cnl_Id, DatePart('w',
> [quot_date],2,2);"

> Rst.Open sSql, CN, adOpenStatic
> ...

> le SQL :
> SELECT DatePart('w',[quot_date],2,2) AS J, Count(DatePart('w',
> [quot_date],2,2)) AS nJ, Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ,
> Sum(Tbl_D_Hebdo.Heb_Qtite) AS QS, Tbl_D_Implementations.Cnl_Id FROM
> ((Tbl_D_Canaux INNER JOIN (Tbl_D_Actions INNER JOIN
> Tbl_D_Implementations ON
> Tbl_D_Actions.Act_Id=Tbl_D_Implementations.Act_Id) ON
> Tbl_D_Canaux.Cnl_Id=Tbl_D_Implementations.Cnl_Id) INNER JOIN
> Tbl_D_Hebdo ON Tbl_D_Implementations.Imp_Id=Tbl_D_Hebdo.Imp_Id) INNER
> JOIN Tbl_D_Quotidien ON
> Tbl_D_Implementations.Imp_Id=Tbl_D_Quotidien.Imp_Id WHERE
> (DatePart('ww',[Quot_Date],2,2)=[heb_sem]) AND
> (Tbl_D_Quotidien.Quot_Type<>3) AND
> (Tbl_D_Quotidien.Quot_Date>=[imp_dep]+14) AND
> (Tbl_D_Quotidien.Quot_Date<=[imp_dep]+42) AND
> (Year([Quot_Date])> 08) AND (Tbl_D_Actions.Act_Cnl_Dif Like '*') AN D
> (Tbl_D_Actions.Act_Saison Like '*') GROUP BY Tbl_D_Canaux.Cnl_Desc,
> DatePart('w',[quot_date],2,2), Tbl_D_Implementations.Cnl_Id ORDER BY
> Tbl_D_Implementations.Cnl_Id, DatePart('w',[quot_date],2,2);

> Le résultat dans Access
> J nJ QJ QS Canal
> 1 151 23378 84388 1
> 2 161 23264 110992 1
> 3 158 22329 119655 1
> 4 145 17168 110176 1
> 5 151 14696 115829 1
> 6 147 7684 125032 1
> 7 150 3479 125911 1
> 1 150 5669 23599 2
> 2 160 5699 29873 2
> 3 159 5581 33114 2
> 4 146 4524 32698 2
> 5 151 3924 32912 2
> 6 147 2609 35287 2
> 7 150 2490 35403 2
> 1 151 14569 56784 3
> 2 161 18302 77840 3
> 3 158 15790 86973 3
> 4 145 13292 83518 3
> 5 151 10154 82428 3
> 6 147 3078 90267 3
> 7 150 2695 91042 3
Avatar
Michel__D
Bonjour,

pascal58 a écrit :
On 1 mai, 12:52, Michel__D
wrote:

Bonjour,

pascal58 a écrit :


Bonjour Sylvain, le code SQL plus bas est un debug.print sSql



Mouais, l'on t'a dis de comparer le contenu de la variable sSQL avec le
code SQL qui fonctionne.

Tu peux aussi fixer les valeurs dans la variable sSQL.




Michel,

Je m'évertue à vous dire que *justement* le SQL est strictement le
même que lorsque je le fais à partir d'une requête ou à partir des
concaténations en VBA.
Que la requête en Access fonctionne, mais pas celle en VBA !
Et que les variables sont bien dans la chaine (code VBA : «... Like '"
& Lst_Diff & "'...» ) où Lst_Diff retourne son contenu, par exemple
ici * star étoile. Et que donc je ne fais pas référence à un critère
du style forms!form....

---
Autre chose, cela fait trois ou quatre fois que je répond à Jero sans
effet. Oui, je le fais à partir de l'interface de Groups.Google.
Bon, donc, s'il me lit, cela ne change rien car sa solution est un
solution (couteuse) pour résoudre le cas de valeurs "Null".
---

Merci à tous D'autres idées ?

Pascal



Vu que le SQL pur ne contient pas de variable on peut dire que la
variable chaîne "sSQL" symbolisant
le sql n'est pas identique, à moins de fixer les valeurs dans la
variable "sSQL", l'as-tu fait ?

Autre chose pour éviter toute ambiguité préfixe tous tes champs par
rapport aux tables correspondantes.
1 2