Bonjour,
Bon, je soumets mon problème dans un topic, parce que là, je m'enlise en fait.
J'explique (Je travaille en ASP donc, avec SqlServer 2000 derrière, serveur IIS évidemment).
J'ai une table dans ma bd, qui s'appelle Descripteur_Valeur. Elle sert à décrire deux types d'entités, les Granules et Manuels. Les manuels peuvent être composés de granules et des manuels, et les granules peuvent être composés de granules (des sous-granules en fait, mais pour le code, c'est la même chose).
Elle a la structure suivante :
Descripteur_Valeur
Numero (Le numero du granule ou du manuel)
NomDescripteur (ben ça peut être Titre, Sujet, Date de création, Mots-Clefs, etc, etc)
Valeur (La valeur du descripteur donc)
TypeValeur (Indique s'il s'agit d'un Granule ou d'un Manuel, il peut donc prendre deux valeurs, Granule ou Manuel)
Ordre (Ne sert que pour le descripteur Parent...)
Valide (pour savoir si un granule ou manuel est en cours de création, et s'il a été validé ou non... Il n'apparaît à l'user final que s'il a ce champ à 1)
Obligatoire(Il y a quelques descripteurs obligatoires : Titre, Sujet, Date de création, Mots-Clefs, n° Version, les autres sont facultatifs)
Je dois faire une recherche avec des champs personnalisés, uniquement sur cette table.
Voici un aperçu (non trié du contenu de ma table, les colonnes dans l'ordre indiqué plus haut.
1 Auteur Benjamin GRISTI Granule 0 1 1
1 Auteur Benjamin GRISTI Manuel 0 1 1
1 Date de création 21/10/2005 16:07:10 Granule 0 1 1
1 Date de création 21/10/2005 16:28:13 Manuel 0 1 1
1 Dernière modific.. 21/10/2005 16:28:59 Manuel 0 0 1
1 Mots-Clefs au revoir Granule 0 1 1
1 Mots-Clefs beta version Manuel 0 1 1
1 Mots-Clefs bonjour Granule 0 1 1
1 Mots-Clefs bonjour Manuel 0 1 1
1 Mots-Clefs essai Manuel 0 1 1
1 Mots-Clefs joli Granule 0 1 1
1 Mots-Clefs nouveau Granule 0 1 1 |
Voici un screenshot de ma page de recherche :
Donc ma recherche permet d'ajouter des champs de recherche, en fonction de ceux existant dans la base (dans mon exemple, il n'y a que des champs obligatoires, mais la recherche sera permis sur tous les Descripteurs existant dans la base.
Le + dans un champ de recherche permet la recherche de plusieurs valeurs d'un descripteur (1+2 dans le champ numéro permet de rechercher le granule 1 et le granule 2).
Ah au fait, la recherche, ici, ne concerne que les granules.
Voici donc, en asp, mon code permettant de générer la requete...
'Recupérer le tableau avec les champs de recherche rajoutés
TabDesc = Split(PreparePourBdd(Request.Form("listnewdesc" )), "," )
NbDesc = UBound(TabDesc)
'Le champ mots-clefs
TabMots = Split(Trim(MotsClefs), "+" )
NbMots = UBound(TabMots)
'Le champ numéro TabNum = Split(Trim(Numero), "+" )
NbNum = UBound(TabNum)
'La requete de base
Requete = _
"SELECT DISTINCT Numero " & _
"FROM Descripteur_Valeur " & _
"WHERE TypeValeur = 'Granule' " & _
"AND Valide = 1 "
'############# RECHERCHE DES NUMEROS DE GRANULES ####################
premiereligne = True
For i = 0 To NbNum
If TabNum(i) <> "" Then
If premiereligne Then
Requete = Requete & _
"AND (Numero = " & TabNum(i) & " "
premiereligne = False
Else
Requete = Requete & _
"OR Numero = " & TabNum(i) & " "
End If
End If
Next
If Numero <> "" Then
Requete = Requete & " ) "
End If
premiereligne = True
'Et c'est sur la suite que ça bugue...
'############# RECHERCHE DE DESCRIPTEURS FACULTATIFS ####################
Dim RequeteTemp, premierdesc
RequeteTemp = Requete
premierdesc = True
Response.Write "<br>###########################<br>"
Response.Write Requete
Response.Write "<br>###########################<br>"
For i = 0 To NbDesc
If TabDesc(i) <> "" Then
TabTempDesc = Split(Request.Form("Desc_" & TabDesc(i)), "+" )
NbTempDesc = UBound(TabTempDesc)
If TabDesc(i) <> "" Then
If premierdesc Then
Requete = RequeteTemp & _
"AND (NomDescripteur LIKE '%" & Replace(TabDesc(i),"#/", " " ) & "%' "
premierdesc = False
Else
Requete = RequeteTemp & _
"AND EXISTS ( " & _
"SELECT * " & _
"FROM Descripteur_Valeur " & _
"WHERE Valide = 1 " & _
"AND TypeValeur = 'Granule' " & _
"AND (NomDescripteur LIKE '%" & Replace(TabDesc(i),"#/", " " ) & "%' "
End If
End If
For j = 0 To NbTempDesc
If premiereligne Then
Requete = Requete & _
"AND (Valeur LIKE '%" & TabTempDesc(j) & "%' "
premiereligne = False
Else
Requete = Requete & _
"OR Valeur LIKE '%" & TabTempDesc(j) & "%' "
End If
Next
If TabDesc(i) <> "" Then
Requete = Requete & " ) "
End If
Requete = Requete & " )"
End If
'premierdesc = True
premiereligne = True
Next
|
Pour la requête INTERSECT aurait très bien fonctionné. Manque de pot, ça ne marche pas sous SqlServer. J'ai donc essayé le WHERE EXISTS, mais ça ne convient pas, les champs de recherche n'ayant pas d'ordre, le where exists se base sur le resultat de la requete qui le précède, et selon l'ordre, les résultats changent. Donc c'est mort.
Je dois impérativement trouver un moyen de faire cette recherche, détourné, ou bourrin même, sale, propre, peu importe, mais il le faut (et en plus il le faut avant mercredi prochain...)
Bref, si quelqu'un a le temps de s'atteler à mon problème, ça m'enleverai la tour eiffel qui est coincée dans mon petit orteil...
Merci d'avance.
Message édité par backdafuckup le 26-10-2005 à 09:53:02