IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Valeur mini de plusieurs champs [AC-2002]


Sujet :

Requêtes et SQL.

  1. #1
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut Valeur mini de plusieurs champs
    Bonjour
    Dans une requête, j'extrais des enregistrements d'une table avec plusieurs champs de type date.
    Je voudrais créeer un champ qui me trouve, pour chaque enregistrement, la date la plus ancienne parmi ces dates.
    Comment faire ?

    Merci d'avance !

  2. #2
    Membre actif
    Inscrit en
    Juin 2010
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 150
    Points : 210
    Points
    210
    Par défaut
    http://www.developpez.net/forums/d58...t-sous-access/

    je crois qu'il s'agit du même problème que le tien, reste à faire un petit mix pour comparer 3 dates au lieu de 2

  3. #3
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Salut Merryvor
    Ceci marche bien avec 2 champs.
    Au delà, ce n'est pas aussi simple...
    Je fais des recherches et des essais.

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 424
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    Salut,

    Peut-être en utilisant une fonction dont l'argument est 1 tableau (Option ParamArray) :

    Un exemple de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function LeMin(ParamArray Ary())
    Dim iCounter
     
    LeMin = Ary(0) '1er élément
     
    For iCounter = 0 To UBound(Ary)
       If (LeMin > Ary(iCounter)) Then
          LeMin = Ary(iCounter)
       End If
    Next
     
    End Function
    Utilisation dans 1 requête:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    MinDate: LeMin([Date1];[Date2];[Date3];[Date4])

    A toi de l'adapter à ta requête.

    A+

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut Fonctions pour trouver le Minimum ou le Maximum
    Bonsoir,

    Ces deux fonctions restituent le minimum ou le maximum d’une série de données, quel que soit leur nombre (illimité) et quel que soit leur type (date, numérique ou texte) pourvu qu’elles soient homogènes.
    La série de données est présentée sous forme de texte, donc encadrée de quotes. Les composants sont séparés entre eux par un "PaillePeu" "|" = <alt> + 124
    Pour le minimum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Public Function LeMinimum(Série) As Variant
     'valeurs entre quotes et séparées par |
     'les nombres décimaux avec virgule.
     'le premier membre détermine le type de données (date, numérique ou texte)
     
     'ex d'appels :  LeMinimum("31/12/09|25/3/2003|1/1/07")
     '               LeMinimum("1000|4|5|3,1416")
     '               LeMinimum("abc|d|efg|h|a|bcd")
     '               LeMinimum("1000|abc|5|3,1416") conduit à une erreur
     '               LeMinimum("31/12/09|A|1/1/07") conduit à une erreur
     '               LeMinimum("a|abc|31/12/07|3,1416")sera accepté, _
                       mais les dates et nombres seront traités comme du texte
     
    On Error GoTo erreur
    Dim ArrSérie() As String, i As Integer
     
    ArrSérie = Split(Série, "|")
    LeMinimum = ArrSérie(0)
    If IsDate(LeMinimum) Then   'comparaison de dates
     'vérifier homogénéité
     For i = 1 To UBound(ArrSérie)
       If Not IsDate(ArrSérie(i)) Then GoTo erreur
     Next i
     'Rechercher le plus petit
     For i = 1 To UBound(ArrSérie)
       If Format(ArrSérie(i), "yymmdd") < Format(LeMinimum, "yymmdd") Then
          LeMinimum = ArrSérie(i)
       End If
     Next i
    Exit Function
    ElseIf IsNumeric(LeMinimum) Then    'comparaison autre
     'vérifier homogénéité
     For i = 1 To UBound(ArrSérie)
       If Not IsNumeric(ArrSérie(i)) Then GoTo erreur
     Next i
     'Rechercher le plus petit
     
     For i = 1 To UBound(ArrSérie)
       If CDbl(ArrSérie(i)) < CDbl(LeMinimum) Then
          LeMinimum = ArrSérie(i)
       End If
     Next i
    Exit Function
    Else
     For i = 1 To UBound(ArrSérie)
       If ArrSérie(i) < LeMinimum Then
          LeMinimum = ArrSérie(i)
       End If
     Next i
    End If
    Exit Function
     
    erreur:
    MsgBox "les données ne sont pas homogènes", vbCritical
     
    End Function

    Pour le maximum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Public Function LeMaximum(Série) As Variant
     'valeurs entre quotes et séparées par |
     'les nombres décimaux avec virgule.
     'le premier membre détermine le type de données (date, numérique ou texte)
     
     'ex d'appels :  LeMaximum("31/12/09|25/3/2003|1/1/07")
     '               LeMaximum("1000|4|5|3,1416")
     '               LeMaximum("abc|d|efg|h|a|bcd")
     '               LeMaximum("1000|abc|5|3,1416") conduit à une erreur
     '               LeMaximum("31/12/09|A|1/1/07") conduit à une erreur '               LeMaximum("a|abc|31/12/07|3,1416")sera accepté, _
                       mais les dates et nombres seront traités comme du texte
     
    On Error GoTo erreur
    Dim ArrSérie() As String, i As Integer
     
    ArrSérie = Split(Série, "|")
    LeMaximum = ArrSérie(0)
    If IsDate(LeMaximum) Then   'comparaison de dates
     'vérifier homogénéité
     For i = 1 To UBound(ArrSérie)
       If Not IsDate(ArrSérie(i)) Then GoTo erreur
     Next i
     'Rechercher le plus Grand
     For i = 1 To UBound(ArrSérie)
       If Format(ArrSérie(i), "yymmdd") > Format(LeMaximum, "yymmdd") Then
          LeMaximum = ArrSérie(i)
       End If
     Next i
    Exit Function
    ElseIf IsNumeric(LeMaximum) Then 'comparaison autre
     'vérifier homogénéité
     For i = 1 To UBound(ArrSérie)
       If Not IsNumeric(ArrSérie(i)) Then GoTo erreur
     Next i
     'Rechercher le plus Grand
     For i = 1 To UBound(ArrSérie)
       If CDbl(ArrSérie(i)) > CDbl(LeMaximum) Then
          LeMaximum = ArrSérie(i)
       End If
     Next i
    Exit Function
    Else
     For i = 1 To UBound(ArrSérie)
       If ArrSérie(i) > LeMaximum Then
          LeMaximum = ArrSérie(i)
       End If
     Next i
    End If
    Exit Function
     
    erreur:
    MsgBox "les données ne sont pas homogènes", vbCritical
     
    End Function
    Exemple d'utilisation dans une requête
    sur "DatesAcomparer" pour les champs date1, date2, date3 et date4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DatesAcomparer.date1, DatesAcomparer.date2, DatesAcomparer.date3, DatesAcomparer.date4, LeMinimum([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4]) AS [Min], LeMaximum([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4]) AS [Max]
    FROM DatesAcomparer;

  6. #6
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Merci à tous !

    La méthode à Claude est parfaite !

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 424
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    Bonjour,

    C'est quoi l'avantage de la méthode de Claude par rapport à celle que je propose ?

  8. #8
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Bonjour User,

    C'est en effet toi qui avais donné la bonne piste.
    J'ai ajouté un bout de code, pour déterminer le type de données pour adapter la syntaxe de comparaison.
    ... et ajouté un exemple d'appel pour une requête.

  9. #9
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 424
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    Salut Claude,

    Oui j'ai vu que tu as ajouté une gestion d'erreur et 2 ou 3 bouts de code intéressants, mais là j'avoue que comme VBA nous offre la possibilité de passer 1 tableau en argument pourquoi ne pas l'utiliser

    En tous cas, merci pour ta franchise

  10. #10
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Parce que je n'avais pas compris "(ParamArray Ary())"
    Je vais revoir.
    Merci pour la remarque.

  11. #11
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Salut User... et les autres

    Vraiment désolé si j'ai créé un pb bien involontairement... où il n'y en avait pas.
    D'abord, j'ai remercié tout le monde.

    Sur mon choix :
    1) je ne suis pas un pro comme vous et je prends ce que j'arrive à comprendre et faire marcher
    2) j'ai buté comme Claude sur le ParamArray Ary()
    3) la gestion d'erreur - à laquelle je n'aurais pas pensé -m'a été très utile (champs pas toujours remplis ou mal remplis)

    C'est tout simple.

    Encore merci à TOUS de prendre du temps pour aider des "petits" développeurs occasionnels comme moi.
    Ca c'est du forum !

  12. #12
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 424
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    Salut titi95,

    Y-a pas de mal, tu as fait ton choix pour une solution plus usuelle,
    je comprends parfaitement ton choix. Je voulais juste mentionner cette possibilité qu'offre le VBA...

    Bonne continuation,

  13. #13
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Bonsoir User et tous les autres,
    Je reviens sur ta suggestion d'utiliser ParamArray Arguments() pour passer les composantes à trier.
    Dans ma proposition, les composantes à comparer sont passées comme ceci :
    LeMinimum("1000|4|5|3,1416")
    c'est à dire le bloc entre quotes, les éléments séparés par | (<Alt>124).
    J'ai choisi le paillepeu, comme séparateur car il est rarement utilisé et donc peu susceptible d'interférer.
    Avec ParamArray, j'ai cru comprendre que le séparateur était obligatoirement la virgule.
    Quid, si ma recherche de minimum ou maximum contient un numérique avec une décimale ?
    Avec ParamArray je crois que je vais comparer 1000, 4, 5, 3 et 1416.
    Je te concède que de mon côté, il y aurait problème si un élément comportait des quotes.
    Ex le minimun entre Chablis "Mont de Milieu" Billaud Simon d'une part
    et
    Château La bastide, cuvée "OPTIMEE" Corbières d'autre part
    Mais, ici il y a une parade : doubler les quotes intérieurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    leMinimum("Chablis ""Mont de Milieu"" Billaud Simon|Château La bastide, cuvée ""OPTIMEE"" Corbières")
    me donne un résultat correct.

    Quelque chose m'a échappé ?

  14. #14
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 424
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    Salut Claude,

    Avec ParamArray, j'ai cru comprendre que le séparateur était obligatoirement la virgule.
    Quid, si ma recherche de minimum ou maximum contient un numérique avec une décimale ?
    Avec ParamArray je crois que je vais comparer 1000, 4, 5, 3 et 1416.
    Ce n'est pas 1 problème,

    L'expression ParamArray Ary() veut dire en gros tu peux passer une liste d'arguments, en nombre quelconque et le langage se charge de traduire cette liste d'arguments en 1 tableau. Donc si un argument contient une virgule il ne sera pas séparé en 2, mais traité comme un argument seul qui sera un élément du tableau.

    A+

  15. #15
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Bonjour et merci user.
    Je retiens pour une prochaine occasion.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 70
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    Je me permets de relancer ce sujet.

    J'ai testé la solution de Claude mais la requête me renvoi un message d'erreur :



    Je n'ai pas d'idée sur l'origine de l'erreur.
    Est-ce que cela parle à quelqu'un svp ?

    merci d'avance

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 70
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par ricachu Voir le message
    Bonjour,

    Je me permets de relancer ce sujet.

    J'ai testé la solution de Claude mais la requête me renvoi un message d'erreur :



    Je n'ai pas d'idée sur l'origine de l'erreur.
    Est-ce que cela parle à quelqu'un svp ?

    merci d'avance

    Pour être un peu plus explicite, j'ai copié le code puis j'ai renseigné la requête comme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ..., ..., LeMaximum([/a_isoctry_zneffectiveness_start_date] & "|" & [/iso_ctry_ideffectiveness_start_date]) AS start_date
     
    FROM ...
    C'est alors que j'ai le message d'erreur

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 70
    Points : 63
    Points
    63
    Par défaut
    OUP'S...J'ai trouvé mon erreur (de débutant) : il ne faut pas oublier d'indiquer tous les champs de date dans le "groupe by".....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sélectionner les deux valeurs mini de plusieurs champs.
    Par Triglodyte dans le forum VBA Access
    Réponses: 3
    Dernier message: 11/09/2014, 09h26
  2. Comment calculer une valeur d'après plusieurs champs
    Par mokrane20yy dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/02/2014, 09h36
  3. [AC-2003] Trouver la valeur Max entre plusieurs champs
    Par Jbone dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/12/2010, 21h08
  4. Réponses: 1
    Dernier message: 13/03/2007, 10h52
  5. Valeur mini pour un Champs avec un bouton + et un - a coté
    Par budiste dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 01/12/2005, 15h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo