Tri aléatoire SQL en mémoire ?

stephane_br Messages postés 26 Date d'inscription   Statut Membre Dernière intervention   -  
stephane_br Messages postés 26 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

je travaille sur un site développé en ASP et j'ai besoin d'aide pour un souci assez particulier. En effet, je n'ai pas trouvé de solution sur le net jusque là et je sèche un peu en fait.

Je dois lister le résultat d'une requête SQL (base hébergée sur un SQL serveur 2008) sur la page d'un site (en ASP) avec une pagination.
Ma requête SQL est appelée à la suite d'une recherche demandée par l'internaute qui a choisi au préalable plusieurs critères. (choix d'un thème, d'une région, d'un nom etc ....)
Jusque là, pas de souci, tout fonctionne. Le moteur de recherche est fonctionnel.

Bon mais on me demande maintenant de modifier le moteur en rajoutant un tri aléatoirement sur le résultat de la requête. Pas de souci, je rajoute un ORDER BY NEWID() dans ma requête SQL et tout fonctionne.

Cependant, mon problème est que maintenant, lorsque l'on clique sur un numéro de page, la page se recharge pour afficher la page demandée et par conséquent ma requête aléatoire est de nouveau exécutée, ce qui a pour effet de provoquer l'apparition de doublons dans les différentes pages ASP du résultat.

Est-il possible de mettre en mémoire le résultat de ma requête lors du premier appel de façon à pouvoir y travailler dessus dans ma pagination ?
J'ai vu qu'avec MYSQL/PHP la fonction RAND(x) permettait de faire un tri aléatoire selon la valeur de x ce qui serait bien pratique pour moi mais je n'ai pas trouver d'équivalence chez Microsoft avec SQL SERVEUR 2008 et ASP.

Peut être y a t-il une manière plus simple de réaliser tout ça ? Avec des iframe ou des includes ..... ou des divs masqués peut être ?

merci pour vos réponses ...

1 réponse

stephane_br Messages postés 26 Date d'inscription   Statut Membre Dernière intervention   37
 
Bon, au final, je me suis débrouillé mais en trichant un peu. Cependant je pouvais le faire car les éléments qui remontent lors de la requête ne sont pas très nombreux car je pense que si ce n'était pas le cas, cela pourrait être peut être problématique ....

Bref, donc en fait, j'ai ma requête qui remonte au chargement de la page en mode aléatoire.
A l'affichage, j'ai mis un bloc div qui entoure chaque élément de la liste avec un ID différent à chaque fois (j'incrémente une valeur en commençant à 1) :
<div id="blocElt1">....</div>
<div id="blocElt2">....</div>
<div id="blocElt3">....</div>

...etc...

J'ai également mis des liens pour la pagination qui appelle une fonction en javascript qui me masque tous les div et m'affiche ensuite ceux correspondants à la page demandée. Pour chaque lien, je lui attribue aussi un id différent à chaque fois de manière à pouvoir le contrôler sa classe en javascript pour le mettre en gras selon la page qui est affichée :
<a href='javascript:ChargerPage(1);' class='lienNavPagesON' id='LienPagination1'>1</a>
<span class='TexteNavPages'>|</span> <a href='javascript:ChargerPage(2);' class='lienNavPages' id='LienPagination2'>2</a>


Ma fonction (certaines valeurs proviennent de mon code ASP/vbscript) :
function ChargerPage(numPage) { 
	
	var NumeroPage = new Number(numPage);
	var TotalNbPages = new Number(<%=intNbPagesAuTotal%>);
	var TotalElements = new Number(<%=intNbRestaurantsFound%>);
	var NbElementPerPage = new Number(<%=intNbStrucPerPage%>);
	var NbSoustract = new Number((NbElementPerPage-1));
    
	var NumElementLast = new Number((NumeroPage*NbElementPerPage));
	var NumElementDeb = new Number((NumElementLast-NbSoustract));
	if (NumElementLast>TotalElements) {
		NumElementLast = TotalElements;
	}
	
	//Mise en avant du numéro de la page active //LienPagination
	for (p=1;p<=TotalNbPages;p++) {
		 
		 var objLien = document.getElementById('LienPagination'+p);
		 
		 if (p==NumeroPage) {
		 	objLien.className = 'lienNavPagesON';
		 } else {
		 	objLien.className = 'lienNavPages';
		 }
	}

	//Affichage des produits de la page demandée..
	for (i=1;i<=TotalElements;i++) {
		if ((i>=NumElementDeb)&&(i<=NumElementLast)) {
			afficheId('<%=strNomDesDivsPourPagination%>'+i);
		} else {
			cacheId('<%=strNomDesDivsPourPagination%>'+i);
		}
	}
	
}



Et le tour est joué. La page n'est donc plus rechargée, tout est dans la page et c'est le javascript qui m'affiche grâce aux blocs <div> les bons éléments selon la page choisie.

Il y a peut être mieux mais c'est la solution que j'ai pu mettre en place le plus rapidement.
0