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 :

Max sur une combinaison de champs et erreur -1038 (aucun message n'est assigné à cet erreur) [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut Max sur une combinaison de champs et erreur -1038 (aucun message n'est assigné à cet erreur)
    Bonjour à tous et merci de votre temps et de votre aide.

    J'ai besoin de trouver l'enr max d'une combinaison de champs.

    Date maximum de début

    Pour cette date maximum celui qui a le code maximum

    Pour ce code maximum, celui qui a la clef séquentielle maximum (C'est elle que je cherche pour faire ma jointure qui va afficher mes données les plus récentes).

    Ici un exemple de de données :

    1. Clef1 | 2017-01-01 | A | 100
    2. Clef1 | 2017-01-01 | B | 200
    3. Clef1 | 2017-01-15 | A | 300
    4. Clef1 | 2017-01-15 | B | 180
    5. Clef1 | 2017-01-15 | B | 195
    6. Clef1 | 2017-01-15 | B | 200
    7. Clef2 | 2017-01-01 | B | 100
    8. Clef2 | 2017-01-01 | B | 200


    La réponse attendue est la 6ième pour Clef1 et la 8ième pour Clef2.

    J'ai fait une requête de regroupement supposée me donner ce max et qui me retourne une erreur -1038 (Pas de message associé).

    Cette requête utilise un champ [ClefMax] assez long (environ 270) obtenu par concaténation via une fonction VBA des 3 champs à maximiser.
    1. Si je demande les select simples, pas d'erreur.
    2. Si je demande un regroupement sur un des mes champs ID et [ClefMax], pas d'erreur.
    3. Si je demande le max de [ClefMax] ... erreur -1038 :-(.


    L'idée était de faire le travail dans une seule requête, surtout que ma [ClefMax] est à un stade primaire et pourrait encore changer.

    Je pense que j'ai frappé une limite cachée de Access (genre on ne peut pas obtenir le max d'un champ texte de plus de 255) mais avant de devoir créer ma cascade de requêtes j'aimerai avoir votre avis.

    Et éventuellement des pistes pour NE PAS avoir à créer cette cascade sachant que le champ code peut contenir jusqu'à 255.

    Peut-être avec une sous-requête triée ordre inverse et un Top 1 ?
    Je suis vraiment pourri avec les sous-requête donc si c'est la solution, un exemple serait le bienvenu.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je ne suis pas sûr d'avoir tout compris mais bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT DecomposeClef([clef],1)  AS c1, DecomposeClef([clef],2)  AS c2, DecomposeClef([clef],3) AS c3, Max(DecomposeClef([clef],4)) AS c4
    FROM MaxClef
    WHERE DecomposeClef([clef],1) & " | " & DecomposeClef([clef],2) & " | " & DecomposeClef([clef],3) IN (
         SELECT DecomposeClef([clef],1)  & " | " & DecomposeClef([clef],2) & " | " & Max(DecomposeClef([clef],3))
         FROM MaxClef
         WHERE DecomposeClef([clef],1) & " | " & DecomposeClef([clef],2) IN (
             SELECT DecomposeClef([clef],1) & " | " & Max(DecomposeClef([clef],2)) FROM MaxClef GROUP BY DecomposeClef([clef],1))
         GROUP BY DecomposeClef([clef],1), DecomposeClef([clef],2))
    GROUP BY DecomposeClef([clef],1), DecomposeClef([clef],2),  DecomposeClef([clef],3)
    Et le code de la fonction VBA DecomposeClef (j'ai pas mis de gestion d'erreur, attention dans les requetes...) et j'ai considéré que le séparateur est " | "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Function DecomposeClef(ByVal Clef As Variant, ByVal NumSousClef As Long) As Variant
        If Not IsNull(Clef) Then DecomposeClef = Split(Clef, " | ", , vbBinaryCompare)(NumSousClef - 1)
    End Function

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci.

    Je me suis mal exprimé. Ce que j'ai posté c'est un exemple des données tel qu'elles sont, le | était pour matérialiser les différents champs.

    Si je suis bien, tu as fait la cascade de requête dans une seule requête.
    J'aimerai ne pas avoir de cascade du tout, simplement pouvoir prendre le max du champ [ClefMax].

    Comme je l'ai dit ma ClefMax n'est sans doute pas définitive et j'aimerai garder ma syntaxe aussi simple que possible même si je dois ajouter des champs ou réorganiser mes champs.
    ET, désolé, mais 3 imbrications de SQL dans le même sélect ne correspond pas à mon idée de "simple" (surtout avec l'éditeur de SQL vraiment limité de Access).

    Merci pour ton aide, je vais regarder ta solution en détail demain et voir si je peux suivre mon idée du TOP 1 en sous-requête.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Un autre essai plus simple avec une seule sous-requete et 4 CHAMPS (ou colonnes) !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT Id, Mid(MaxC, InStrRev(MaxC, "|") + 1) as ClefMax
    FROM (
    SELECT c1 as Id, Max(c2 & "|" & c3 & "|" & c4) AS MaxC
    FROM MaxClef
    GROUP BY c1) as r
    Retourne
    Clef1 | 200
    Clef2 | 200

    J'aime pas les Top 1...

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour et merci de ta suggestion mais elle reconcontre mon 1er problème.

    Je ne suis pas un grand fan de TOP non plus mais parfois c'est pratique.

    Voici la solution que j'ai trouvée avec 2 requêtes :

    1. reqDetail qui donne la liste des données "à maximiser"

      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      SELECT tblDetail.[ClefPrincipale], tblDetail.DateHeure, tblDetail.Code, tblDetail.Clef
      FROM tblDetail
      ORDER BY tblDetail.[ClefPrincipale], tblDetail.DateHeure DESC , tblDetail.Code DESC , tblDetail.Clef DESC;
    2. reqPrincipale qui donne la clef "maximum" de la requête de détail

      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      SELECT tblPrincipale.Clef, 
                 (select top 1 reqDetail.Clef from reqDetail where reqDetail.ClefPrincipale=tblPrincipale.Clef) AS ClefDetail
      FROM tblPrincipale
      ORDER BY tblPrincipale.Clef;

    Si j'ai besoin de changer la façon de trouver mon maximum, il suffit de modifier reqDetail et cela n'a pas d'impact sur reqPrincipale.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Invité
    Invité(e)
    Par défaut
    doublement déçu : pas beau et lent

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    La beauté c'est une histoire de point de vue :-) ... bon c'est sûr que ce n'est pas la solution la plus élégante.

    Au niveau performance, c'est très efficace chez moi. J'ai le résultat intensément à l'ouverture de ma requête.

    Par contre cela a un GROS défaut : cela met la requête en mode "Lecture seule"
    Finalement je m'en suis tiré avec un DFirst qui LUI ne verrouille pas mes données.
    C'est plus lent que le TOP 1 mais ça marche.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

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

Discussions similaires

  1. [MySQL, PostGreSQL] Récupérer les max sur une jointure
    Par genova dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/12/2017, 15h25
  2. Réponses: 7
    Dernier message: 22/03/2016, 13h50
  3. Réponses: 2
    Dernier message: 20/03/2009, 09h11
  4. Trier sur une valeur de champs et non sur le nom du champs
    Par kamalkam dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/05/2006, 17h41
  5. [debutante][javacript]test sur une égalité de champs parsé
    Par anitshka dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/12/2005, 13h41

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