Afficher la valeur minimale entre plusieurs champs/colonnes en ACCESS [Résolu]

mladenski 12 Messages postés samedi 15 novembre 2008Date d'inscription 24 avril 2009 Dernière intervention - 15 avril 2009 à 17:17 - Dernière réponse : aieeeuuuuu 698 Messages postés jeudi 16 janvier 2003Date d'inscription 20 mai 2011 Dernière intervention
- 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.

Un petit aperçu sur Excel:

<colgroup><col style=\"WIDTH: 61pt; mso-width-source: userset; mso-width-alt: 2962\" width=\"81\" /><col style=\"WIDTH: 87pt; mso-width-source: userset; mso-width-alt: 4242\" span=\"4\" width=\"116\" /><col style=\"WIDTH: 23pt; mso-width-source: userset; mso-width-alt: 1133\" width=\"31\" /></colgroup>----
 , Prix Partenaire 1, Prix Partenaire 2, Prix Partenaire 3, Prix Partenaire 4, MIN, ----
Opération 1, 1 €, 54 €, 4 €, 4 €, 1 €, ----
Opération 2, 213 €, 6 €, 2 €, 3 €, 2 €, ----
Opération 3, 8 €, 7 €, 67 €, 2 €, 2 €, ----
Opération 4, 8 €, 56 €, 4 €, 2 €, 2 €, ----
Opération 5, 96 €, 6 €, 4 €, 6 €, 4 €, ----
Opération 6, 48 €, 8 €, 5 €, 1 €, 1 €, ----
Opération 7, 48 €, 4 €, 1 €, 2 €, 1 €

Merci de votre aide.
Afficher la suite 

12 réponses

Répondre au sujet
aieeeuuuuu 698 Messages postés jeudi 16 janvier 2003Date d'inscription 20 mai 2011 Dernière intervention - 17 avril 2009 à 13:13
+3
Utile
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...)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de aieeeuuuuu
aieeeuuuuu 698 Messages postés jeudi 16 janvier 2003Date d'inscription 20 mai 2011 Dernière intervention - 17 avril 2009 à 17:59
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de aieeeuuuuu
mladenski 12 Messages postés samedi 15 novembre 2008Date d'inscription 24 avril 2009 Dernière intervention - 16 avril 2009 à 10:34
0
Utile
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.
Commenter la réponse de mladenski
mladenski 12 Messages postés samedi 15 novembre 2008Date d'inscription 24 avril 2009 Dernière intervention - 16 avril 2009 à 12:02
0
Utile
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

Dim intVar As Integer

Dim varMinTab As Double

Dim i, j As Integer

Dim TabNoms

TabNoms = Array("Champs1", "Champs2", "Champs3", "Champs4", "Champs5", "Champs6")

varMinTab = LesVariables(0)

i = 0

j = 0

For intVar = 0 To UBound(LesVariables())

If LesVariables(intVar) = 0 Then

j = j + 1

End If

If LesVariables(intVar) < varMinTab And LesVariables(intVar) <> 0 Then

i = i + 1 + j

varMinTab = LesVariables(intVar)

End If

Next intVar

If i > 5 Then

i = 5

End If

ChampsMin = TabNoms(i)

End Function
Commenter la réponse de mladenski
mladenski 12 Messages postés samedi 15 novembre 2008Date d'inscription 24 avril 2009 Dernière intervention - 17 avril 2009 à 14:17
0
Utile
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.
Commenter la réponse de mladenski
mladenski 12 Messages postés samedi 15 novembre 2008Date d'inscription 24 avril 2009 Dernière intervention - 17 avril 2009 à 21:31
0
Utile
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
Commenter la réponse de mladenski
aieeeuuuuu 698 Messages postés jeudi 16 janvier 2003Date d'inscription 20 mai 2011 Dernière intervention - 20 avril 2009 à 09:54
0
Utile
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...
Commenter la réponse de aieeeuuuuu
mladenski 12 Messages postés samedi 15 novembre 2008Date d'inscription 24 avril 2009 Dernière intervention - 20 avril 2009 à 10:30
0
Utile
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.

Cordialement
Commenter la réponse de mladenski
aieeeuuuuu 698 Messages postés jeudi 16 janvier 2003Date d'inscription 20 mai 2011 Dernière intervention - 20 avril 2009 à 10:53
0
Utile
ha oui...

les contextes difficiles ou il faut faire vite, et on fera bien plus tard...

je connais aussi :)

bonne continuation
Commenter la réponse de aieeeuuuuu
mladenski 12 Messages postés samedi 15 novembre 2008Date d'inscription 24 avril 2009 Dernière intervention - 20 avril 2009 à 11:00
0
Utile
Merci.
à plus
Commenter la réponse de mladenski
mladenski 12 Messages postés samedi 15 novembre 2008Date d'inscription 24 avril 2009 Dernière intervention - 20 avril 2009 à 17:08
0
Utile
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!
Commenter la réponse de mladenski
aieeeuuuuu 698 Messages postés jeudi 16 janvier 2003Date d'inscription 20 mai 2011 Dernière intervention - 20 avril 2009 à 17:54
0
Utile
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
Commenter la réponse de aieeeuuuuu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.