mladenski
Messages postés12Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention24 avril 2009
-
15 avril 2009 à 17:17
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 2011
-
20 avril 2009 à 17:54
Bonjour. J'ai le problème suivant sur ACCESS:
J'effectue une requête qui me donne plusieurs champs contenant chacun un prix relatif à une même opération (donc pas possibilité de faire autrement au niveau conceptuel, il me faut bien plusieurs champs avec plusieurs tarifs pour chaque partenaire).
J'aimerais rajouter un champs supplémentaire (MIN) qui affichera le prix minimal de ces champs mais je n'arrive pas à le faire sur ACCESS. J'ai essayé avec la fonction Min et MinDom, mais je pense qu'elles ne marchent que pour une seule colonne. Dès qu'on doit comparer plusieurs colonnes ces fonctions s'avèrent inutiles.
En fait, j'ai déjà rencontré ce problème auparavant et je l'ai résolu avec des VraiFaux (iif). Bon, c'est pas trop compliqué de comparer deux colonnes mais maintenant c'est presque impossible comme j'ai plusieurs colonnes.
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20113 17 avril 2009 à 13:13
Bonjour,
pourquoi pas possibilité de faire autrement au niveau conceptuel ?
personnellement, je pense qu'il aurait été préférable de faire 3 tables :
un table "operation" (IDOperation, Nom)
une table "partenaire" (IDPartenaire, Nom)
et un table "prix" (IDOperation, IDPartenaire, Prix)
et avec ca, plus de souci pour faire la requete, mais surtout, plus de souci le jour ou il faudra ajouter un partenaire. car avec la structure actuelle, ajouter un parternaire, oblige a modifier la strucuture de la base, ce qui n'est vraiment pas une bonne idee (il faudra d'ailleur modifier la requete mentionnée ci-dessus...)
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20113 17 avril 2009 à 17:59
non, faire 3 tables ne reviendrait pas du tout au meme, car alors, on pourrait utiliser la fonction MIN, avec laquelle on pourrait quand même sortir plusieurs resultats en faisant un "group by".
pour l'ajout de partenaire, je ne parlais pas de complexité, mais plutot de souci : quand on change la structure de la base, les requetes qui y font reference pourraient ne plus fonctionner de la meme facon.
je ne connais pas les tenants et aboutissants, mais devoir modifier la structure d'une base de données pour ajouter un partenaire n'est pas une bonne solution.
mladenski
Messages postés12Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention24 avril 2009 16 avril 2009 à 10:34
J'ai déjà trouvé une solution et je la poste pour tous ceux qui se trouve dans la même solution que moi.
En fait, il faut créer une fonction en VBA. Sur le net j'ai trouvé une fonction qui retrouve la valeur maximale à partir de plusieurs champs de valeurs:
Public Function VariableMax(ParamArray LesVariables() As Variant)
Dim intVariable As Integer
Dim varMax As Double
For intVariable = 1 To UBound(LesVariables())
If LesVariables(intVariable) > varMax Then varMax = LesVariables(intVariable)
Next intVariable
VariableMax = varMax
End Function
Je l'ai adaptée à mes besoins parce que dans la comparaison je voulais ignorer les valeurs zéro et bien sûr je voulais la valeur minimale.
Public Function VariableMin(ParamArray LesVariables() As Variant)
Dim intVariable As Integer
Dim varMin As Double
varMin = LesVariables(0)
For intVariable = 0 To UBound(LesVariables())
If LesVariables(intVariable) < varMin Then
If LesVariables(intVariable) <> 0 Then
varMin = LesVariables(intVariable)
End If
End If
Next intVariable
VariableMin = varMin
End Function
Maintenant, il me reste à trouver le nom du champs. Si quelqu'un a une idée, allez-y. Merci.
mladenski
Messages postés12Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention24 avril 2009 16 avril 2009 à 12:02
Voili, voilà. J'ai la fonction suivante qui me convient parfaitement. Bon, je ne récupère pas le nom des champs et je les rentrent en dur dans une matrice mais pour l'instant ça marche.
Public Function ChampsMin(ParamArray LesVariables() As Variant)
' Fonction qui compare plusieurs champs et donne le champs de la valeur minimale en ignorant les zéros
mladenski
Messages postés12Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention24 avril 2009 17 avril 2009 à 14:17
Faire 3 tables revient au même (je précise néanmoins que je traville sur des requêtes et non pas sur des tables, les tables d'information étant des fichiers liés sur un serveur). La fonction Min(Max) classique ne me donnera qu'une seule ligne et moi,je veux comparer plusieures colonnes et afficher toutes les lignes de la requête. En gros, les tables (ou requêtes) qui contiennent les infos des partenaires auront un champs/colonne "PRIX" que je veux comparer. Peu importe s'il est dans la même table/requête ou pas, la fonction Min(Max) ne me sert pas.
Puis, pour le rajout des partenaires, ce n'est vraiement pas compliqué (je viens même de rajouter un). Il faut tout de même connaître la fonction, j'admets, mais ce n'est pas du tout compliqué.
Merci quand-même pour l'intérêt.
mladenski
Messages postés12Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention24 avril 2009 17 avril 2009 à 21:31
D'accord pour la solution.
Effectivement, dans un cas simple comme ça (opération, partenaire, prix) il faudrait faire cela. Maintenant, en termes de visibilité et de représentation, je préfère la première solution parce que les utilisateurs ont besoin de voir tout le raisonnement càd d'avoir à tout moment sous leurs yeux combien ça coûte si on passe par le premier partenaire, le second etc...et ceci en une seule ligne par opération. En plus, quand j'ai dis 'opération' je voulais simplifier. Il s'agit en fait d'une commande. Alors il faut compter des miliers et des miliers de lignes par mois. Si on les multiplie par le nombre de partenaires (puisqu'on voudra voir le tarif de chacun et en plus avoir le MIN) ça va faire un peu trop.
Mais, effectivement j'ai appris des choses. Merci pour les réponses et bon week-end!
Cordialement
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20113 20 avril 2009 à 09:54
mais de rien...
je me permet quand meme d'insister, faire trois tables n'empeche pas de présenter un tableau tel qu'il est au dessus avec une requete assez simple. d'autre part, si vous avez "des milliers et des milliers de lignes par mois", mieux vaut avoir une base bien conçue au départ, sinon les perfs pourrait gener (surtout sous access). et les eventuelles evolutions risquent fort d'etre douloureuses.
Je ne sais pas ou vous en etes dans votre projet, mais si vous en etes encore en phase d'analyse, je pense qu'il n'est pas trop tard pour reconsiderer la chose...
mladenski
Messages postés12Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention24 avril 2009 20 avril 2009 à 10:30
Bonjour.
Tous les jours la boîte perds de l'argent, alors on s'en passe de la phase d'analyse. L'outil démontre bien les différences et là où l'on peut agir.
A long terme, la solution sera de ne pas du tout utiliser d'access.
mladenski
Messages postés12Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention24 avril 2009 20 avril 2009 à 17:08
Je viens de me rendre compte que votre solution est celle à ADOPTER. En fait, lorsque j'ai rajouter encore qqs partenaires, Access m'a dit que la requête est trop complexe. Alors, il vaut mieux faire un regroupement par id et utiliser la fonction MIN. Tant pis, si tous les tarifs ne s'affiche pas, le but c'est quand-même de trouver le tarif le moins élevé. Merci encore!
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20113 20 avril 2009 à 17:54
de rien.
de plus, il est facile de sortir quand même le prix pour tous les partenaires, classés par (produit, prix croissant)
comme ça pour chaque produit, vous avez le prix min en première ligne, puis tous les autre prix
sinon, pour avoir tout sur une ligne par produit, c'est possible aussi, mais la requête sera plus lourde a écrire