ACCESS 2013: Limiter l'affichage dans un état

Résolu
Bonjour,

J'ai créé un état historique dans lequel je voudrais limiter l'affichage du nombre d'enregistrements.

J'ai fait 3 regroupements et la section "Détail" affiche l'historique des dates. Je voudrais afficher seulement les 5 dernières.

Après quelques recherches, j'ai trouvé la clause TOP à mettre dans ma requête SQL. Celle-ci limite bien le nombres d'enregistrements mais sur la totalité de l'état, alors que moi, je voudrais limiter par groupe.

Je suis peut-être sur une piste avec les sous-totaux de groupe, mais je bloque.

Si quelqu'un pouvait m'aider, d'avance merci.

7 réponses

  1. Contributeur Ambassadeur
    bonjour,
    je suggère que que crées d'abord une requête qui te retourne les enregistrements que tu veux afficher, et que l'état utilise cette requête comme source.

    voici un exemple de requête, qui retourne, pour chaque famille, les deux personnes les plus agées:
    select * from persos as p1
    where id in
    (select top 2 id from persos as p2
    where p1.nom=p2.nom
    order by ddn desc)
    0
    1. Merci, mais ma requête est trop complexe pour moi pour faire cette modif.
      0
      1. Contributeur Ambassadeur
        peux-tu partager la syntaxe SQL de la requête source de l'état?
        0
      2. @yg_beVoici ma requête:
        SELECT T_Interventions.ID_Intervention, T_Interventions.ID_Secteur, T_Interventions.ID_Sous_secteur, T_Interventions.ID_materiel, T_Interventions.Description_intervention, T_Interventions.En_standby, T_Historique_Interventions.Date_derniere_interv, T_Historique_Interventions.Resultat, T_Gestion_interventions.Periodicite_date, [T_Gestion_interventions]![Date_derniere_interv]+[T_Gestion_interventions]![Periodicite_date] AS proch_interv_date, T_Interventions.DC FROM (T_Gestion_interventions LEFT JOIN T_Compteurs ON T_Gestion_interventions.ID_Compteur = T_Compteurs.ID_Compteur) INNER JOIN (T_Interventions INNER JOIN T_Historique_Interventions ON T_Interventions.ID_Intervention = T_Historique_Interventions.ID_Intervention) ON (T_Interventions.ID_Intervention = T_Gestion_interventions.ID_Intervention) AND (T_Gestion_interventions.ID_Intervention = T_Historique_Interventions.ID_Intervention) WHERE (((T_Interventions.En_standby)=No) AND ((T_Interventions.DC)=Yes)) ORDER BY T_Interventions.ID_Secteur, T_Historique_Interventions.Date_derniere_interv DESC;
        0
      3. Contributeur Ambassadeur
        @cs_StegueSi ta requête s'appelle R_hist, et que tu veux obtenir, pour chaque secteur, les 5 interventions les plus récentes, je suggère ceci:
        select * from R_hist as p1
        where ID_Intervention in
        (select top 5 ID_Intervention from R_hist as p2
        where p1.ID_Secteur = p2.ID_Secteur
        order by Date_derniere_interv desc)
        ORDER BY ID_Secteur, Date_derniere_interv DESC 
        0
    2. Merci pour ton aide.

      J'ai créé cette requête afin d'utiliser ta solution, mais j'en arrive au même résultat. :/

      0
      1. Contributeur Ambassadeur
        si tu utilises la requête proposée en direct, quel résultat obtiens-tu?
        0
    3. J'ai du mal à expliquer entre les requêtes qui se trouvent avec les tables, les formulaires etc.. et les requêtes dans le champs sources des données de l'état.

      Ma requête initiale, la longue, était dans le champs source. Pour tester ta proposition, j'ai transformé cette requête en "vraie" requête et, dans le champs source de mon état, j'ai mis ta proposition.
      Le résultat reste inchangé, j'affiche encore toutes les dates archivées.
      0
      1. Contributeur Ambassadeur
        Si tu transformes "ma" requête en "vraie" requête, peux-tu tester chacune des requêtes? Renvoient-elles le même nombre de lignes?

        Comme tu as partagé très peu d'information, j'ai fait pas mal de suppositions ("tu veux obtenir, pour chaque secteur, les 5 interventions les plus récentes").
        Ma requête renvoie-t-elle plus de 5 interventions pas secteur?

        Tu as écrit "J'ai fait 3 regroupements". Il est sans doute utile d'expliquer quels champs tu utilises pour cela.
        0
    4. Non en effet, je n'ai plus le même nombre de ligne.

      Est-ce que cette capture peut t'aider:



      C'est la ligne "Détail" avec les dates qui se répète autant de fois qu'il y a d'enregistrements dans ma table historique. Normal, mais c'est celle-ci que je voudrais limiter.
      0
      1. Salut,

        J'ai adapté ta solution comme ceci et ça marche:

        select * from R_hist as p1
        where Date_derniere_interv in
        (select top 5 Date_derniere_interv from R_hist as p2
        where p1.ID_Secteur = p2.ID_Secteur
        order by Date_derniere_interv desc)
        ORDER BY ID_Secteur, Date_derniere_interv DESC


        Un grand merci à toi pour ta solution et ta patience. :)
        0
        1. Contributeur Ambassadeur
          As-tu testé avec plusieurs sous secteurs dans le même secteur, et plusieurs interventions par sous-secteur?
          0
        2. @yg_beJe pensais avoir rectifié mon dernier message, mais je n'ai pas du le valider.
          J'expliquais que tout compte fait je n'ai pas toutes les infos.

          Je n'ai pas encore compris celles qui manquent. J'ai bien plusieurs secteurs, plusieurs sous secteurs dans certains secteurs e même plusieurs interventions dans certains sous secteurs
          0
        3. Contributeur Ambassadeur
          @cs_StegueJe pense que dans la clause WHERE, il faut comparer les trois champs participants au regroupement, pas uniquement un seul.
          Avec la requête comme elle est pour l'instant, tu obtiens les cinq dates les plus récentes par secteur, alors que tu souhaites sans doute obtenir les cinq dates les plus récentes par combinaison des trois champs regroupés.
          0
      2. En effet, c'est bien ça. Ca me semble tout bon cette fois-ci. :)

        Merciiiiiii.
        0
        1. Contributeur Ambassadeur
          parfait, peux-tu alors marquer comme résolu?
          0