Traitement base de donnée [Résolu]

Signaler
Messages postés
19
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
18 août 2006
-
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
Bonjour à tous,

Voila, j'ai encore un petit soucis de faisabilité. En fait, j'ai une base de donnée Access avec une table contenant 3 colonne (identifiant,annee,valeur) et je voudrais pouvoir sortir les bonnes lignes selon une demande utilisateur. Je m'explique.

Dans mon logiciel, l'utilisateur peut souhaiter récupérer des donnée et pour cela il entre dans un textbox l'année, l'identifiant et la valeur.

dans un premier temps, le programme fait une recherche selon l'année et s'il ne trouve pas la valeur exacte alors il doit récupérer les année juste autour. une fois que c'est réalisée, on doit pouvoir faire la recherche sur les années mais uniquement avec les lignes retenues sur les années.

id année   valeur

1    2000      25  
2    2001       30
3    2001      26  
4    2001      31
5    2003      38
6    2003      35
7    2004      40
  
l'utilisateur veut une année 2002 ! Je veux donc retenir l'identifiant 2,3,4,5,6
l'utilisateur veut une valeur de 32 ! Je veux donc retenir 4 et 6

Voila, j'espère que c'est plus clair ?! J'aimerai le faire avec une petite fonction est-ce que c'est possible ? comment je peux faire, est-ce qu'a chaque traitement de colonne je dois sauvegarder dans un fichier texte les lignes que je veux ? ou Access peut me le faire ?
Merci de votre aide !

4 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Salut,


Je pense que tu n'auras pas le choix que d'y aller avec plusieurs requêtes

La première recherchant les 2 ou 3 valeurs exactes. Je ne sais pas si
ID est un numéro auto ou non. Si oui, je ne pense pas qu'il devrait
faire objet de recherche. Si non, tu pourras toujours le rajouter.


Select * from MaTable where Annee=variable and Valeur= variable

Si la requête ne sort rien, il faut alors y aller par priorité.

If Rs.RecordCount < 1 then


Tu peux alors faire 2 requêtes presque identiques pour rechercher les
valeurs les plus près vers le bas et vers le haut. C'est là que le
Order By entre en jeu.


Select * from MaTable where Annee < variable and Valeur < variable order by Annee DESC, Valeur DESC

Donc l'année plus petite se rapprochant le plus de l'année demandée sera en premier avec la valeur se rapprochant aussi le plus


Select * from MaTable where Annee > variable and Valeur > variable order by Annee ASC, Valeur ASC

Donc l'année plus grande se rapprochant le plus de l'année demandée sera en premier ainsi que la valeur


Il s'agit donc de changer les mots «variable» par les équivalents de
ton programme et de mettre des apostrophes pour les champs Texte et des
# pour des champs de type Date

ex: si ta variable MonAnnee est de type Texte

"Select * from MaTable where Annee <'" & MonAnnee & "' and
Valeur <" & MaValeur & " order by Annee DESC, Valeur DESC"


ex: si ta variable MonAnnee est de type Date

"Select * from MaTable where Annee <#" & MonAnnee & "# and
Valeur <" & MaValeur & " order by Annee DESC, Valeur DESC"


Attention aux espaces avant ou après les guillemets
Bonne chance

MPi
Messages postés
19
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
18 août 2006

Merci pour ton aide MPi, je vais essayer de l'utiliser et je te tiens au courant !
Messages postés
19
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
18 août 2006

Juste une petite question !

En fait, quand tu fais ton premier order by, tu trie les année par valeur descendante et tu sors la premiere de la liste c'est celle qui se rapproche le plus. ca c ok.

Mais après, en fait, au depart les paramètres sont liés, je m'explique, année et valeur sont liés. Donc si je trie les année pour trouver celle qui se rapproche le plus, alors il faut que la liste des valeurs suivent également.

dans mon exemple : si on trie pour avoir les année par valeur DESC. (si l'utilisateur cherche 2002 et 32)

on obtient

4    2001    31  
3    2001    26
2    2001    30
1    2000    25

et si dans cette meme requete on rajoute une recherche sur la valeur DESC

4    2001       31
3     2001      30
2   2001      26
1   2000      25

Donc là ca vient de trier les valeurs. Seulement voila, comme mes paramètres doivent restés liés, du coup

1   2000   25

ces paramètres n'existe pas au départ.

dans mon cas il faudrait que j'arrive à obtenir les deux liste suivantes

4   2001   31
6   2003   38

qui en fait n'ont pas bougé par rapport à ma base de départ mais qui encadre bien mes paramètres sohaitée,

2002   et 32

l'identifiant doit rester avec eux car je m'en sers après pour les identifier.

Est-ce que tu comprends ? Merci de ton aide
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Hummm. ça m'étonne ce que tu dis là...

En principe les données "à l'horizontale" devraient toujours être au
même endroit par rapport aux autres données du même enregistrement.


Si vraiment les données de chaque colonne se mélangent indépendamment
les unes des autres, il faudrait alors enlever le dernier ASC ou DESC,
j'imagine. Et je devrais vérifier mes notes... ¦¬)
Select * from MaTable where Annee < variable and Valeur < variable order by Annee DESC, Valeur


Le fait de laisser Valeur dans le Order By fait en sorte qu'il sera
priorisé dans le tri. Par contre, il faudrait enlever "and Valeur <
variable" si la valeur de "Valeur" peut être plus grande en 2001 qu'en
2002


Tu pourrais aussi boucler le résultat de la requête en vérifiant que
l'année est toujours celle du premier enregistrement et ensuite
rechercher la Valeur la plus près de celle demandée.

MPi