OVH Cloud OVH Cloud

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
Sylvain Lafontaine
On ne veut pas vraiment savoir ce qu'il y a dans vos 24000 données, on veut
seulement savoir ce que représente le nom [Quot_Date]: est-ce qu'il s'agit
là du nom d'un contrôle dans le formulaire ou du nom d'un des champs d'une
des tables et dans le deuxième cas, le type de champ (numéric ou chaîne de
caractères?). Même chose pour la liste des autres noms tels que [imp_dep].

Si la requête fonctionne avec l'éditeur de requête mais qu'elle ne
fonctionne pas avec VBA, il doit bien y avoir une raison quelconque mais si
vous refusez de donner des détails, il est impossible d'en dire plus sinon
de vous suggérez de simplifier votre requête jusqu'à ce que vous ayez isolé
l'erreur. Une fois l'erreur isolée, il devrait être facile de la corriger.

Pour mon commentaire au sujet du dimensionnement de la variable Rst, ce
commentaire était uniquement un commentaire d'ordre général; sans aucun
rapport avec votre problème.

--
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:
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 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.
---



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 plus.




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, suivant
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'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




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 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 3 mai, 07:20, "Sylvain Lafontaine"
wrote:
On ne veut pas vraiment savoir ce qu'il y a dans vos 24000 données, on veut
seulement savoir ce que représente le nom [Quot_Date]: est-ce qu'il s'a git
là du nom d'un contrôle dans le formulaire ou du nom d'un des champs d'une
des tables et dans le deuxième cas, le type de champ (numéric ou cha îne de
caractères?).  Même chose pour la liste des autres noms tels que [i mp_dep].

Si la requête fonctionne avec l'éditeur de requête mais qu'elle ne
fonctionne pas avec VBA, il doit bien y avoir une raison quelconque mais si
vous refusez de donner des détails, il est impossible d'en dire plus si non
de vous suggérez de simplifier votre requête jusqu'à ce que vous ay ez isolé
l'erreur.  Une fois l'erreur isolée, il devrait être facile de la c orriger.



Bonjour, vous trouverez tous les détails là
http://www.cijoint.fr/cjlink.php?file=cj201005/cijLEydiC7.doc
Avatar
pascal58
Bonjour, vous trouverez tous les détails là
http://www.cijoint.fr/cjlink.php?file=cj201005/cijLEydiC7.doc
Avatar
Sylvain Lafontaine
Désolé mais j'ai pour politique de ne jamais télécharger des documents ou
même des images provenant d'une source inconnue et c'est le cas de la très
grande majorité des personnes ici.

Je répète donc ma question: est-ce que [Quot_Date] représente le nom d'un
contrôle dans le formulaire ou le nom d'un des champs d'une des tables et
dans le deuxième cas, quel serait le type de ce champ (numéric ou chaîne de
caractères?). Même chose pour la liste des autres noms tels que [imp_dep].

Dans le pire des cas, faites un Copie&Coller du document .DOC dans votre
réponse au groupe de discussion.

--
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:
On 3 mai, 07:20, "Sylvain Lafontaine"
wrote:
On ne veut pas vraiment savoir ce qu'il y a dans vos 24000 données, on
veut
seulement savoir ce que représente le nom [Quot_Date]: est-ce qu'il s'agit
là du nom d'un contrôle dans le formulaire ou du nom d'un des champs d'une
des tables et dans le deuxième cas, le type de champ (numéric ou chaîne de
caractères?). Même chose pour la liste des autres noms tels que [imp_dep].

Si la requête fonctionne avec l'éditeur de requête mais qu'elle ne
fonctionne pas avec VBA, il doit bien y avoir une raison quelconque mais
si
vous refusez de donner des détails, il est impossible d'en dire plus sinon
de vous suggérez de simplifier votre requête jusqu'à ce que vous ayez
isolé
l'erreur. Une fois l'erreur isolée, il devrait être facile de la corriger.



Bonjour, vous trouverez tous les détails là
http://www.cijoint.fr/cjlink.php?file=cj201005/cijLEydiC7.doc
Avatar
jero
Salut,
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".


Qu'entends-tu par "coûteuse" ? As-tu testé ?
A+

"pascal58" a écrit dans le message de news:

Bonjour, vous trouverez tous les détails là
http://www.cijoint.fr/cjlink.php?file=cj201005/cijLEydiC7.doc
Avatar
pascal58
1 Les tables et relations


Soit
• une table « Actions » qui contient un descriptif, dont :
o La « Saison » (Act_Saison) 3 caractères
o La « Diffusion » (Act_Cnl_Dif) 3 caratères
• une table « Canaux » qui contient aussi un descriptif (trois
canaux).
o Ici, seul Cnl_Id nous intéresse
• Les deux ensembles forment une « Implémentation ». Autrement dit ,
pour une action il peut y avoir jusqu’autant d’implémentations qu’i l
n’y a de canaux.
o Le champ Imp_Dep contient la date de départ de la série
À droite,
• une table « Quotidien » qui, jour après jour durant une période
variable contient :
o Quot_Date, la date
o Quot_Type, le type de jour, notamment la valeur 3 pour jour férié
o Quot_Qtite, la quantité (du jour)
• Une table « Hebdo » qui contient ces quantités, mais en cumul par
semaine :
o Heb_Sem, n° de la semaine calendrier (1-52 ou 53)
o Heb_Qtite, la quantité
2 La requête
L’objectif de la requête est de calculer la somme de tous les lundis,
mardis, …) en regard de la somme des semaines y correspondantes et du
nombre de jours que cela représente, le tout réparti par canal.
Soit pour le résultat ci-dessous :
• J = n° du jour (1 pour lundi)
DatePart('w',[quot_date],2,2) AS J
• Nj : le nombre de jour
Count(DatePart('w',[quot_date],2,2)) AS nJ
• Qj = la somme de tous les lundis, mardis…
Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ
• QS = la somme de toutes les semaines où se trouvent ce jour
Sum(Tbl_D_Hebdo.Heb_Qtite) AS QS
WHERE(((DatePart('ww',[Quot_Date],2,2))=[heb_sem]) La semaine de la
date quotidienne égale celle de la semaine de la table Hebdo
• Et canal = n° du canal.
Tbl_D_Implementations.Cnl_Id
• Les critères sont :
o Pas de jour férié :
AND ((Tbl_D_Quotidien.Quot_Type)<>3)
o Limité à une certaine période au sein de l’action, par exemple ic i
entre 14 et 42 jours
AND ((Tbl_D_Quotidien.Quot_Date)>=[imp_dep]+14 And
(Tbl_D_Quotidien.Quot_Date)<=[imp_dep]+42)
o L’année de départ
AND ((Year([Quot_Date]))> 08)
o La diffusion
AND ((Tbl_D_Actions.Act_Cnl_Dif) Like "*")
o Et la saison
AND ((Tbl_D_Actions.Act_Saison) Like "*"))
• GROUP BY DatePart('w',[quot_date],2,2), Tbl_D_Implementations.Cnl_Id
• ORDER BY Tbl_D_Implementations.Cnl_Id, DatePart('w',[quot_date],
2,2);

J nJ QJ QS Canal
1 263 44755 190179 1
2 294 56802 260154 1
3 276 48012 266878 1
4 262 43389 257802 1
5 267 35131 275201 1
6 263 15870 285212 1
7 266 9248 286091 1
1 258 14625 59807 2
(Etc.)

Tout cela fonctionne fort bien.


3 J’ai un formulaire
Le contrôle de l’année s’appelle Txt_An, les deux semaines TxtS1 et
TxtS2, puis Lst_Diff, Lst_Sais et Cmd_Go.

Les semaines sont transformées en jours dans les variables J1 et J2

Puis les valeurs de ces variables et des autres contrôles sont inséré s
par concaténation à l’aide de l’esperluette (&) dans la chaine sSql
(lignes bleues)

Voici le code VBA

Private Sub Cmd_Go_Click()
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 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

If Not Rst.EOF Then
Résultat :


Rst.EOF à Vrai égale pas d’enregistrements



Copié/collé du 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 (NZ(Tbl_D_Actions.Act_Cnl_Dif,'') Like
'*') AND (NZ(Tbl_D_Actions.Act_Saison,'') Like '*') GROUP BY
DatePart('w',[quot_date],2,2), Tbl_D_Implementations.Cnl_Id ORDER BY
Tbl_D_Implementations.Cnl_Id, DatePart('w',[quot_date],2,2);

Collé dans une requête :

Exécution de la requête : Ok !!!!


À partir du moment où il y a une étoile, la requête ne fonctionne p as
à partir du code vba, Où est l’erreur ?
Avatar
pascal58
On 4 mai, 07:38, "jero" <~ wrote:
Salut,>Autre chose, cela fait trois ou quatre fois que je répond à Je ro 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".

Qu'entends-tu par "coûteuse" ? As-tu testé ?
A+

"pascal58" a écrit dans le message de news:

Bonjour, vous trouverez tous les détails làhttp://www.cijoint.fr/cjli nk.php?file=cj201005/cijLEydiC7.doc



Oui Jero, par acquis de conscience j'ai essayé. Mais comme je n'ai
pas de Null, cela ne sert à rien d'ajouter +sieurs NZ qui prennent du
temps d'être calculé (c'est ce que j'entends par "coûteux")

En tout cas, merci
Avatar
Sylvain Lafontaine
À partir du moment où il y a une étoile, la requête ne fonctionne pas
à partir du code vba, Où est l’erreur ?



Si votre problème est relié uniquement à l'étoile pour LIKE, essayer de la
remplacer par le signe de pourcentage %. Si votre BDD est en mode de
compatibilité ANSI 92 ou si vous faites une requête Passthrough vers un
SQL-Server, vous devez utiliser le signe de pourcentage % à la place de
l'astérisque pour les conditions LIKE.

Évidemment, dans votre cas, vous n'êtes probablement pas en mode ANSI 92 et
il ne s'agit pas de requête passthrough mais comme vous utilisez ADO à la
place DAO et que vous appelez CurrentProject.Connection, je ne sais pas trop
ce qui se passe dans votre cas.

Le problème avec CurrentProject.Connection; c'est que l'on ne sait pas trop
quel fournisseur ("provider") est appelé/utilisé et son impact sur le
symbole devant être utilisé par LIKE. Vous devriez plutôt bâtir votre
propre chaîne de connection vers votre fichier MDB ou ACCDB et contrôler
ainsi le fournisseur utilisé. Juste à titre de curiosité, c'est quoi au
juste la valeur retournée par CurrentProject.Connection? Aussi, y a-t-il
une raison particulière pourquoi vous voulez utiliser ADO à la place de DAO
dans un module Access?

Comme votre problème est avec LIKE, vous devriez également faire des tests
juste avec ça.

Une dernière hypothèse serait un problème de Lock; vous devriez essayer avec
une copie du fichier MDB ou ACCDB pour voir s'il n'y a pas quelque chose qui
bloque la lecture dans le formulaire ouvert.

--
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:
1 Les tables et relations


Soit
• une table « Actions » qui contient un descriptif, dont :
o La « Saison » (Act_Saison) 3 caractères
o La « Diffusion » (Act_Cnl_Dif) 3 caratères
• une table « Canaux » qui contient aussi un descriptif (trois
canaux).
o Ici, seul Cnl_Id nous intéresse
• Les deux ensembles forment une « Implémentation ». Autrement dit,
pour une action il peut y avoir jusqu’autant d’implémentations qu’il
n’y a de canaux.
o Le champ Imp_Dep contient la date de départ de la série
À droite,
• une table « Quotidien » qui, jour après jour durant une période
variable contient :
o Quot_Date, la date
o Quot_Type, le type de jour, notamment la valeur 3 pour jour férié
o Quot_Qtite, la quantité (du jour)
• Une table « Hebdo » qui contient ces quantités, mais en cumul par
semaine :
o Heb_Sem, n° de la semaine calendrier (1-52 ou 53)
o Heb_Qtite, la quantité
2 La requête
L’objectif de la requête est de calculer la somme de tous les lundis,
mardis, …) en regard de la somme des semaines y correspondantes et du
nombre de jours que cela représente, le tout réparti par canal.
Soit pour le résultat ci-dessous :
• J = n° du jour (1 pour lundi)
DatePart('w',[quot_date],2,2) AS J
• Nj : le nombre de jour
Count(DatePart('w',[quot_date],2,2)) AS nJ
• Qj = la somme de tous les lundis, mardis…
Sum(Tbl_D_Quotidien.Quot_Qtite) AS QJ
• QS = la somme de toutes les semaines où se trouvent ce jour
Sum(Tbl_D_Hebdo.Heb_Qtite) AS QS
WHERE(((DatePart('ww',[Quot_Date],2,2))=[heb_sem]) La semaine de la
date quotidienne égale celle de la semaine de la table Hebdo
• Et canal = n° du canal.
Tbl_D_Implementations.Cnl_Id
• Les critères sont :
o Pas de jour férié :
AND ((Tbl_D_Quotidien.Quot_Type)<>3)
o Limité à une certaine période au sein de l’action, par exemple ici
entre 14 et 42 jours
AND ((Tbl_D_Quotidien.Quot_Date)>=[imp_dep]+14 And
(Tbl_D_Quotidien.Quot_Date)<=[imp_dep]+42)
o L’année de départ
AND ((Year([Quot_Date]))> 08)
o La diffusion
AND ((Tbl_D_Actions.Act_Cnl_Dif) Like "*")
o Et la saison
AND ((Tbl_D_Actions.Act_Saison) Like "*"))
• GROUP BY DatePart('w',[quot_date],2,2), Tbl_D_Implementations.Cnl_Id
• ORDER BY Tbl_D_Implementations.Cnl_Id, DatePart('w',[quot_date],
2,2);

J nJ QJ QS Canal
1 263 44755 190179 1
2 294 56802 260154 1
3 276 48012 266878 1
4 262 43389 257802 1
5 267 35131 275201 1
6 263 15870 285212 1
7 266 9248 286091 1
1 258 14625 59807 2
(Etc.)

Tout cela fonctionne fort bien.


3 J’ai un formulaire
Le contrôle de l’année s’appelle Txt_An, les deux semaines TxtS1 et
TxtS2, puis Lst_Diff, Lst_Sais et Cmd_Go.

Les semaines sont transformées en jours dans les variables J1 et J2

Puis les valeurs de ces variables et des autres contrôles sont insérés
par concaténation à l’aide de l’esperluette (&) dans la chaine sSql
(lignes bleues)

Voici le code VBA

Private Sub Cmd_Go_Click()
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 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

If Not Rst.EOF Then
Résultat :


Rst.EOF à Vrai égale pas d’enregistrements



Copié/collé du 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 (NZ(Tbl_D_Actions.Act_Cnl_Dif,'') Like
'*') AND (NZ(Tbl_D_Actions.Act_Saison,'') Like '*') GROUP BY
DatePart('w',[quot_date],2,2), Tbl_D_Implementations.Cnl_Id ORDER BY
Tbl_D_Implementations.Cnl_Id, DatePart('w',[quot_date],2,2);

Collé dans une requête :

Exécution de la requête : Ok !!!!


À partir du moment où il y a une étoile, la requête ne fonctionne pas
à partir du code vba, Où est l’erreur ?
Avatar
pascal58
On 4 mai, 21:13, "Sylvain Lafontaine"
wrote:
> À partir du moment où il y a une étoile, la requête ne fonction ne pas
> à partir du code vba, Où est l’erreur ?

Si votre problème est relié uniquement à l'étoile pour LIKE, essa yer de la
remplacer par le signe de pourcentage %.  Si votre BDD est en mode de
compatibilité ANSI 92 ou si vous faites une requête Passthrough vers un
SQL-Server, vous devez utiliser le signe de pourcentage % à la place de
l'astérisque pour les conditions LIKE.



Et bien voilà !
Je viens de voir la confirmation par ailleurs, en ADO il faut utiliser
le % à la place de * ...

Merci Sylvain, merci à tous.
Avatar
Blaise Cacramp
Bonjour !

J'ai suivi le fil silencieusement mais la solution me laisse pantois :
DAO | ADO ... il y a des gourous qui disent «l'un» puis d'autres «l'autre»
pour preuve de modernité. Et il est un fait que s'il y a une migration vers
SQL SERVER, c'est déjà un gain de temps en ADODB.

Mais bon, passer du patois d'Access vers un SQL plus normalisé sans prévenir
...

%



"pascal58" a écrit dans le message de news:

On 4 mai, 21:13, "Sylvain Lafontaine"
wrote:
> À partir du moment où il y a une étoile, la requête ne fonctionne pas
> à partir du code vba, Où est l’erreur ?

Si votre problème est relié uniquement à l'étoile pour LIKE, essayer de la
remplacer par le signe de pourcentage %. Si votre BDD est en mode de
compatibilité ANSI 92 ou si vous faites une requête Passthrough vers un
SQL-Server, vous devez utiliser le signe de pourcentage % à la place de
l'astérisque pour les conditions LIKE.



Et bien voilà !
Je viens de voir la confirmation par ailleurs, en ADO il faut utiliser
le % à la place de * ...

Merci Sylvain, merci à tous.
1 2