-----Message d'origine-----
Salut,
Je dois dire que j'ai triché, je ne trouvais pas de
solution "simple"
( c'est à dire, sans recourir à une table temporaire)
mais John L. Viescas a
trouvé une solution toute simple... Si j'ai bien compris
la question, que je
traduis en: étant donné une liste de persones, pid, et
de pays, cid (country
id), le problème est de prendre, au hasard, 10 personnes
dont pas deux ne
proviennent du même pays? si cela est équivalent à la
question initiale
posée (et c'est comme cela que je l'ai compris), alors,
la solution tout
simple proposée par John est:
SELECT Top 10 tblCountries.cid,
(SELECT Top 1 pid
FROM tblPeopleCountries
WHERE tblPeopleCountries.cid = tblCountries.cid
ORDER BY Rnd(pid)) As pid
FROM tblCountries
ORDER BY Rnd(cid)
où tblCountries fournie une liste (sans doublons) de
pays. On suppose que
pid et cid sont numériques, si il sont alpha, utiliser
Rnd(len(pid)) et
Rnd(len(cid)).
Noter que l'astuce de John fut d'utiliser une requête
corellée dans le
SELECT principal. Cela fonctionne, sous Jet. Évidemment,
John a transposé le
problème en choisir aléatoirement une personne par pays,
puis, choisir
aléatoirement 10 pays.
J'imagine qu'il est possible, alors de transposer de
(Personnes, Pays), à
(Prof, Ville).
Vanderghast, Access MVP
"Ado" wrote in
message
news:332901c4674d$ad308f40$
Bonjours à tous,
J'aurai besoin d'un petit coup de main sur une petite
histoire de hasard.
J'ai 2 tables :
1ére table contient : n° de dossier, ville, . « 2
dossiers »
2éme table contient : nom du professeur, ville, . « 7
professeurs »
J'aurai besoin d'une ligne de commande « command button
click » pour que le system me propose au hasard 3
professeurs par dossier ou les villes ne correspondent
pas l'une avec l'autre.
Merci pour votre aide.
.
-----Message d'origine-----
Salut,
Je dois dire que j'ai triché, je ne trouvais pas de
solution "simple"
( c'est à dire, sans recourir à une table temporaire)
mais John L. Viescas a
trouvé une solution toute simple... Si j'ai bien compris
la question, que je
traduis en: étant donné une liste de persones, pid, et
de pays, cid (country
id), le problème est de prendre, au hasard, 10 personnes
dont pas deux ne
proviennent du même pays? si cela est équivalent à la
question initiale
posée (et c'est comme cela que je l'ai compris), alors,
la solution tout
simple proposée par John est:
SELECT Top 10 tblCountries.cid,
(SELECT Top 1 pid
FROM tblPeopleCountries
WHERE tblPeopleCountries.cid = tblCountries.cid
ORDER BY Rnd(pid)) As pid
FROM tblCountries
ORDER BY Rnd(cid)
où tblCountries fournie une liste (sans doublons) de
pays. On suppose que
pid et cid sont numériques, si il sont alpha, utiliser
Rnd(len(pid)) et
Rnd(len(cid)).
Noter que l'astuce de John fut d'utiliser une requête
corellée dans le
SELECT principal. Cela fonctionne, sous Jet. Évidemment,
John a transposé le
problème en choisir aléatoirement une personne par pays,
puis, choisir
aléatoirement 10 pays.
J'imagine qu'il est possible, alors de transposer de
(Personnes, Pays), à
(Prof, Ville).
Vanderghast, Access MVP
"Ado" <anonymous@discussions.microsoft.com> wrote in
message
news:332901c4674d$ad308f40$7d02280a@phx.gbl...
Bonjours à tous,
J'aurai besoin d'un petit coup de main sur une petite
histoire de hasard.
J'ai 2 tables :
1ére table contient : n° de dossier, ville, . « 2
dossiers »
2éme table contient : nom du professeur, ville, . « 7
professeurs »
J'aurai besoin d'une ligne de commande « command button
click » pour que le system me propose au hasard 3
professeurs par dossier ou les villes ne correspondent
pas l'une avec l'autre.
Merci pour votre aide.
.
-----Message d'origine-----
Salut,
Je dois dire que j'ai triché, je ne trouvais pas de
solution "simple"
( c'est à dire, sans recourir à une table temporaire)
mais John L. Viescas a
trouvé une solution toute simple... Si j'ai bien compris
la question, que je
traduis en: étant donné une liste de persones, pid, et
de pays, cid (country
id), le problème est de prendre, au hasard, 10 personnes
dont pas deux ne
proviennent du même pays? si cela est équivalent à la
question initiale
posée (et c'est comme cela que je l'ai compris), alors,
la solution tout
simple proposée par John est:
SELECT Top 10 tblCountries.cid,
(SELECT Top 1 pid
FROM tblPeopleCountries
WHERE tblPeopleCountries.cid = tblCountries.cid
ORDER BY Rnd(pid)) As pid
FROM tblCountries
ORDER BY Rnd(cid)
où tblCountries fournie une liste (sans doublons) de
pays. On suppose que
pid et cid sont numériques, si il sont alpha, utiliser
Rnd(len(pid)) et
Rnd(len(cid)).
Noter que l'astuce de John fut d'utiliser une requête
corellée dans le
SELECT principal. Cela fonctionne, sous Jet. Évidemment,
John a transposé le
problème en choisir aléatoirement une personne par pays,
puis, choisir
aléatoirement 10 pays.
J'imagine qu'il est possible, alors de transposer de
(Personnes, Pays), à
(Prof, Ville).
Vanderghast, Access MVP
"Ado" wrote in
message
news:332901c4674d$ad308f40$
Bonjours à tous,
J'aurai besoin d'un petit coup de main sur une petite
histoire de hasard.
J'ai 2 tables :
1ére table contient : n° de dossier, ville, . « 2
dossiers »
2éme table contient : nom du professeur, ville, . « 7
professeurs »
J'aurai besoin d'une ligne de commande « command button
click » pour que le system me propose au hasard 3
professeurs par dossier ou les villes ne correspondent
pas l'une avec l'autre.
Merci pour votre aide.
.
-----Message d'origine-----
Salut,
Je dois dire que j'ai triché, je ne trouvais pas de
solution "simple"
( c'est à dire, sans recourir à une table temporaire)
mais John L. Viescas a
trouvé une solution toute simple... Si j'ai bien compris
la question, que je
traduis en: étant donné une liste de persones, pid, et
de pays, cid (country
id), le problème est de prendre, au hasard, 10 personnes
dont pas deux ne
proviennent du même pays? si cela est équivalent à la
question initiale
posée (et c'est comme cela que je l'ai compris), alors,
la solution tout
simple proposée par John est:
SELECT Top 10 tblCountries.cid,
(SELECT Top 1 pid
FROM tblPeopleCountries
WHERE tblPeopleCountries.cid = tblCountries.cid
ORDER BY Rnd(pid)) As pid
FROM tblCountries
ORDER BY Rnd(cid)
où tblCountries fournie une liste (sans doublons) de
pays. On suppose que
pid et cid sont numériques, si il sont alpha, utiliser
Rnd(len(pid)) et
Rnd(len(cid)).
Noter que l'astuce de John fut d'utiliser une requête
corellée dans le
SELECT principal. Cela fonctionne, sous Jet. Évidemment,
John a transposé le
problème en choisir aléatoirement une personne par pays,
puis, choisir
aléatoirement 10 pays.
J'imagine qu'il est possible, alors de transposer de
(Personnes, Pays), à
(Prof, Ville).
Vanderghast, Access MVP
"Ado" wrote in
message
news:332901c4674d$ad308f40$
Bonjours à tous,
J'aurai besoin d'un petit coup de main sur une petite
histoire de hasard.
J'ai 2 tables :
1ére table contient : n° de dossier, ville, . « 2
dossiers »
2éme table contient : nom du professeur, ville, . « 7
professeurs »
J'aurai besoin d'une ligne de commande « command button
click » pour que le system me propose au hasard 3
professeurs par dossier ou les villes ne correspondent
pas l'une avec l'autre.
Merci pour votre aide.
.
-----Message d'origine-----
Salut,
Je dois dire que j'ai triché, je ne trouvais pas de
solution "simple"
( c'est à dire, sans recourir à une table temporaire)
mais John L. Viescas a
trouvé une solution toute simple... Si j'ai bien compris
la question, que je
traduis en: étant donné une liste de persones, pid, et
de pays, cid (country
id), le problème est de prendre, au hasard, 10 personnes
dont pas deux ne
proviennent du même pays? si cela est équivalent à la
question initiale
posée (et c'est comme cela que je l'ai compris), alors,
la solution tout
simple proposée par John est:
SELECT Top 10 tblCountries.cid,
(SELECT Top 1 pid
FROM tblPeopleCountries
WHERE tblPeopleCountries.cid = tblCountries.cid
ORDER BY Rnd(pid)) As pid
FROM tblCountries
ORDER BY Rnd(cid)
où tblCountries fournie une liste (sans doublons) de
pays. On suppose que
pid et cid sont numériques, si il sont alpha, utiliser
Rnd(len(pid)) et
Rnd(len(cid)).
Noter que l'astuce de John fut d'utiliser une requête
corellée dans le
SELECT principal. Cela fonctionne, sous Jet. Évidemment,
John a transposé le
problème en choisir aléatoirement une personne par pays,
puis, choisir
aléatoirement 10 pays.
J'imagine qu'il est possible, alors de transposer de
(Personnes, Pays), à
(Prof, Ville).
Vanderghast, Access MVP
"Ado" <anonymous@discussions.microsoft.com> wrote in
message
news:332901c4674d$ad308f40$7d02280a@phx.gbl...
Bonjours à tous,
J'aurai besoin d'un petit coup de main sur une petite
histoire de hasard.
J'ai 2 tables :
1ére table contient : n° de dossier, ville, . « 2
dossiers »
2éme table contient : nom du professeur, ville, . « 7
professeurs »
J'aurai besoin d'une ligne de commande « command button
click » pour que le system me propose au hasard 3
professeurs par dossier ou les villes ne correspondent
pas l'une avec l'autre.
Merci pour votre aide.
.
-----Message d'origine-----
Salut,
Je dois dire que j'ai triché, je ne trouvais pas de
solution "simple"
( c'est à dire, sans recourir à une table temporaire)
mais John L. Viescas a
trouvé une solution toute simple... Si j'ai bien compris
la question, que je
traduis en: étant donné une liste de persones, pid, et
de pays, cid (country
id), le problème est de prendre, au hasard, 10 personnes
dont pas deux ne
proviennent du même pays? si cela est équivalent à la
question initiale
posée (et c'est comme cela que je l'ai compris), alors,
la solution tout
simple proposée par John est:
SELECT Top 10 tblCountries.cid,
(SELECT Top 1 pid
FROM tblPeopleCountries
WHERE tblPeopleCountries.cid = tblCountries.cid
ORDER BY Rnd(pid)) As pid
FROM tblCountries
ORDER BY Rnd(cid)
où tblCountries fournie une liste (sans doublons) de
pays. On suppose que
pid et cid sont numériques, si il sont alpha, utiliser
Rnd(len(pid)) et
Rnd(len(cid)).
Noter que l'astuce de John fut d'utiliser une requête
corellée dans le
SELECT principal. Cela fonctionne, sous Jet. Évidemment,
John a transposé le
problème en choisir aléatoirement une personne par pays,
puis, choisir
aléatoirement 10 pays.
J'imagine qu'il est possible, alors de transposer de
(Personnes, Pays), à
(Prof, Ville).
Vanderghast, Access MVP
"Ado" wrote in
message
news:332901c4674d$ad308f40$
Bonjours à tous,
J'aurai besoin d'un petit coup de main sur une petite
histoire de hasard.
J'ai 2 tables :
1ére table contient : n° de dossier, ville, . « 2
dossiers »
2éme table contient : nom du professeur, ville, . « 7
professeurs »
J'aurai besoin d'une ligne de commande « command button
click » pour que le system me propose au hasard 3
professeurs par dossier ou les villes ne correspondent
pas l'une avec l'autre.
Merci pour votre aide.
.
-----Message d'origine-----
Salut,
Dans ce cas, il me semble, à priori, qu'une procédure
itérative est plus
appropriée. Il s'agit de boucler pour chaque pannel.
Pour un pannel donné,
choisir aléatoirement parmi les experts qui ne sont pas
de la dite ville, et
parmi ceux qui n'ont pas été déjà choisis trois fois:
SELECT TOP 3 experts.expertID
FROM experts
WHERE experts.ville <> villeConsidérée
AND expertID IN ( SELECT assignations.expertID
FROM assignations
GROUP BY
assignations.expertID
HAVING COUNT(*) <3 )
ORDER BY Rnd(len(experts.ville)), expertID
La table assignations est construite comme suit:
Pannel ExpertID 'champs
Elle est initialement vide.
On commence par considérer le premier pannel. La requête
trouve trois
experts, on les ajoute, un par enregistrement, dans la
table asssignations.
Pour le second pannel, la requête fourni encore trois
experts, et on les
ajoute encore, un par enregistrement, à la table des
assignations. Et ainsi
de suite. Le "HAVING COUNT(*) <3" tient compte qu'un
même expert ne peut
pas être sollicité plus de trois fois. Si cette
contrainte n'a pas sa raison
d'être, simplement enlever le " AND expertID IN
(SELECT ... ) ". Une fois
qu'on a bouclé sur tous les pannels, la table des
assignations est remplie.
Comme il est théoriquement possible que deux nombres
aléatoires soient
égaux, j'ai ajouter le champ expertID, dans le ORDER BY,
pour briser toute
égalité possible.
Espérant être utile,
Vanderghast, Access MVP
wrote in message
news:396301c46b18$0c4a2770$
Bonjour,
Merci pour la réponse, mais je vais m'expliqué mieux :
J'ai une table avec des propositions « T_PROPOSALS » avec
les champs suivants :
(PROP_NUM, PROP_PANEL, PROP_COUNTRY)
Une autre table avec des experts « T_EXPERTS » avec les
champs suivants :
(Last_name, PANEL, COUNTRY)
Je voudrai créer une troisième table (random) «
tbltemp »
Pour chaque proposition il faut trois experts « on peut
avoir 100 experts par panel » et un expert ne peut
participé qu'a trois propositions du même panel et ne
peut être du même pays d'où vienne cette proposition.
Alors, ma table tbltemp en réalité doit contenir les
champs suivants :
PROP_NUM, Last_name_1, Last_name_2, Last_name_3, PANEL.
Merci pour votre aide.-----Message d'origine-----
Salut,
Je dois dire que j'ai triché, je ne trouvais pas de
solution "simple"( c'est à dire, sans recourir à une table temporaire)
mais John L. Viescas atrouvé une solution toute simple... Si j'ai bien compris
la question, que jetraduis en: étant donné une liste de persones, pid, et
de pays, cid (countryid), le problème est de prendre, au hasard, 10 personnes
dont pas deux neproviennent du même pays? si cela est équivalent à la
question initialeposée (et c'est comme cela que je l'ai compris), alors,
la solution toutsimple proposée par John est:
SELECT Top 10 tblCountries.cid,
(SELECT Top 1 pid
FROM tblPeopleCountries
WHERE tblPeopleCountries.cid = tblCountries.cid
ORDER BY Rnd(pid)) As pid
FROM tblCountries
ORDER BY Rnd(cid)
où tblCountries fournie une liste (sans doublons) de
pays. On suppose quepid et cid sont numériques, si il sont alpha, utiliser
Rnd(len(pid)) etRnd(len(cid)).
Noter que l'astuce de John fut d'utiliser une requête
corellée dans leSELECT principal. Cela fonctionne, sous Jet. Évidemment,
John a transposé leproblème en choisir aléatoirement une personne par pays,
puis, choisiraléatoirement 10 pays.
J'imagine qu'il est possible, alors de transposer de
(Personnes, Pays), à(Prof, Ville).
Vanderghast, Access MVP
"Ado" wrote in
messagenews:332901c4674d$ad308f40$
Bonjours à tous,
J'aurai besoin d'un petit coup de main sur une petite
histoire de hasard.
J'ai 2 tables :
1ére table contient : n° de dossier, ville, . « 2
dossiers »
2éme table contient : nom du professeur, ville, . « 7
professeurs »
J'aurai besoin d'une ligne de commande « command button
click » pour que le system me propose au hasard 3
professeurs par dossier ou les villes ne correspondent
pas l'une avec l'autre.
Merci pour votre aide.
.
.
-----Message d'origine-----
Salut,
Dans ce cas, il me semble, à priori, qu'une procédure
itérative est plus
appropriée. Il s'agit de boucler pour chaque pannel.
Pour un pannel donné,
choisir aléatoirement parmi les experts qui ne sont pas
de la dite ville, et
parmi ceux qui n'ont pas été déjà choisis trois fois:
SELECT TOP 3 experts.expertID
FROM experts
WHERE experts.ville <> villeConsidérée
AND expertID IN ( SELECT assignations.expertID
FROM assignations
GROUP BY
assignations.expertID
HAVING COUNT(*) <3 )
ORDER BY Rnd(len(experts.ville)), expertID
La table assignations est construite comme suit:
Pannel ExpertID 'champs
Elle est initialement vide.
On commence par considérer le premier pannel. La requête
trouve trois
experts, on les ajoute, un par enregistrement, dans la
table asssignations.
Pour le second pannel, la requête fourni encore trois
experts, et on les
ajoute encore, un par enregistrement, à la table des
assignations. Et ainsi
de suite. Le "HAVING COUNT(*) <3" tient compte qu'un
même expert ne peut
pas être sollicité plus de trois fois. Si cette
contrainte n'a pas sa raison
d'être, simplement enlever le " AND expertID IN
(SELECT ... ) ". Une fois
qu'on a bouclé sur tous les pannels, la table des
assignations est remplie.
Comme il est théoriquement possible que deux nombres
aléatoires soient
égaux, j'ai ajouter le champ expertID, dans le ORDER BY,
pour briser toute
égalité possible.
Espérant être utile,
Vanderghast, Access MVP
<anonymous@discussions.microsoft.com> wrote in message
news:396301c46b18$0c4a2770$3a01280a@phx.gbl...
Bonjour,
Merci pour la réponse, mais je vais m'expliqué mieux :
J'ai une table avec des propositions « T_PROPOSALS » avec
les champs suivants :
(PROP_NUM, PROP_PANEL, PROP_COUNTRY)
Une autre table avec des experts « T_EXPERTS » avec les
champs suivants :
(Last_name, PANEL, COUNTRY)
Je voudrai créer une troisième table (random) «
tbltemp »
Pour chaque proposition il faut trois experts « on peut
avoir 100 experts par panel » et un expert ne peut
participé qu'a trois propositions du même panel et ne
peut être du même pays d'où vienne cette proposition.
Alors, ma table tbltemp en réalité doit contenir les
champs suivants :
PROP_NUM, Last_name_1, Last_name_2, Last_name_3, PANEL.
Merci pour votre aide.
-----Message d'origine-----
Salut,
Je dois dire que j'ai triché, je ne trouvais pas de
solution "simple"
( c'est à dire, sans recourir à une table temporaire)
mais John L. Viescas a
trouvé une solution toute simple... Si j'ai bien compris
la question, que je
traduis en: étant donné une liste de persones, pid, et
de pays, cid (country
id), le problème est de prendre, au hasard, 10 personnes
dont pas deux ne
proviennent du même pays? si cela est équivalent à la
question initiale
posée (et c'est comme cela que je l'ai compris), alors,
la solution tout
simple proposée par John est:
SELECT Top 10 tblCountries.cid,
(SELECT Top 1 pid
FROM tblPeopleCountries
WHERE tblPeopleCountries.cid = tblCountries.cid
ORDER BY Rnd(pid)) As pid
FROM tblCountries
ORDER BY Rnd(cid)
où tblCountries fournie une liste (sans doublons) de
pays. On suppose que
pid et cid sont numériques, si il sont alpha, utiliser
Rnd(len(pid)) et
Rnd(len(cid)).
Noter que l'astuce de John fut d'utiliser une requête
corellée dans le
SELECT principal. Cela fonctionne, sous Jet. Évidemment,
John a transposé le
problème en choisir aléatoirement une personne par pays,
puis, choisir
aléatoirement 10 pays.
J'imagine qu'il est possible, alors de transposer de
(Personnes, Pays), à
(Prof, Ville).
Vanderghast, Access MVP
"Ado" <anonymous@discussions.microsoft.com> wrote in
message
news:332901c4674d$ad308f40$7d02280a@phx.gbl...
Bonjours à tous,
J'aurai besoin d'un petit coup de main sur une petite
histoire de hasard.
J'ai 2 tables :
1ére table contient : n° de dossier, ville, . « 2
dossiers »
2éme table contient : nom du professeur, ville, . « 7
professeurs »
J'aurai besoin d'une ligne de commande « command button
click » pour que le system me propose au hasard 3
professeurs par dossier ou les villes ne correspondent
pas l'une avec l'autre.
Merci pour votre aide.
.
.
-----Message d'origine-----
Salut,
Dans ce cas, il me semble, à priori, qu'une procédure
itérative est plus
appropriée. Il s'agit de boucler pour chaque pannel.
Pour un pannel donné,
choisir aléatoirement parmi les experts qui ne sont pas
de la dite ville, et
parmi ceux qui n'ont pas été déjà choisis trois fois:
SELECT TOP 3 experts.expertID
FROM experts
WHERE experts.ville <> villeConsidérée
AND expertID IN ( SELECT assignations.expertID
FROM assignations
GROUP BY
assignations.expertID
HAVING COUNT(*) <3 )
ORDER BY Rnd(len(experts.ville)), expertID
La table assignations est construite comme suit:
Pannel ExpertID 'champs
Elle est initialement vide.
On commence par considérer le premier pannel. La requête
trouve trois
experts, on les ajoute, un par enregistrement, dans la
table asssignations.
Pour le second pannel, la requête fourni encore trois
experts, et on les
ajoute encore, un par enregistrement, à la table des
assignations. Et ainsi
de suite. Le "HAVING COUNT(*) <3" tient compte qu'un
même expert ne peut
pas être sollicité plus de trois fois. Si cette
contrainte n'a pas sa raison
d'être, simplement enlever le " AND expertID IN
(SELECT ... ) ". Une fois
qu'on a bouclé sur tous les pannels, la table des
assignations est remplie.
Comme il est théoriquement possible que deux nombres
aléatoires soient
égaux, j'ai ajouter le champ expertID, dans le ORDER BY,
pour briser toute
égalité possible.
Espérant être utile,
Vanderghast, Access MVP
wrote in message
news:396301c46b18$0c4a2770$
Bonjour,
Merci pour la réponse, mais je vais m'expliqué mieux :
J'ai une table avec des propositions « T_PROPOSALS » avec
les champs suivants :
(PROP_NUM, PROP_PANEL, PROP_COUNTRY)
Une autre table avec des experts « T_EXPERTS » avec les
champs suivants :
(Last_name, PANEL, COUNTRY)
Je voudrai créer une troisième table (random) «
tbltemp »
Pour chaque proposition il faut trois experts « on peut
avoir 100 experts par panel » et un expert ne peut
participé qu'a trois propositions du même panel et ne
peut être du même pays d'où vienne cette proposition.
Alors, ma table tbltemp en réalité doit contenir les
champs suivants :
PROP_NUM, Last_name_1, Last_name_2, Last_name_3, PANEL.
Merci pour votre aide.-----Message d'origine-----
Salut,
Je dois dire que j'ai triché, je ne trouvais pas de
solution "simple"( c'est à dire, sans recourir à une table temporaire)
mais John L. Viescas atrouvé une solution toute simple... Si j'ai bien compris
la question, que jetraduis en: étant donné une liste de persones, pid, et
de pays, cid (countryid), le problème est de prendre, au hasard, 10 personnes
dont pas deux neproviennent du même pays? si cela est équivalent à la
question initialeposée (et c'est comme cela que je l'ai compris), alors,
la solution toutsimple proposée par John est:
SELECT Top 10 tblCountries.cid,
(SELECT Top 1 pid
FROM tblPeopleCountries
WHERE tblPeopleCountries.cid = tblCountries.cid
ORDER BY Rnd(pid)) As pid
FROM tblCountries
ORDER BY Rnd(cid)
où tblCountries fournie une liste (sans doublons) de
pays. On suppose quepid et cid sont numériques, si il sont alpha, utiliser
Rnd(len(pid)) etRnd(len(cid)).
Noter que l'astuce de John fut d'utiliser une requête
corellée dans leSELECT principal. Cela fonctionne, sous Jet. Évidemment,
John a transposé leproblème en choisir aléatoirement une personne par pays,
puis, choisiraléatoirement 10 pays.
J'imagine qu'il est possible, alors de transposer de
(Personnes, Pays), à(Prof, Ville).
Vanderghast, Access MVP
"Ado" wrote in
messagenews:332901c4674d$ad308f40$
Bonjours à tous,
J'aurai besoin d'un petit coup de main sur une petite
histoire de hasard.
J'ai 2 tables :
1ére table contient : n° de dossier, ville, . « 2
dossiers »
2éme table contient : nom du professeur, ville, . « 7
professeurs »
J'aurai besoin d'une ligne de commande « command button
click » pour que le system me propose au hasard 3
professeurs par dossier ou les villes ne correspondent
pas l'une avec l'autre.
Merci pour votre aide.
.
.
-----Message d'origine-----
Salut,
Dans ce cas, il me semble, à priori, qu'une procédure
itérative est plus
appropriée. Il s'agit de boucler pour chaque pannel.
Pour un pannel donné,
choisir aléatoirement parmi les experts qui ne sont pas
de la dite ville, et
parmi ceux qui n'ont pas été déjà choisis trois fois:
SELECT TOP 3 experts.expertID
FROM experts
WHERE experts.ville <> villeConsidérée
AND expertID IN ( SELECT assignations.expertID
FROM assignations
GROUP BY
assignations.expertID
HAVING COUNT(*) <3 )
ORDER BY Rnd(len(experts.ville)), expertID
La table assignations est construite comme suit:
Pannel ExpertID 'champs
Elle est initialement vide.
On commence par considérer le premier pannel. La requête
trouve trois
experts, on les ajoute, un par enregistrement, dans la
table asssignations.
Pour le second pannel, la requête fourni encore trois
experts, et on les
ajoute encore, un par enregistrement, à la table des
assignations. Et ainsi
de suite. Le "HAVING COUNT(*) <3" tient compte qu'un
même expert ne peut
pas être sollicité plus de trois fois. Si cette
contrainte n'a pas sa raison
d'être, simplement enlever le " AND expertID IN
(SELECT ... ) ". Une fois
qu'on a bouclé sur tous les pannels, la table des
assignations est remplie.
Comme il est théoriquement possible que deux nombres
aléatoires soient
égaux, j'ai ajouter le champ expertID, dans le ORDER BY,
pour briser toute
égalité possible.
Espérant être utile,
Vanderghast, Access MVP
wrote in message
news:396301c46b18$0c4a2770$
Bonjour,
Merci pour la réponse, mais je vais m'expliqué mieux :
J'ai une table avec des propositions « T_PROPOSALS » avec
les champs suivants :
(PROP_NUM, PROP_PANEL, PROP_COUNTRY)
Une autre table avec des experts « T_EXPERTS » avec les
champs suivants :
(Last_name, PANEL, COUNTRY)
Je voudrai créer une troisième table (random) «
tbltemp »
Pour chaque proposition il faut trois experts « on peut
avoir 100 experts par panel » et un expert ne peut
participé qu'a trois propositions du même panel et ne
peut être du même pays d'où vienne cette proposition.
Alors, ma table tbltemp en réalité doit contenir les
champs suivants :
PROP_NUM, Last_name_1, Last_name_2, Last_name_3, PANEL.
Merci pour votre aide.
-----Message d'origine-----
Salut,
Dans ce cas, il me semble, à priori, qu'une procédure
itérative est plus
appropriée. Il s'agit de boucler pour chaque pannel.
Pour un pannel donné,
choisir aléatoirement parmi les experts qui ne sont pas
de la dite ville, et
parmi ceux qui n'ont pas été déjà choisis trois fois:
SELECT TOP 3 experts.expertID
FROM experts
WHERE experts.ville <> villeConsidérée
AND expertID IN ( SELECT assignations.expertID
FROM assignations
GROUP BY
assignations.expertID
HAVING COUNT(*) <3 )
ORDER BY Rnd(len(experts.ville)), expertID
La table assignations est construite comme suit:
Pannel ExpertID 'champs
Elle est initialement vide.
On commence par considérer le premier pannel. La requête
trouve trois
experts, on les ajoute, un par enregistrement, dans la
table asssignations.
Pour le second pannel, la requête fourni encore trois
experts, et on les
ajoute encore, un par enregistrement, à la table des
assignations. Et ainsi
de suite. Le "HAVING COUNT(*) <3" tient compte qu'un
même expert ne peut
pas être sollicité plus de trois fois. Si cette
contrainte n'a pas sa raison
d'être, simplement enlever le " AND expertID IN
(SELECT ... ) ". Une fois
qu'on a bouclé sur tous les pannels, la table des
assignations est remplie.
Comme il est théoriquement possible que deux nombres
aléatoires soient
égaux, j'ai ajouter le champ expertID, dans le ORDER BY,
pour briser toute
égalité possible.
Espérant être utile,
Vanderghast, Access MVP
<anonymous@discussions.microsoft.com> wrote in message
news:396301c46b18$0c4a2770$3a01280a@phx.gbl...
Bonjour,
Merci pour la réponse, mais je vais m'expliqué mieux :
J'ai une table avec des propositions « T_PROPOSALS » avec
les champs suivants :
(PROP_NUM, PROP_PANEL, PROP_COUNTRY)
Une autre table avec des experts « T_EXPERTS » avec les
champs suivants :
(Last_name, PANEL, COUNTRY)
Je voudrai créer une troisième table (random) «
tbltemp »
Pour chaque proposition il faut trois experts « on peut
avoir 100 experts par panel » et un expert ne peut
participé qu'a trois propositions du même panel et ne
peut être du même pays d'où vienne cette proposition.
Alors, ma table tbltemp en réalité doit contenir les
champs suivants :
PROP_NUM, Last_name_1, Last_name_2, Last_name_3, PANEL.
Merci pour votre aide.
-----Message d'origine-----
Salut,
Dans ce cas, il me semble, à priori, qu'une procédure
itérative est plus
appropriée. Il s'agit de boucler pour chaque pannel.
Pour un pannel donné,
choisir aléatoirement parmi les experts qui ne sont pas
de la dite ville, et
parmi ceux qui n'ont pas été déjà choisis trois fois:
SELECT TOP 3 experts.expertID
FROM experts
WHERE experts.ville <> villeConsidérée
AND expertID IN ( SELECT assignations.expertID
FROM assignations
GROUP BY
assignations.expertID
HAVING COUNT(*) <3 )
ORDER BY Rnd(len(experts.ville)), expertID
La table assignations est construite comme suit:
Pannel ExpertID 'champs
Elle est initialement vide.
On commence par considérer le premier pannel. La requête
trouve trois
experts, on les ajoute, un par enregistrement, dans la
table asssignations.
Pour le second pannel, la requête fourni encore trois
experts, et on les
ajoute encore, un par enregistrement, à la table des
assignations. Et ainsi
de suite. Le "HAVING COUNT(*) <3" tient compte qu'un
même expert ne peut
pas être sollicité plus de trois fois. Si cette
contrainte n'a pas sa raison
d'être, simplement enlever le " AND expertID IN
(SELECT ... ) ". Une fois
qu'on a bouclé sur tous les pannels, la table des
assignations est remplie.
Comme il est théoriquement possible que deux nombres
aléatoires soient
égaux, j'ai ajouter le champ expertID, dans le ORDER BY,
pour briser toute
égalité possible.
Espérant être utile,
Vanderghast, Access MVP
wrote in message
news:396301c46b18$0c4a2770$
Bonjour,
Merci pour la réponse, mais je vais m'expliqué mieux :
J'ai une table avec des propositions « T_PROPOSALS » avec
les champs suivants :
(PROP_NUM, PROP_PANEL, PROP_COUNTRY)
Une autre table avec des experts « T_EXPERTS » avec les
champs suivants :
(Last_name, PANEL, COUNTRY)
Je voudrai créer une troisième table (random) «
tbltemp »
Pour chaque proposition il faut trois experts « on peut
avoir 100 experts par panel » et un expert ne peut
participé qu'a trois propositions du même panel et ne
peut être du même pays d'où vienne cette proposition.
Alors, ma table tbltemp en réalité doit contenir les
champs suivants :
PROP_NUM, Last_name_1, Last_name_2, Last_name_3, PANEL.
Merci pour votre aide.
-----Message d'origine-----
Salut,
Ce serait plutot dans le genre (code non vérifié)
======================
Dim db As Database : Set db=CurrentDb
On Error Resume Next
db.Execute "DROP TABLE assignations"
On Error Go To 0
db.Execute "CREATE TABLE assignations(Pannel
INTEGER4, ExpertID
INTEGER4)"
' on a une table vide, assignations, qui contiendra,
à la fin, les
assignations des experts
Dim rst as DAO.Recordset
Set rstÛ.OpenRecordset("SELECT DISTINCT pannel,
villeID FROM
proposals", dbOpenForwardOnly, dbReadOnly)
Dim str As string
Do Until rst.Eof
str= "INSERT INTO assignations(Pannel,
ExpertID) " & _
" SELECT TOP 4 " & rst.Fields(0).Value
& " experts.expertID "
& _
" FROM experts " & _
" WHERE experts.villeID <> " &
rst.Fields(1) & _
" AND expertID IN ( SELECT
assignations.ExpertID " & _
" FROM
assignations " & _
" GROUP
BY expertID " & _
" HAVING
COUNT(*) < 5 ) " &
_
" ORDER BY RND(expertID), expertID "
' Debug.Print str
db.Execute str, dbFailOnError
rst.MoveNext
Loop
rst.Close
======================== ===
J'ai supposé que la table proposals avait les
champs Pannel et VilleID,
tous deux numériques (s'ils ne lo sont pas, mofidier les
énoncés SQL en
conséquence); qu'il faut 4 experts par pannel et qu'un
même expert ne peut
pas être sélectionné plus de 5 fois ( de sorte que le 4
et le 5 soit
identifiable, prendre 3 dans les deux cas, si c'est cela
qui convient).
Le résultat final est dans le table assignations.
La ligne en commentaire ' Debug.Print str
peut être utilisée
pour vérifier que l'énoncé SQL est bien formé, si besoin
est.
Je n'ai pas vérifié le code, en exécution.
Espérant être utile,
Vanderghast, Access MVP
wrote in message
news:00df01c46b39$242cf310$
Encore une fois merci, mais je n'arrive pas .
Mon code et le suivant :
Sub PickRandom()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim rst As DAO.Recordset
Dim strSQL As String
Dim strTableName As String
Dim intcount As Integer
strSQL = "SELECT T_PROPOSALS.PROP_NUM, (SELECT TOP 1
Last_name FROM T_EXPERTS " & _
"where
T_PROPOSALS.PROP_PANEL=T_EXPERTS.PANEL ORDER BY Rnd(len
(last_name))) as Last_name " & _
"INTO tblTemp " & _
"FROM T_PROPOSALS " & _
"ORDER BY Rnd(len(PROP_NUM));"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
End Sub
Auriez vous l'amabilité de juste ajouter le « having
count (*) dans le bon endroit ??
Je sais je suis compliqué mais .
D'avance merci.-----Message d'origine-----
Salut,
Dans ce cas, il me semble, à priori, qu'une procédure
itérative est plusappropriée. Il s'agit de boucler pour chaque pannel.
Pour un pannel donné,choisir aléatoirement parmi les experts qui ne sont pas
de la dite ville, etparmi ceux qui n'ont pas été déjà choisis trois fois:
SELECT TOP 3 experts.expertID
FROM experts
WHERE experts.ville <> villeConsidérée
AND expertID IN ( SELECT assignations.expertID
FROM assignations
GROUP BY
assignations.expertIDHAVING COUNT(*) <3 )
ORDER BY Rnd(len(experts.ville)), expertID
La table assignations est construite comme suit:
Pannel ExpertID 'champs
Elle est initialement vide.
On commence par considérer le premier pannel. La requête
trouve troisexperts, on les ajoute, un par enregistrement, dans la
table asssignations.Pour le second pannel, la requête fourni encore trois
experts, et on lesajoute encore, un par enregistrement, à la table des
assignations. Et ainside suite. Le "HAVING COUNT(*) <3" tient compte qu'un
même expert ne peutpas être sollicité plus de trois fois. Si cette
contrainte n'a pas sa raisond'être, simplement enlever le " AND expertID IN
(SELECT ... ) ". Une foisqu'on a bouclé sur tous les pannels, la table des
assignations est remplie.Comme il est théoriquement possible que deux nombres
aléatoires soientégaux, j'ai ajouter le champ expertID, dans le ORDER BY,
pour briser touteégalité possible.
Espérant être utile,
Vanderghast, Access MVP
wrote in message
news:396301c46b18$0c4a2770$
Bonjour,
Merci pour la réponse, mais je vais m'expliqué mieux :
J'ai une table avec des propositions « T_PROPOSALS »
avec
les champs suivants :
(PROP_NUM, PROP_PANEL, PROP_COUNTRY)
Une autre table avec des experts « T_EXPERTS » avec les
champs suivants :
(Last_name, PANEL, COUNTRY)
Je voudrai créer une troisième table (random) «
tbltemp »
Pour chaque proposition il faut trois experts « on peut
avoir 100 experts par panel » et un expert ne peut
participé qu'a trois propositions du même panel et ne
peut être du même pays d'où vienne cette proposition.
Alors, ma table tbltemp en réalité doit contenir les
champs suivants :
PROP_NUM, Last_name_1, Last_name_2, Last_name_3, PANEL.
Merci pour votre aide.
.
-----Message d'origine-----
Salut,
Ce serait plutot dans le genre (code non vérifié)
======================
Dim db As Database : Set db=CurrentDb
On Error Resume Next
db.Execute "DROP TABLE assignations"
On Error Go To 0
db.Execute "CREATE TABLE assignations(Pannel
INTEGER4, ExpertID
INTEGER4)"
' on a une table vide, assignations, qui contiendra,
à la fin, les
assignations des experts
Dim rst as DAO.Recordset
Set rst=db.OpenRecordset("SELECT DISTINCT pannel,
villeID FROM
proposals", dbOpenForwardOnly, dbReadOnly)
Dim str As string
Do Until rst.Eof
str= "INSERT INTO assignations(Pannel,
ExpertID) " & _
" SELECT TOP 4 " & rst.Fields(0).Value
& " experts.expertID "
& _
" FROM experts " & _
" WHERE experts.villeID <> " &
rst.Fields(1) & _
" AND expertID IN ( SELECT
assignations.ExpertID " & _
" FROM
assignations " & _
" GROUP
BY expertID " & _
" HAVING
COUNT(*) < 5 ) " &
_
" ORDER BY RND(expertID), expertID "
' Debug.Print str
db.Execute str, dbFailOnError
rst.MoveNext
Loop
rst.Close
======================== ===
J'ai supposé que la table proposals avait les
champs Pannel et VilleID,
tous deux numériques (s'ils ne lo sont pas, mofidier les
énoncés SQL en
conséquence); qu'il faut 4 experts par pannel et qu'un
même expert ne peut
pas être sélectionné plus de 5 fois ( de sorte que le 4
et le 5 soit
identifiable, prendre 3 dans les deux cas, si c'est cela
qui convient).
Le résultat final est dans le table assignations.
La ligne en commentaire ' Debug.Print str
peut être utilisée
pour vérifier que l'énoncé SQL est bien formé, si besoin
est.
Je n'ai pas vérifié le code, en exécution.
Espérant être utile,
Vanderghast, Access MVP
<anonymous@discussions.microsoft.com> wrote in message
news:00df01c46b39$242cf310$7d02280a@phx.gbl...
Encore une fois merci, mais je n'arrive pas .
Mon code et le suivant :
Sub PickRandom()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim rst As DAO.Recordset
Dim strSQL As String
Dim strTableName As String
Dim intcount As Integer
strSQL = "SELECT T_PROPOSALS.PROP_NUM, (SELECT TOP 1
Last_name FROM T_EXPERTS " & _
"where
T_PROPOSALS.PROP_PANEL=T_EXPERTS.PANEL ORDER BY Rnd(len
(last_name))) as Last_name " & _
"INTO tblTemp " & _
"FROM T_PROPOSALS " & _
"ORDER BY Rnd(len(PROP_NUM));"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
End Sub
Auriez vous l'amabilité de juste ajouter le « having
count (*) dans le bon endroit ??
Je sais je suis compliqué mais .
D'avance merci.
-----Message d'origine-----
Salut,
Dans ce cas, il me semble, à priori, qu'une procédure
itérative est plus
appropriée. Il s'agit de boucler pour chaque pannel.
Pour un pannel donné,
choisir aléatoirement parmi les experts qui ne sont pas
de la dite ville, et
parmi ceux qui n'ont pas été déjà choisis trois fois:
SELECT TOP 3 experts.expertID
FROM experts
WHERE experts.ville <> villeConsidérée
AND expertID IN ( SELECT assignations.expertID
FROM assignations
GROUP BY
assignations.expertID
HAVING COUNT(*) <3 )
ORDER BY Rnd(len(experts.ville)), expertID
La table assignations est construite comme suit:
Pannel ExpertID 'champs
Elle est initialement vide.
On commence par considérer le premier pannel. La requête
trouve trois
experts, on les ajoute, un par enregistrement, dans la
table asssignations.
Pour le second pannel, la requête fourni encore trois
experts, et on les
ajoute encore, un par enregistrement, à la table des
assignations. Et ainsi
de suite. Le "HAVING COUNT(*) <3" tient compte qu'un
même expert ne peut
pas être sollicité plus de trois fois. Si cette
contrainte n'a pas sa raison
d'être, simplement enlever le " AND expertID IN
(SELECT ... ) ". Une fois
qu'on a bouclé sur tous les pannels, la table des
assignations est remplie.
Comme il est théoriquement possible que deux nombres
aléatoires soient
égaux, j'ai ajouter le champ expertID, dans le ORDER BY,
pour briser toute
égalité possible.
Espérant être utile,
Vanderghast, Access MVP
<anonymous@discussions.microsoft.com> wrote in message
news:396301c46b18$0c4a2770$3a01280a@phx.gbl...
Bonjour,
Merci pour la réponse, mais je vais m'expliqué mieux :
J'ai une table avec des propositions « T_PROPOSALS »
avec
les champs suivants :
(PROP_NUM, PROP_PANEL, PROP_COUNTRY)
Une autre table avec des experts « T_EXPERTS » avec les
champs suivants :
(Last_name, PANEL, COUNTRY)
Je voudrai créer une troisième table (random) «
tbltemp »
Pour chaque proposition il faut trois experts « on peut
avoir 100 experts par panel » et un expert ne peut
participé qu'a trois propositions du même panel et ne
peut être du même pays d'où vienne cette proposition.
Alors, ma table tbltemp en réalité doit contenir les
champs suivants :
PROP_NUM, Last_name_1, Last_name_2, Last_name_3, PANEL.
Merci pour votre aide.
.
-----Message d'origine-----
Salut,
Ce serait plutot dans le genre (code non vérifié)
======================
Dim db As Database : Set db=CurrentDb
On Error Resume Next
db.Execute "DROP TABLE assignations"
On Error Go To 0
db.Execute "CREATE TABLE assignations(Pannel
INTEGER4, ExpertID
INTEGER4)"
' on a une table vide, assignations, qui contiendra,
à la fin, les
assignations des experts
Dim rst as DAO.Recordset
Set rstÛ.OpenRecordset("SELECT DISTINCT pannel,
villeID FROM
proposals", dbOpenForwardOnly, dbReadOnly)
Dim str As string
Do Until rst.Eof
str= "INSERT INTO assignations(Pannel,
ExpertID) " & _
" SELECT TOP 4 " & rst.Fields(0).Value
& " experts.expertID "
& _
" FROM experts " & _
" WHERE experts.villeID <> " &
rst.Fields(1) & _
" AND expertID IN ( SELECT
assignations.ExpertID " & _
" FROM
assignations " & _
" GROUP
BY expertID " & _
" HAVING
COUNT(*) < 5 ) " &
_
" ORDER BY RND(expertID), expertID "
' Debug.Print str
db.Execute str, dbFailOnError
rst.MoveNext
Loop
rst.Close
======================== ===
J'ai supposé que la table proposals avait les
champs Pannel et VilleID,
tous deux numériques (s'ils ne lo sont pas, mofidier les
énoncés SQL en
conséquence); qu'il faut 4 experts par pannel et qu'un
même expert ne peut
pas être sélectionné plus de 5 fois ( de sorte que le 4
et le 5 soit
identifiable, prendre 3 dans les deux cas, si c'est cela
qui convient).
Le résultat final est dans le table assignations.
La ligne en commentaire ' Debug.Print str
peut être utilisée
pour vérifier que l'énoncé SQL est bien formé, si besoin
est.
Je n'ai pas vérifié le code, en exécution.
Espérant être utile,
Vanderghast, Access MVP
wrote in message
news:00df01c46b39$242cf310$
Encore une fois merci, mais je n'arrive pas .
Mon code et le suivant :
Sub PickRandom()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim rst As DAO.Recordset
Dim strSQL As String
Dim strTableName As String
Dim intcount As Integer
strSQL = "SELECT T_PROPOSALS.PROP_NUM, (SELECT TOP 1
Last_name FROM T_EXPERTS " & _
"where
T_PROPOSALS.PROP_PANEL=T_EXPERTS.PANEL ORDER BY Rnd(len
(last_name))) as Last_name " & _
"INTO tblTemp " & _
"FROM T_PROPOSALS " & _
"ORDER BY Rnd(len(PROP_NUM));"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
End Sub
Auriez vous l'amabilité de juste ajouter le « having
count (*) dans le bon endroit ??
Je sais je suis compliqué mais .
D'avance merci.-----Message d'origine-----
Salut,
Dans ce cas, il me semble, à priori, qu'une procédure
itérative est plusappropriée. Il s'agit de boucler pour chaque pannel.
Pour un pannel donné,choisir aléatoirement parmi les experts qui ne sont pas
de la dite ville, etparmi ceux qui n'ont pas été déjà choisis trois fois:
SELECT TOP 3 experts.expertID
FROM experts
WHERE experts.ville <> villeConsidérée
AND expertID IN ( SELECT assignations.expertID
FROM assignations
GROUP BY
assignations.expertIDHAVING COUNT(*) <3 )
ORDER BY Rnd(len(experts.ville)), expertID
La table assignations est construite comme suit:
Pannel ExpertID 'champs
Elle est initialement vide.
On commence par considérer le premier pannel. La requête
trouve troisexperts, on les ajoute, un par enregistrement, dans la
table asssignations.Pour le second pannel, la requête fourni encore trois
experts, et on lesajoute encore, un par enregistrement, à la table des
assignations. Et ainside suite. Le "HAVING COUNT(*) <3" tient compte qu'un
même expert ne peutpas être sollicité plus de trois fois. Si cette
contrainte n'a pas sa raisond'être, simplement enlever le " AND expertID IN
(SELECT ... ) ". Une foisqu'on a bouclé sur tous les pannels, la table des
assignations est remplie.Comme il est théoriquement possible que deux nombres
aléatoires soientégaux, j'ai ajouter le champ expertID, dans le ORDER BY,
pour briser touteégalité possible.
Espérant être utile,
Vanderghast, Access MVP
wrote in message
news:396301c46b18$0c4a2770$
Bonjour,
Merci pour la réponse, mais je vais m'expliqué mieux :
J'ai une table avec des propositions « T_PROPOSALS »
avec
les champs suivants :
(PROP_NUM, PROP_PANEL, PROP_COUNTRY)
Une autre table avec des experts « T_EXPERTS » avec les
champs suivants :
(Last_name, PANEL, COUNTRY)
Je voudrai créer une troisième table (random) «
tbltemp »
Pour chaque proposition il faut trois experts « on peut
avoir 100 experts par panel » et un expert ne peut
participé qu'a trois propositions du même panel et ne
peut être du même pays d'où vienne cette proposition.
Alors, ma table tbltemp en réalité doit contenir les
champs suivants :
PROP_NUM, Last_name_1, Last_name_2, Last_name_3, PANEL.
Merci pour votre aide.
.
-----Message d'origine-----
Salut,
Il semble manquer un espace.
"WHERE T_EXPERTS.PANEL = " & rst.Fields(1) & _
"AND " & ...
rst.Fields(1) est alors COLLÉ au "AND"
Le SELECT contient deux champs, Prop_num et l'expert
choici. La table
assignation dans laquelle on déposera ces champs doit
donc, elle également,
avoir deux champs, de même type que les champs choisis,
soit numérique, pour
celui qui correspond à prop_num, et string pour celui
qui correspond à
l'expert ? serait préférable de reférer à son ID
numérique. La table des
Experts possède une clé primaire? elle est numérique
cette clé? ( un
autonumber ferait l'affaire). On a également de besoin
de la VILLE (je ne la
vois plus dans tes tables), et j'imagine que cette table
là possède
également une clé numérique (au lieu d'avoir à
travailler avec le nom et les
délimiteurs alors requis).
db.Execute "CREATE TABLE assignations(Proposal
string, Panel string, Expert1 string, Expert2 string,
Expert3 string)"
ne fait pas l'affaire. Le premier champ attendu, celui
qu'on lui fourni par
le INSERT INTO, est prop_num, numérique, pas string. De
plus on cherche une
solution normalisée où les résultats sont une ligne par
assignation:
prop_num expertChoisi
1010 546601
1010 334512
1010 662456
Il n'y a là que deux champs (tous deux numériques).
On utilisera, par la suite, un crosstab, pour produire
prop_num expert1 expert2 expert3
1010 334512 546601 662456
et, par la suite, des jointures simples pour traduire
les valeurs numériques
en leur correspondants alphanumériques.
Votre SELECT est dans la mauvaise position par rapport
au INSERT. Ma
solution n'était pas acceptable, en effet, il fallait
changer le IN( ) par
un NOT IN( ); on aurait du avoir :
...
" AND ExpertID NOT IN( SELECT ExpertID
FROM Assignations
GROUP BY ExpertID
HAVING COUNT(*)>=3 ) "
au lieu de
...
" AND ExpertID IN( SELECT ExpertID
FROM Assignations
GROUP BY ExpertID
HAVING COUNT(*)<3 ) "
Si les champs sont alphanumériques, au lieu d'être
numériques, il faut
utiliser des délimiteurs lorsqu'on incorpore leur valeur
à un chaîne SQL.
C'est pourquoi je suggère fortement de travailler avec
des clés purement
numériques.
Espérant être utile,
Vanderghast, Access MVP
"Ado" wrote in
message
news:02d401c46e2b$f4ccd450$
Bonjour,
J'ai essayé le code mais ca ne marche toujours pas, voici
le code :
Sub random()
Dim db As DAO.Database: Set db = CurrentDb
On Error Resume Next
db.Execute "DROP TABLE assignations"
db.Execute "CREATE TABLE assignations(Proposal
string, Panel string, Expert1 string, Expert2 string,
Expert3 string)"
Dim rst As DAO.Recordset
Set rst = db.OpenRecordset("SELECT DISTINCT PROP_NUM,
PROP_PANEL, LAST_NAME FROM T_PROPOSALS, T_EXPERTS ",
dbOpenForwardOnly, dbReadOnly)
Dim str As String
Do Until rst.EOF
str = "SELECT " & rst.Fields(0).Value & "
T_EXPERTS.LAST_NAME " & _
"FROM T_EXPERTS " & _
"INSERT INTO assignations " & _
"WHERE T_EXPERTS.PANEL = " & rst.Fields(1) &
_
"AND " & rst.Fields(2).Value & " IN ( SELECT
assignations.Expert " & _
"FROM assignations " & _
"GROUP BY Expert " & _
"HAVING COUNT(*) < 3 ) " & _
"ORDER BY RND(expert_ID), expert_ID; "
DoCmd.RunSQL str
rst.MoveNext
Loop
rst.Close
End Sub
Il me donne une table vide, donc « INSERT INTO » ne
fonctionne pas.
Voici mes deux tables :
T_EXPERTS :
PANEL TITLE LAST_NAME FIRST_NAME
Energy Mr. Blundell Richard
Energy Mr. Chughtai Yaqub
Energy Ms. Coda Beatrice
Energy Prof. Finn Donal
Energy Mr. Kostama Jari
T_PROPOSALS :
PROP_NUM PROP_PANEL
005757 Energy
005943 Energy
006031 Energy
512510 Energy
512519 Energy
L'idée est de donner 3 experts par proposition
appartenant au même panel « expert1<>expert2<>expert3 »
et de définir le nombre maximal des experts dans
l'ensemble de la table « experts < 4 ».
Merci d'avance pour votre aide.
.
-----Message d'origine-----
Salut,
Il semble manquer un espace.
"WHERE T_EXPERTS.PANEL = " & rst.Fields(1) & _
"AND " & ...
rst.Fields(1) est alors COLLÉ au "AND"
Le SELECT contient deux champs, Prop_num et l'expert
choici. La table
assignation dans laquelle on déposera ces champs doit
donc, elle également,
avoir deux champs, de même type que les champs choisis,
soit numérique, pour
celui qui correspond à prop_num, et string pour celui
qui correspond à
l'expert ? serait préférable de reférer à son ID
numérique. La table des
Experts possède une clé primaire? elle est numérique
cette clé? ( un
autonumber ferait l'affaire). On a également de besoin
de la VILLE (je ne la
vois plus dans tes tables), et j'imagine que cette table
là possède
également une clé numérique (au lieu d'avoir à
travailler avec le nom et les
délimiteurs alors requis).
db.Execute "CREATE TABLE assignations(Proposal
string, Panel string, Expert1 string, Expert2 string,
Expert3 string)"
ne fait pas l'affaire. Le premier champ attendu, celui
qu'on lui fourni par
le INSERT INTO, est prop_num, numérique, pas string. De
plus on cherche une
solution normalisée où les résultats sont une ligne par
assignation:
prop_num expertChoisi
1010 546601
1010 334512
1010 662456
Il n'y a là que deux champs (tous deux numériques).
On utilisera, par la suite, un crosstab, pour produire
prop_num expert1 expert2 expert3
1010 334512 546601 662456
et, par la suite, des jointures simples pour traduire
les valeurs numériques
en leur correspondants alphanumériques.
Votre SELECT est dans la mauvaise position par rapport
au INSERT. Ma
solution n'était pas acceptable, en effet, il fallait
changer le IN( ) par
un NOT IN( ); on aurait du avoir :
...
" AND ExpertID NOT IN( SELECT ExpertID
FROM Assignations
GROUP BY ExpertID
HAVING COUNT(*)>=3 ) "
au lieu de
...
" AND ExpertID IN( SELECT ExpertID
FROM Assignations
GROUP BY ExpertID
HAVING COUNT(*)<3 ) "
Si les champs sont alphanumériques, au lieu d'être
numériques, il faut
utiliser des délimiteurs lorsqu'on incorpore leur valeur
à un chaîne SQL.
C'est pourquoi je suggère fortement de travailler avec
des clés purement
numériques.
Espérant être utile,
Vanderghast, Access MVP
"Ado" <anonymous@discussions.microsoft.com> wrote in
message
news:02d401c46e2b$f4ccd450$7d02280a@phx.gbl...
Bonjour,
J'ai essayé le code mais ca ne marche toujours pas, voici
le code :
Sub random()
Dim db As DAO.Database: Set db = CurrentDb
On Error Resume Next
db.Execute "DROP TABLE assignations"
db.Execute "CREATE TABLE assignations(Proposal
string, Panel string, Expert1 string, Expert2 string,
Expert3 string)"
Dim rst As DAO.Recordset
Set rst = db.OpenRecordset("SELECT DISTINCT PROP_NUM,
PROP_PANEL, LAST_NAME FROM T_PROPOSALS, T_EXPERTS ",
dbOpenForwardOnly, dbReadOnly)
Dim str As String
Do Until rst.EOF
str = "SELECT " & rst.Fields(0).Value & "
T_EXPERTS.LAST_NAME " & _
"FROM T_EXPERTS " & _
"INSERT INTO assignations " & _
"WHERE T_EXPERTS.PANEL = " & rst.Fields(1) &
_
"AND " & rst.Fields(2).Value & " IN ( SELECT
assignations.Expert " & _
"FROM assignations " & _
"GROUP BY Expert " & _
"HAVING COUNT(*) < 3 ) " & _
"ORDER BY RND(expert_ID), expert_ID; "
DoCmd.RunSQL str
rst.MoveNext
Loop
rst.Close
End Sub
Il me donne une table vide, donc « INSERT INTO » ne
fonctionne pas.
Voici mes deux tables :
T_EXPERTS :
PANEL TITLE LAST_NAME FIRST_NAME
Energy Mr. Blundell Richard
Energy Mr. Chughtai Yaqub
Energy Ms. Coda Beatrice
Energy Prof. Finn Donal
Energy Mr. Kostama Jari
T_PROPOSALS :
PROP_NUM PROP_PANEL
005757 Energy
005943 Energy
006031 Energy
512510 Energy
512519 Energy
L'idée est de donner 3 experts par proposition
appartenant au même panel « expert1<>expert2<>expert3 »
et de définir le nombre maximal des experts dans
l'ensemble de la table « experts < 4 ».
Merci d'avance pour votre aide.
.
-----Message d'origine-----
Salut,
Il semble manquer un espace.
"WHERE T_EXPERTS.PANEL = " & rst.Fields(1) & _
"AND " & ...
rst.Fields(1) est alors COLLÉ au "AND"
Le SELECT contient deux champs, Prop_num et l'expert
choici. La table
assignation dans laquelle on déposera ces champs doit
donc, elle également,
avoir deux champs, de même type que les champs choisis,
soit numérique, pour
celui qui correspond à prop_num, et string pour celui
qui correspond à
l'expert ? serait préférable de reférer à son ID
numérique. La table des
Experts possède une clé primaire? elle est numérique
cette clé? ( un
autonumber ferait l'affaire). On a également de besoin
de la VILLE (je ne la
vois plus dans tes tables), et j'imagine que cette table
là possède
également une clé numérique (au lieu d'avoir à
travailler avec le nom et les
délimiteurs alors requis).
db.Execute "CREATE TABLE assignations(Proposal
string, Panel string, Expert1 string, Expert2 string,
Expert3 string)"
ne fait pas l'affaire. Le premier champ attendu, celui
qu'on lui fourni par
le INSERT INTO, est prop_num, numérique, pas string. De
plus on cherche une
solution normalisée où les résultats sont une ligne par
assignation:
prop_num expertChoisi
1010 546601
1010 334512
1010 662456
Il n'y a là que deux champs (tous deux numériques).
On utilisera, par la suite, un crosstab, pour produire
prop_num expert1 expert2 expert3
1010 334512 546601 662456
et, par la suite, des jointures simples pour traduire
les valeurs numériques
en leur correspondants alphanumériques.
Votre SELECT est dans la mauvaise position par rapport
au INSERT. Ma
solution n'était pas acceptable, en effet, il fallait
changer le IN( ) par
un NOT IN( ); on aurait du avoir :
...
" AND ExpertID NOT IN( SELECT ExpertID
FROM Assignations
GROUP BY ExpertID
HAVING COUNT(*)>=3 ) "
au lieu de
...
" AND ExpertID IN( SELECT ExpertID
FROM Assignations
GROUP BY ExpertID
HAVING COUNT(*)<3 ) "
Si les champs sont alphanumériques, au lieu d'être
numériques, il faut
utiliser des délimiteurs lorsqu'on incorpore leur valeur
à un chaîne SQL.
C'est pourquoi je suggère fortement de travailler avec
des clés purement
numériques.
Espérant être utile,
Vanderghast, Access MVP
"Ado" wrote in
message
news:02d401c46e2b$f4ccd450$
Bonjour,
J'ai essayé le code mais ca ne marche toujours pas, voici
le code :
Sub random()
Dim db As DAO.Database: Set db = CurrentDb
On Error Resume Next
db.Execute "DROP TABLE assignations"
db.Execute "CREATE TABLE assignations(Proposal
string, Panel string, Expert1 string, Expert2 string,
Expert3 string)"
Dim rst As DAO.Recordset
Set rst = db.OpenRecordset("SELECT DISTINCT PROP_NUM,
PROP_PANEL, LAST_NAME FROM T_PROPOSALS, T_EXPERTS ",
dbOpenForwardOnly, dbReadOnly)
Dim str As String
Do Until rst.EOF
str = "SELECT " & rst.Fields(0).Value & "
T_EXPERTS.LAST_NAME " & _
"FROM T_EXPERTS " & _
"INSERT INTO assignations " & _
"WHERE T_EXPERTS.PANEL = " & rst.Fields(1) &
_
"AND " & rst.Fields(2).Value & " IN ( SELECT
assignations.Expert " & _
"FROM assignations " & _
"GROUP BY Expert " & _
"HAVING COUNT(*) < 3 ) " & _
"ORDER BY RND(expert_ID), expert_ID; "
DoCmd.RunSQL str
rst.MoveNext
Loop
rst.Close
End Sub
Il me donne une table vide, donc « INSERT INTO » ne
fonctionne pas.
Voici mes deux tables :
T_EXPERTS :
PANEL TITLE LAST_NAME FIRST_NAME
Energy Mr. Blundell Richard
Energy Mr. Chughtai Yaqub
Energy Ms. Coda Beatrice
Energy Prof. Finn Donal
Energy Mr. Kostama Jari
T_PROPOSALS :
PROP_NUM PROP_PANEL
005757 Energy
005943 Energy
006031 Energy
512510 Energy
512519 Energy
L'idée est de donner 3 experts par proposition
appartenant au même panel « expert1<>expert2<>expert3 »
et de définir le nombre maximal des experts dans
l'ensemble de la table « experts < 4 ».
Merci d'avance pour votre aide.
.
-----Message d'origine-----
Salut,
Le recordset rst retourne deux champs, mais toujours
pas de ville? Ne
devrait-il pas être:
Set rst = db.OpenRecordset("SELECT DISTINCT prop_ID,
Ville_ID FROM T_proposals",
dbOpenForwardOnly, dbReadOnly)
Je ne vois pas pourquoi il faut avoir la table des
experts. L'idée est
d'avoir chaque proposal, avec la ville où il a lieu,
comme dans ma
suggestion initiale:
Dim rst as DAO.Recordset
Set rstÛ.OpenRecordset("SELECT DISTINCT pannel,
villeID FROM
proposals", dbOpenForwardOnly, dbReadOnly)
Il n'y a pas d'expert impliqué, jusqu'à là. Les experts
ne sont impliqués
que dans la boucle:
La syntaxe pour insérer des nouveaux enregistrements
est erronnée. C'est
INSERT ... SELECT ... , pas SELECT ... INSERT ... De
plus, comme c'est
supposé être le second champ de rst, rst.fields(1), qui
retourne la ville du
proposal:
str= "INSERT INTO assignations(Pannel, ExpertID) "
& _
" SELECT TOP 3 " & rst.Fields(0).Value & "
experts.expertID " & _
" FROM experts " & _
" WHERE experts.villeID <> " & rst.Fields
(1).Value & _ ...
il n'y a que la table des experts, et NON PAS la table
proposal. Tout ce qui
concernait les proposal est évacué de la clause FROM,
car sa controbution
est déjà incluse dans rst.Fields(0) et rst.Fields(1)
Si on reprend vos noms de tables, ce serait:
str="INSERT INTO assignations " & _
" SELECT TOP 3 " & rst.Fields(0).Value & _
" , Expert_id " &
_
" FROM T_EXPERTS " & _
" WHERE villeID <> " & rst.Fields(1).Value
& _
" AND EXPERT_ID NOT IN ( SELECT
Expert_id " & _
" FROM
assignations " & _
" GROUP BY
Expert_ID " & _
" HAVING COUNT
(*) >= 3 ) " & _
" ORDER BY RND
(expert_ID),
experts_ID " & _
" ) "
Espérant être utile,
Vanderghast, Access MVP
.
-----Message d'origine-----
Salut,
Le recordset rst retourne deux champs, mais toujours
pas de ville? Ne
devrait-il pas être:
Set rst = db.OpenRecordset("SELECT DISTINCT prop_ID,
Ville_ID FROM T_proposals",
dbOpenForwardOnly, dbReadOnly)
Je ne vois pas pourquoi il faut avoir la table des
experts. L'idée est
d'avoir chaque proposal, avec la ville où il a lieu,
comme dans ma
suggestion initiale:
Dim rst as DAO.Recordset
Set rst=db.OpenRecordset("SELECT DISTINCT pannel,
villeID FROM
proposals", dbOpenForwardOnly, dbReadOnly)
Il n'y a pas d'expert impliqué, jusqu'à là. Les experts
ne sont impliqués
que dans la boucle:
La syntaxe pour insérer des nouveaux enregistrements
est erronnée. C'est
INSERT ... SELECT ... , pas SELECT ... INSERT ... De
plus, comme c'est
supposé être le second champ de rst, rst.fields(1), qui
retourne la ville du
proposal:
str= "INSERT INTO assignations(Pannel, ExpertID) "
& _
" SELECT TOP 3 " & rst.Fields(0).Value & "
experts.expertID " & _
" FROM experts " & _
" WHERE experts.villeID <> " & rst.Fields
(1).Value & _ ...
il n'y a que la table des experts, et NON PAS la table
proposal. Tout ce qui
concernait les proposal est évacué de la clause FROM,
car sa controbution
est déjà incluse dans rst.Fields(0) et rst.Fields(1)
Si on reprend vos noms de tables, ce serait:
str="INSERT INTO assignations " & _
" SELECT TOP 3 " & rst.Fields(0).Value & _
" , Expert_id " &
_
" FROM T_EXPERTS " & _
" WHERE villeID <> " & rst.Fields(1).Value
& _
" AND EXPERT_ID NOT IN ( SELECT
Expert_id " & _
" FROM
assignations " & _
" GROUP BY
Expert_ID " & _
" HAVING COUNT
(*) >= 3 ) " & _
" ORDER BY RND
(expert_ID),
experts_ID " & _
" ) "
Espérant être utile,
Vanderghast, Access MVP
.
-----Message d'origine-----
Salut,
Le recordset rst retourne deux champs, mais toujours
pas de ville? Ne
devrait-il pas être:
Set rst = db.OpenRecordset("SELECT DISTINCT prop_ID,
Ville_ID FROM T_proposals",
dbOpenForwardOnly, dbReadOnly)
Je ne vois pas pourquoi il faut avoir la table des
experts. L'idée est
d'avoir chaque proposal, avec la ville où il a lieu,
comme dans ma
suggestion initiale:
Dim rst as DAO.Recordset
Set rstÛ.OpenRecordset("SELECT DISTINCT pannel,
villeID FROM
proposals", dbOpenForwardOnly, dbReadOnly)
Il n'y a pas d'expert impliqué, jusqu'à là. Les experts
ne sont impliqués
que dans la boucle:
La syntaxe pour insérer des nouveaux enregistrements
est erronnée. C'est
INSERT ... SELECT ... , pas SELECT ... INSERT ... De
plus, comme c'est
supposé être le second champ de rst, rst.fields(1), qui
retourne la ville du
proposal:
str= "INSERT INTO assignations(Pannel, ExpertID) "
& _
" SELECT TOP 3 " & rst.Fields(0).Value & "
experts.expertID " & _
" FROM experts " & _
" WHERE experts.villeID <> " & rst.Fields
(1).Value & _ ...
il n'y a que la table des experts, et NON PAS la table
proposal. Tout ce qui
concernait les proposal est évacué de la clause FROM,
car sa controbution
est déjà incluse dans rst.Fields(0) et rst.Fields(1)
Si on reprend vos noms de tables, ce serait:
str="INSERT INTO assignations " & _
" SELECT TOP 3 " & rst.Fields(0).Value & _
" , Expert_id " &
_
" FROM T_EXPERTS " & _
" WHERE villeID <> " & rst.Fields(1).Value
& _
" AND EXPERT_ID NOT IN ( SELECT
Expert_id " & _
" FROM
assignations " & _
" GROUP BY
Expert_ID " & _
" HAVING COUNT
(*) >= 3 ) " & _
" ORDER BY RND
(expert_ID),
experts_ID " & _
" ) "
Espérant être utile,
Vanderghast, Access MVP
.