OVH Cloud OVH Cloud

Simplification nombre de requête

24 réponses
Avatar
Hervé DUCARNE
Bonjour,

Une question simple :

J'ai une table avec une clé, et différents champs booléens.

Je voudrais connaitre, pour chaque champ, le nombre d'enregistrement à vrai.

Dans la requête pour calculer pour un champ, no problème, j'ai mis la clé,
dans opération je mets "compte", je mets le champ, et dans opération je mets
"où" et critère 'vrai'.

J'ai 100 champs ;-(

Il y a t'il un moyen qui puisse me permettre d'éviter de créer 100 requêtes
?

Merci.

10 réponses

1 2 3
Avatar
Hervé DUCARNE
C'est ce à quoi j'étais à près réfléchir !

Je me posais la question suivante : soit je crée la table avant, et ensuite
je relance une boucle avec remplissage des champs des requêtes, soit je crée
la boucle dans laquelle je crée le champ et lui injecte le résultat de la
requête.

T'en penses quoi ??


"Jimmy Limousin" a écrit dans le message de
news:
jeu. 22 sept. 2005 15:12:45 Hervé DUCARNE a écrit dans le message de news
<news: :

C'est parfait, ça tourne du feu de dieu !

Merci encore.


Bien.

Il ne te reste plus qu'à créer une table de synthèse et lancer une routine
qui va interroger les requêtes pour alimenter les champs.

Parceque bon, on va pas non plus lancer les requêtes à la main et noter le
résultat au stylo, hein.

--
Quand Jimmy dit what'd I say
I love you baby
C'est comme qui dirait
Toute la province qui chante en anglais




Avatar
Hervé DUCARNE
OK, c'est ce que j'ai commencé defaire.

Je reviens dans le fil si je bloque.

Merci encore de ton aide !

@+

"Jimmy Limousin" a écrit dans le message de
news:
jeu. 22 sept. 2005 15:31:14 Hervé DUCARNE a écrit dans le message de news
<news: :

C'est ce à quoi j'étais à près réfléchir !

Je me posais la question suivante : soit je crée la table avant, et
ensuite je relance une boucle avec remplissage des champs des requêtes,
soit je crée la boucle dans laquelle je crée le champ et lui injecte le
résultat de la requête.

T'en penses quoi ??


Je pense que tu crées les champs de la table et affecte les valeurs dans
la

même boucle.

Pour des noms de champs personnalisés, tu peux inscrire les noms de
chaque champs dans un tableau de constantes.

--
Quand Jimmy dit what'd I say
I love you baby
C'est comme qui dirait
Toute la province qui chante en anglais




Avatar
Hervé DUCARNE
Bon, je savais que je n'allais pas tarder à venir frapper ici ;-)

Je voudrais commencer par créer la table, et ensuite dans la boucle créer
les champs et les remplir.

Pour le moment, j'essaie de créer la table et un champ hors boucle, pour
tester des choses "simples".
Voici mon code (pas d'erreur, mais la création ne se fait pas)

Sub creertabledefinitive()
Dim bd As Database
Dim dbsql As String
Dim i As Single

Set bd = CurrentDb

Dim dbtable As TableDef 'pour la création de la table
Dim Dbchamp As Field

Set dbtable = bd.CreateTableDef("donnees1")
Set Dbchamp = dbtable.CreateField("men")
Dbchamp.OrdinalPosition = 1
Dbchamp.Attributes = dbAutoIncrField
dbtable.Fields.Append Dbchamp

End Sub

Je fatigue, !!!

Merci si tu vois ce qui ne va pas de me le signaler...
Avatar
Eric
Bonjour,

Sous réserve d'avoir bien compris ...
Pourquoi ne pas créer une requête globale te donnant le nb de Vrai pour
pour chaque champ sans devoir créer autant de requêtes (dans ton exemple
100)

Le code ci-dessous te crée une requête donnant le nb de VRAI pour chaque
champ : Adapter le nom de la table et pour l'exemple j'ai lmité à 8
chams booléens, donc passer à 100.

Sub zz()
On Error GoTo Err_zz
Dim strsql As String, i As Integer
Dim chaine As String, qry As DAO.Querydef
strsql = "Select "
For i = 1 To 8
chaine = chaine & "-sum([" & i & "]) As Nb" & i & "VRAI, "
Next i
chaine = Left(chaine, Len(chaine) - 2)
strsql = strsql & chaine & " From LaTable Where"
chaine = ""
For i = 1 To 8
chaine = chaine & " [" & i & "] = True OR "
Next i
chaine = Left(chaine, Len(chaine) - 3) & ";"
strsql = strsql & chaine
Set qry = CurrentDb.CreateQueryDef("LaRequêteDesVrais", strsql)
RefreshDatabaseWindow
Set qry = Nothing
Exit Sub
Err_zz:
CurrentDb.QueryDefs.Delete "LaRequêteDesVrais"
Resume 0
End Sub


C'est parfait, ça tourne du feu de dieu !

Merci encore.

@+


"Jimmy Limousin" a écrit dans le message de
news:

jeu. 22 sept. 2005 14:16:14 Hervé DUCARNE a écrit dans le message de news
<news:uLsHi# :


Tu vois pas pourquoi elle ne fais rien cette fonction please ??


Voilà ce que j'ai testé.

En dehors du fait que dans ta requête tu nommes la somme du même nom que


le

champs, c'est pas beau, j'ai mis le champ entre crochets et parenthésé.


Pour

tout dire j'ai fait un copier coller de la chaine sql depuis l'assistant


pour

rédiger le squelette de la première requête, après tu fais tourner le i.

Il faut aussi rafraichir la collection de requêtes avec un append.

Aussi, il faut voir si tes champs sont numérotés de 1 à 100 sans format ou
sur deux ou trois digits, auquel cas, utiliser la fonction format(), je
trouve ça plus propre de manipuler des indices formatés.

Sub CreerRequetes()
Dim dbbd As Database
Dim qdReq As QueryDef
Dim stSql As String
Dim i As Long

Set dbbd = CurrentDb
For i = 1 To 3
stSql = "SELECT Count(donnees.ci_donnees) AS CompteDeci_donnees


FROM

donnees WHERE (((donnees.[" & CStr(i) & "])=True));"
Set qdReq = dbbd.CreateQueryDef()
qdReq.SQL = stSql
qdReq.Name = "Tester_Champ_" & Format(i, "00")
dbbd.QueryDefs.Append qdReq
Next

End Sub

--
Quand Jimmy dit what'd I say
I love you baby
C'est comme qui dirait
Toute la province qui chante en anglais







--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
Eric
re


Ouais, c'est bien aussi. Ça a le défaut d'être plus performant.


;-)

Mais ça ne marchera pas pour les champs contenant des choix multiples dans la
suite de son traitement du questionnaire.


Oui, mais avec ton code, le problème ne reste-t-il pas entier ?

Je ne vais pas me laisser faire, non mais :))


Je vois, je vois ;-)
Mais je reviendrai jeter un oeil !

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Jessy Sempere [MVP]
Bonjour

J'ai pas forcément tout suivi mais bon...
Tu as :
Clé 1 2 3 4 5 ...
---------------------------------------
x vrai vrai faux faux vrai
x faux vrai faux faux vrai
z vrai faux faux vrai vrai
z faux vrai vrai vrai faux
z vrai vrai faux vrai vrai
...

Et toi tu veux connaître le nombre de vrai par champs :
Clé 1 2 3 4 5
-------------------------
x 1 2 0 0 2
z 2 2 1 3 2
...

Si c'est bien ce que tu veux, il te suffit de faire :

SELECT taTable.Clé, Sum([1]*-1) AS Expr1,
Sum([2]*-1) AS Expr2, Sum([3]*-1) AS Expr3, ...
FROM taTable
GROUP BY taTable.Clé;

Biensûr vu tous les mails, je ne suis pas sûr d'avoir tout compris... ;-))

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Hervé DUCARNE" a écrit dans le message news:

Bonjour,

Une question simple :

J'ai une table avec une clé, et différents champs booléens.

Je voudrais connaitre, pour chaque champ, le nombre d'enregistrement à
vrai.


Dans la requête pour calculer pour un champ, no problème, j'ai mis la clé,
dans opération je mets "compte", je mets le champ, et dans opération je
mets

"où" et critère 'vrai'.

J'ai 100 champs ;-(

Il y a t'il un moyen qui puisse me permettre d'éviter de créer 100
requêtes

?

Merci.




Avatar
Hervé DUCARNE
Merci,
Mais ça ne marche pas "erreur 3001 : argument non valide" sur la ligne
bd.TableDefs.Append dbtable que j'ai mise après le append du champ...


"Jimmy Limousin" a écrit dans le message de
news:
jeu. 22 sept. 2005 16:08:43 Hervé DUCARNE a écrit dans le message de news
<news: :

Je fatigue, !!!

Merci si tu vois ce qui ne va pas de me le signaler...


Il faut aussi rafraichir la collection des tables après avoir mis à jour
les

propriétés de dbtable !

bd.TableDefs.Append dbtable

Tu peux aussi créer la table avec l'assistant avec un premier champ.


--
Quand Jimmy dit what'd I say
I love you baby
C'est comme qui dirait
Toute la province qui chante en anglais




Avatar
Hervé DUCARNE
Merci Jessy,
Mais je voulais avoir la somme de chaque clé...
Pas évident à suivre ce fil :-)

"Jessy Sempere [MVP]" a écrit dans le message de
news:4332c789$
Bonjour

J'ai pas forcément tout suivi mais bon...
Tu as :
Clé 1 2 3 4 5 ...
---------------------------------------
x vrai vrai faux faux vrai
x faux vrai faux faux vrai
z vrai faux faux vrai vrai
z faux vrai vrai vrai faux
z vrai vrai faux vrai vrai
...

Et toi tu veux connaître le nombre de vrai par champs :
Clé 1 2 3 4 5
-------------------------
x 1 2 0 0 2
z 2 2 1 3 2
...

Si c'est bien ce que tu veux, il te suffit de faire :

SELECT taTable.Clé, Sum([1]*-1) AS Expr1,
Sum([2]*-1) AS Expr2, Sum([3]*-1) AS Expr3, ...
FROM taTable
GROUP BY taTable.Clé;

Biensûr vu tous les mails, je ne suis pas sûr d'avoir tout compris... ;-))

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Hervé DUCARNE" a écrit dans le message news:

Bonjour,

Une question simple :

J'ai une table avec une clé, et différents champs booléens.

Je voudrais connaitre, pour chaque champ, le nombre d'enregistrement à
vrai.


Dans la requête pour calculer pour un champ, no problème, j'ai mis la
clé,


dans opération je mets "compte", je mets le champ, et dans opération je
mets

"où" et critère 'vrai'.

J'ai 100 champs ;-(

Il y a t'il un moyen qui puisse me permettre d'éviter de créer 100
requêtes

?

Merci.








Avatar
Hervé DUCARNE
Bonsoir,

Ou la la, comment tu fais pour inventer des fonctions comme ça, je m'y perds
avec tous ces intermédiaires.
Effectivement ça marche aussi !
Merci.
"Eric" a écrit dans le message de
news:uIfA0$
Bonjour,

Sous réserve d'avoir bien compris ...
Pourquoi ne pas créer une requête globale te donnant le nb de Vrai pour
pour chaque champ sans devoir créer autant de requêtes (dans ton exemple
100)

Le code ci-dessous te crée une requête donnant le nb de VRAI pour chaque
champ : Adapter le nom de la table et pour l'exemple j'ai lmité à 8
chams booléens, donc passer à 100.

Sub zz()
On Error GoTo Err_zz
Dim strsql As String, i As Integer
Dim chaine As String, qry As DAO.Querydef
strsql = "Select "
For i = 1 To 8
chaine = chaine & "-sum([" & i & "]) As Nb" & i & "VRAI, "
Next i
chaine = Left(chaine, Len(chaine) - 2)
strsql = strsql & chaine & " From LaTable Where"
chaine = ""
For i = 1 To 8
chaine = chaine & " [" & i & "] = True OR "
Next i
chaine = Left(chaine, Len(chaine) - 3) & ";"
strsql = strsql & chaine
Set qry = CurrentDb.CreateQueryDef("LaRequêteDesVrais", strsql)
RefreshDatabaseWindow
Set qry = Nothing
Exit Sub
Err_zz:
CurrentDb.QueryDefs.Delete "LaRequêteDesVrais"
Resume 0
End Sub


C'est parfait, ça tourne du feu de dieu !

Merci encore.

@+


"Jimmy Limousin" a écrit dans le message de
news:

jeu. 22 sept. 2005 14:16:14 Hervé DUCARNE a écrit dans le message de
news



<news:uLsHi# :


Tu vois pas pourquoi elle ne fais rien cette fonction please ??


Voilà ce que j'ai testé.

En dehors du fait que dans ta requête tu nommes la somme du même nom que


le

champs, c'est pas beau, j'ai mis le champ entre crochets et parenthésé.


Pour

tout dire j'ai fait un copier coller de la chaine sql depuis l'assistant


pour

rédiger le squelette de la première requête, après tu fais tourner le i.

Il faut aussi rafraichir la collection de requêtes avec un append.

Aussi, il faut voir si tes champs sont numérotés de 1 à 100 sans format
ou



sur deux ou trois digits, auquel cas, utiliser la fonction format(), je
trouve ça plus propre de manipuler des indices formatés.

Sub CreerRequetes()
Dim dbbd As Database
Dim qdReq As QueryDef
Dim stSql As String
Dim i As Long

Set dbbd = CurrentDb
For i = 1 To 3
stSql = "SELECT Count(donnees.ci_donnees) AS CompteDeci_donnees


FROM

donnees WHERE (((donnees.[" & CStr(i) & "])=True));"
Set qdReq = dbbd.CreateQueryDef()
qdReq.SQL = stSql
qdReq.Name = "Tester_Champ_" & Format(i, "00")
dbbd.QueryDefs.Append qdReq
Next

End Sub

--
Quand Jimmy dit what'd I say
I love you baby
C'est comme qui dirait
Toute la province qui chante en anglais







--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr





Avatar
Jessy Sempere [MVP]
Bonjour
Merci Jessy,
Mais je voulais avoir la somme de chaque clé...
Pas évident à suivre ce fil :-)


Effectivement pas évident à suivre... ;-)
Tu dis que tu veux la somme de chaque clé... donc tu veux connaître le
nombre de vrai de la clé x pour le champ1, le champ2, ..., le champ100

Si c'est bien ça, c'est exactement ce que fait la requête que je te propose.
Sinon ??? C'est quoi comme donnée ta clé ?

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Jessy Sempere [MVP]" a écrit dans le message
de

news:4332c789$
Bonjour

J'ai pas forcément tout suivi mais bon...
Tu as :
Clé 1 2 3 4 5 ...
---------------------------------------
x vrai vrai faux faux vrai
x faux vrai faux faux vrai
z vrai faux faux vrai vrai
z faux vrai vrai vrai faux
z vrai vrai faux vrai vrai
...

Et toi tu veux connaître le nombre de vrai par champs :
Clé 1 2 3 4 5
-------------------------
x 1 2 0 0 2
z 2 2 1 3 2
...

Si c'est bien ce que tu veux, il te suffit de faire :

SELECT taTable.Clé, Sum([1]*-1) AS Expr1,
Sum([2]*-1) AS Expr2, Sum([3]*-1) AS Expr3, ...
FROM taTable
GROUP BY taTable.Clé;

Biensûr vu tous les mails, je ne suis pas sûr d'avoir tout compris...
;-))



@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Hervé DUCARNE" a écrit dans le message news:

Bonjour,

Une question simple :

J'ai une table avec une clé, et différents champs booléens.

Je voudrais connaitre, pour chaque champ, le nombre d'enregistrement à
vrai.


Dans la requête pour calculer pour un champ, no problème, j'ai mis la
clé,


dans opération je mets "compte", je mets le champ, et dans opération
je



mets
"où" et critère 'vrai'.

J'ai 100 champs ;-(

Il y a t'il un moyen qui puisse me permettre d'éviter de créer 100
requêtes

?

Merci.












1 2 3