OVH Cloud OVH Cloud

Random

10 réponses
Avatar
Ado
Bonjours =E0 tous,

J'aurai besoin d'un petit coup de main sur une petite=20
histoire de hasard.

J'ai 2 tables :
1=E9re table contient : n=B0 de dossier, ville, . =AB 2=20
dossiers =BB
2=E9me table contient : nom du professeur, ville, . =AB 7=20
professeurs =BB

J'aurai besoin d'une ligne de commande =AB command button=20
click =BB pour que le system me propose au hasard 3=20
professeurs par dossier ou les villes ne correspondent=20
pas l'une avec l'autre.=20

Merci pour votre aide.

10 réponses

Avatar
Michel Walsh
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.
Avatar
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" 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.


.



Avatar
Michel Walsh
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 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.


.



Avatar
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



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


.




.




Avatar
Michel Walsh
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 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.



Avatar
Ado
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,


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




.




Avatar
Michel Walsh
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.
Avatar
Ado
J'ai fait comme vous le dites dans votre message mais
cela me donne une table vide.

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_id
integer4, Experts_id integer4)"
Dim rst As DAO.Recordset
Set rst = db.OpenRecordset("SELECT DISTINCT PROP_ID,
EXPERT_ID FROM T_PROPOSALS, T_EXPERTS ",
dbOpenForwardOnly, dbReadOnly)
Dim str As String
Do Until rst.EOF
str = "SELECT " & rst.Fields(0).Value & "
T_EXPERTS.EXPERT_ID " & _
"FROM T_EXPERTS " & _
"INSERT INTO assignations " & _
"WHERE T_EXPERTS.PANEL =
T_PROPOSALS.PROP_PANEL " & _
"AND EXPERT_ID NOT IN ( SELECT Expert_id " & _
"FROM assignations " & _
"GROUP BY Expert_ID " & _
"HAVING COUNT(*) >= 3 ) " & _
"ORDER BY RND(expert_ID), experts_ID; "

DoCmd.RunSQL str
rst.MoveNext
Loop
rst.Close
End Sub

Merci d'avance
-----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.



.



Avatar
Michel Walsh
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
Avatar
Ado
Bonjour,

D'abord merci pour l'aide que vous avez apporté à mon
sujet.

Finalement j'ai opté pour une autre procédure, et j'aurai
une question supplémentaire d'abord voici mon code :

strSQL = "SELECT T_PROPOSALS.PROP_NUM,
T_PROPOSALS.PROP_PANEL, T_PROPOSALS.COUNTRY_CODE, " & _
"( SELECT TOP 1 E1.LAST_NAME FROM T_EXPERTS
E1 " & _
"WHERE E1.COUNTRY <>
T_PROPOSALS.COUNTRY_CODE " & _
"AND E1.PANEL = T_PROPOSALS.PROP_PANEL "
& _
"GROUP BY E1.LAST_NAME " & _
"HAVING COUNT (*) < 3 " & _
"ORDER BY Rnd(Len(E1.LAST_NAME))) AS
EXPERT1, " & _
"( SELECT TOP 1 E2.LAST_NAME FROM
T_EXPERTS E2 " & _
"WHERE E2.COUNTRY <>
T_PROPOSALS.COUNTRY_CODE " & _
"AND E2.PANEL =
T_PROPOSALS.PROP_PANEL " & _
"GROUP BY E2.LAST_NAME " & _
"HAVING COUNT (*) < 3 " & _
"ORDER BY Rnd(Len(E2.LAST_NAME))) AS
EXPERT2, " & _
"( SELECT TOP 1 E3.LAST_NAME FROM
T_EXPERTS E3 " & _
"WHERE E3.COUNTRY <>
T_PROPOSALS.COUNTRY_CODE " & _
"AND E3.PANEL =
T_PROPOSALS.PROP_PANEL " & _
"GROUP BY E3.LAST_NAME " & _
"HAVING COUNT (*) < 3 " & _
"ORDER BY Rnd(Len(E3.LAST_NAME)))
AS EXPERT3 " & _
"INTO tblTemp " & _
"FROM T_PROPOSALS " & _
"ORDER BY T_PROPOSALS.PROP_NUM;"

Ma question est :

Comment faire pour que : l'expert1 <> l'expert2 <>
l'expert3 et de définir le nombre maximale d'expert dans
la table entière.

D'avance merci

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


.