Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Langages serveur > ASP
ASP Forum sur la programmation ASP. Avant de poster : Cours ASP, FAQ ASP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/06/2011, 11h18   #1
Invité de passage
 
Inscription : juin 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 13
Points : 2
Points : 2
Par défaut Faire une requete a partir d'un recordset

Bonjour à toute la communauté,

Apres avoir passé du temps à chercher ma réponse a travers le net, je me tourne vers vous pour tenter de résoudre, mais surtout comprendre mon probleme.

Tout d'abord, je tiens a préciser que je suis un grand débutant, et que je tente d'apprendre par moi même => le code est peut etre un peu "crade" et pas forcément bien structuré, veuillez m'en excuser.

Rentrons dans le vif du sujet si vous le voulez bien.

Je me connecte donc a ma DB (j'ai un fichier global.asa pour ça )

Ensuite, je fais une premiere requete sur ma base pour lister et ordonner les valeurs dans un tableau HTML

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Dim tablo(200,6)
dim z
dim secteur1
dim secteur
dim nbentry
 
set conn=server.CreateObject("ADODB.connection")
conn.open Application("Connectionbase")
set rst=server.CreateObject("ADODB.recordset")
 
sql = "Select * From ATCLISTE"
rst.Open sql,conn,3,1
 
 
 
z= 1 
 
nbentry = 0
 
do while rst.EOF=false
 
	tablo(Z,1) = rst.fields("ATCNom").value
		tablo(Z,2) = rst.fields("ATCPrenom").value
		tablo(Z,3) = rst.fields("ATCCode").value
		tablo(Z,4) = rst.fields("ATCTel").value
		tablo(Z,5) = rst.fields("ATCMachine").value
		tablo(Z,6) = rst.fields("Secteur").value
 
 
	secteur1 =  tablo(Z,6)
	nbentry = nbentry + 1
z = z + 1 
rst.movenext
 
loop
Jusqu'ici, aucun souci (l'affichage se fait a la fin de ma page asp tout est ok donc je ne l'afficherai pas ici pour gagner du temps)

Suite à ceci, c'est là qu'intervient mon problème : je souhaite faire une deuxieme requete sur ma base à partir des résultat que je viens d'avoir et que j'ai stocké dans un tableau.

Concretement, j'ai des valeurs dans la derniere colonne de mon tableau, qui sont associées à des noms dans une autre table.

Je voudrai donc pouvoir faire un "Select SECNom From SECListe Where Secteur = '" & secteur1 & "'" et ainsi afficher le nom correspondant au nombre (ceci pour but d'éviter les case ou if...else if.

Si je n'ai pas été assez clair (voire pas du tout :p) merci de me le signaler.

Je vous remercie par avance pour toutes les réponses que vous pourrez m'apporter.
Tyalie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 11h28   #2
Membre expérimenté
 
Avatar de tumoo
 
Homme
Développeur informatique
Inscription : janvier 2011
Messages : 309
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France, Charente Maritime (Poitou Charente)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2011
Messages : 309
Points : 550
Points : 550
Salut,

Tu veux chaque SECNom pour chaque secteur1 ?
tumoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 11h33   #3
Invité de passage
 
Inscription : juin 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 13
Points : 2
Points : 2
Exactement, sachant que SECNom se trouve sur une table différente de ma premiere requête.

1ere requete => Table = ATCListe
2eme requete => Table = SECLISTE
Tyalie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 11h39   #4
Membre expérimenté
 
Avatar de tumoo
 
Homme
Développeur informatique
Inscription : janvier 2011
Messages : 309
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France, Charente Maritime (Poitou Charente)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2011
Messages : 309
Points : 550
Points : 550
Pourquoi ne pas faire une deuxième requête avec une jointure entre ATCLISTE et SECLISTE ?

Code ASP :
1
2
3
4
5
 
tarequete="SELECT SECNom from SECLISTE ATC right outer join ATCLISTE SEC on ATC.Secteur = SEC.Secteur"
 
set rsNomSec=server.CreateObject("ADODB.recordset")
rsNomSec.Open tarequete,conn,3,1

Ainsi tu as le nom te chaque Secteur pour chaque secteur de ATCListe
tumoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 11h40   #5
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 805
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 805
Points : 3 003
Points : 3 003
Bonjour,

A mon avis, la solution est de ne faire qu'une seule requête avec une jointure entre tes deux tables.

Citation:
On a du se croiser à quelques secondes !
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 12h12   #6
Invité de passage
 
Inscription : juin 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 13
Points : 2
Points : 2
Je fini de gérer mon intervention et je teste ça ensuite. Merci en tous cas pour vos réponses rapides.

Je me renseigne également en parallèle sur les jointures que je ne maitrise mais alors absolument pas du tout...
Tyalie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 14h33   #7
Invité de passage
 
Inscription : juin 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 13
Points : 2
Points : 2
Alors je me retrouve cette fois ci avec un BOF or EOF = true ou bien le RS a été supprimé.

Pas de set rs = nothing en vue.

J'ai fait cette requete, apres avoir lu les jointure :

Code :
req2 = "select SECNom From SECLISTE INNER JOIN ATCLISTE ON SECLISTE.Secteur = ATCLISTE.Secteur WHERE ATCLISTE.Secteur = "
Je l'ai lancée dans SQL Server directement, elle me ressort le bon résulat, c'est déjà un bon point.

Le souci, c'est qu'en ne faisant qu'une seule requete, comme préconisé par pc75, je n'aurais à ma disposition que SECnom, hors je souhaite également afficher le contenu de ma table ATCLISTE.

A quel moment dois-je donc placer cette requete? Au tout début du code, en suivant la premiere requete
Code :
1
2
3
4
 set rst=server.CreateObject("ADODB.recordset")
 
sql = "Select * From ATCLISTE"
rst.Open sql,conn,3,1
ou bien a la fin de mon loop qui m'a servi a stocker le RS dans un tableau , ou un simple req2.execute suffirait?
Tyalie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 14h56   #8
Invité de passage
 
Inscription : juin 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 13
Points : 2
Points : 2
Voila, je viens en fin de compte de me creuser les méninges un peu plus pour arriver à avoir mon resultat escompté.

je link ici le code, si jamais ça peut servir, mais Tumoo et PC75 (que je remercie pour leur aide!) ont déjà dit le principal.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 <%
 
Dim tablo(200,6)
Dim tableau(200,1)
dim z
dim secteur1
dim secteura
dim nbentry
 
set conn=server.CreateObject("ADODB.connection")
conn.open Application("Connectionbase")
 
sql = "SELECT * FROM ATCLISTE LEFT outer JOIN SECLISTE ON SECLISTE.Secteur = ATCLISTE.ATCSecteur"
set rst=server.CreateObject("ADODB.recordset")
rst.Open sql,conn,3,1
 
 
sql2 = "SELECT SECNom from SECLISTE ATC right outer join ATCLISTE SEC on ATC.Secteur = SEC.ATCSecteur"
set rsNomSec=server.createobject("ADODB.recordset")
rsNomSec.Open sql2,conn,3,1
 
z = 1
 
do while rsNomSec.EOF=false
 
	tableau(Z,1) = rsNomSec.fields("SECNom").value
 
z = z + 1
rsNomSec.movenext
 
loop
 
 
z= 1 
 
nbentry = 0
 
do while rst.EOF=false
 
	tablo(Z,1) = rst.fields("ATCNom").value
		tablo(Z,2) = rst.fields("ATCPrenom").value
		tablo(Z,3) = rst.fields("ATCCode").value
		tablo(Z,4) = rst.fields("ATCTel").value
		tablo(Z,5) = rst.fields("ATCMachine").value
		tablo(Z,6) = rst.fields("ATCSecteur").value
 
	nbentry = nbentry + 1
z = z + 1 
rst.movenext
 
loop
 
rst.close
set rst = nothing
 
rsNomSec.close
set rsNomSec = nothing
 
conn.Close
set conn = nothing
 
 
%>
Il y a peut etre encore plus simple et une seule requete peut sans doute fonctionner, mais je n'ai pas encore le niveau pour faire cela. Ceci étant dit, cette requete fonctionne, et j'ai découvert l'utilié de la jointure (mieux vaut tard que jamais ...)
Tyalie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 14h58   #9
Membre expérimenté
 
Avatar de tumoo
 
Homme
Développeur informatique
Inscription : janvier 2011
Messages : 309
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France, Charente Maritime (Poitou Charente)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2011
Messages : 309
Points : 550
Points : 550
Tu peux faire ça en une seule requête quand même et c'est mieux je pense.

En fait, tu veux un résultat de ce type ?

ATCNom ATCPrenom ATCCode ATCTel ATCMachine NomSecteur
----------------------------------------------------------------------


avec les 5 premières colonnes provenant de ATCListe et la dernière est le nom du secteur provenant de SECListe, c'est bien ça ?

Est ce que chaque ATC.Secteur a un nom qui lui correspond ?
C'est à dire, peut-il y avoir un numéro de secteur qui n'a pas de nom dans la table SECListe ?

Si chaque secteur a un nom, alors tu peux utiliser un INNER JOIN, sinon, il te faut un OUTER JOIN.

Ta requête sera alors
Code SQL :
1
2
3
4
5
6
 
SELECT A.ATCNom, A.ATCPrenom, A.ATCCode, A.ATCTel, A.ATCMachine, S.NomSecteur
FROM ATCLISTE A
INNER JOIN
SECLISTE S
ON A.Secteur = S.Secteur

(INNER JOIN ou LEFT OUTER JOIN en fonction de ma question précédente.)


Ta requête, tu la places avant ton WHILE.
Pour parcourir son résultat, tu tests s'il y a des enregistrements
Code :
1
2
3
4
5
6
7
8
9
 
if rst.RecordCount<>0 then
    do while not rst.EOF
 
        tes instructions
 
    rst.MoveNext
    loop
end if
Tu peux récupérer plus simplement les valeur de chaque enregistrement. Au lieu d'utiliser rst.fields("ATCPrenom").value, tu peux simplement utiliser rst("ATCPrenom"), voire même rst(1) (la 2ème colonne de mon select, la 1ere commençant à 1)

Je pense que là tu as tout ^^
tumoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 15h46   #10
Invité de passage
 
Inscription : juin 2011
Messages : 13
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 13
Points : 2
Points : 2
Impeccable Tumoo, pas forcément facile de faire comprendre aux autres ce que l'on cherche à obtenir.

En effet, j'ai bien compris que l'inner est plus pratique lorsque j'ai aucune valeur en NULL dans ma table à "jointer"

Merci également pour l'astuce du rst(x) qui est bien plus pratique!
Tyalie est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h45.


 
 
 
 
Partenaires

Hébergement Web