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 :

Obtenir la dernière cotisation non payée [AC-2019]


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut Obtenir la dernière cotisation non payée
    Bonjour à toutes et à tous,

    J'ai une base gérant des adhérents d'une association
    Je voudrais avoir, pour chaque adhérent, l'année (T_Cotisation.Cotisation_An) de sa dernière cotisation en retard ([T_Cotisation]![Cotisation_Du]=25).

    Je voudrais ainsi avoir pour l'un 2020, pour l'autre 2021...et ceux, ayant déjà payé la cotis 2022 n'apparaissant pas

    J'ai donc une table [T Adhérents] reliée à une table [T_Cotisation] par les champs [T Adhérents].N°Adherent et T_Cotisation.T_Adherent_FK

    J'ai ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [T Adhérents].Titre, [T Adhérents].N°Adherent, [T Adhérents].Nom, [T Adhérents].Prenom, T_Cotisation.Cotisation_An
    FROM [T Adhérents] INNER JOIN T_Cotisation ON [T Adhérents].N°Adherent = T_Cotisation.T_Adherent_FK
    WHERE (((T_Cotisation.Cotisation_An)=DLookUp("[T_Cotisation]![Cotisation_An]","[T_Cotisation]","[T_Cotisation]![Cotisation_Du]=25")) AND (([T Adhérents].Adherent)=True) AND ((T_Cotisation.Cotisation_An)<=Year(Date())+1))
    ORDER BY [T Adhérents].N°Adherent, [T Adhérents].Nom, [T Adhérents].Prenom;

    qui bien sûr ne répond pas à ma question.

    Merci de votre aide pour me dire en quoi mon raisonnement est faux.

    A+
    C15

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 117
    Points : 5 244
    Points
    5 244
    Par défaut
    Bonjour,

    On peut par exemple utiliser exists :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select n°adherent, nom, prenom, min(cotisation_an) from t_adherents t
    where adherent and exists (select * from cotisations c where c.n°adherent=t.n°adherent and c.cotisation_an=t.cotisation_an and cotisation_du=25)
    group by n°adherent, nom, prenom having min(cotisation_an)<=year(date() order by 1

    J'avoue ne pas avoir bien compris ce que vient faire 25 là dedans...

    Pour info, =true ne sert à rien et il est fortement déconseillé d'utiliser espaces et caractères spéciaux dans les noms

  3. #3
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonsoir,

    En voyant ta réponse, je me suis aperçu que mon raisonnement était faux.
    En PJ je montre ce que je voudrais obtenir.

    Dans un dernière colonne de la requête je voudrais avoir la dernière année où la cotisation est payée.
    Le raisonnement serait le suivant en faisant un total des cotisations dues (25€ par an) sur l'année en cours -5 et l'année en cours + 1 (l'appel des cotisations se faisant en fin d'année pour l'année suivante, par exemple fin 2021 pour 2022)
    Lorsque la cotisation est payée, une case cochée dans le formulaire "fiche adhérent" met cette cotisation à 0.

    Si le total est 0, alors l'année de la dernière cotisation payée est l'année en cours + 1, ici donc 2022, sinon l'année de la dernière cotisation payée est la dernière année où l'on a 0


    Exemples :
    pour les adhérents 60, 67, 70 on a 2021
    pour les 73 et 80 on a 2020
    pour les 88 et 93 on a 2016
    pour le 113 on a 2022

    Pour info, nous passons maintenant par un site de gestion d'association en ligne et l'on voudrait qu'apparaisse, dans le profil de chaque adhérent, l'année de sa dernière cotisation payée.

    Le code de ma requête actuelle :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TRANSFORM Sum(T_Cotisation.Cotisation_Du) AS SommeDeCotisation_Du
    SELECT [T Adhérents].Titre, [T Adhérents].N°Adherent, [T Adhérents].Nom, [T Adhérents].Prenom, Sum(T_Cotisation.Cotisation_Du) AS Total
    FROM [T Adhérents] INNER JOIN T_Cotisation ON [T Adhérents].N°Adherent = T_Cotisation.T_Adherent_FK
    WHERE (((T_Cotisation.Cotisation_An) Between Year(Date())-5 And Year(Date())+1) AND (([T Adhérents].Adherent)=True))
    GROUP BY [T Adhérents].Titre, [T Adhérents].N°Adherent, [T Adhérents].Nom, [T Adhérents].Prenom
    ORDER BY [T Adhérents].N°Adherent, [T Adhérents].Nom, [T Adhérents].Prenom
    PIVOT T_Cotisation.Cotisation_An;

    J'avoue ne pas savoir si l'on peut faire cette demande dans cette requête ci (analyse croisée) en ajoutant une colonne supplémentaire ou s'il faut faire cela dans une nouvelle requête basée sur celle-ci.

    En espérant avoir été plus clair, ce qui n'était pas difficile

    Merci de ton aide

    C15
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 117
    Points : 5 244
    Points
    5 244
    Par défaut
    J'utilise très rarement des requetes transform mais il me semble qu'elle doit pouvoir se compléter ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TRANSFORM Sum(T_Cotisation.Cotisation_Du) AS SommeDeCotisation_Du
    SELECT [T Adhérents].Titre, [T Adhérents].N°Adherent, [T Adhérents].Nom, [T Adhérents].Prenom, Sum(T_Cotisation.Cotisation_Du) AS Total
    , (select max(cotisation_an) from t_cotisation x where x.n°adherent=... and x.cotisation_du=0)
    FROM [T Adhérents] INNER JOIN T_Cotisation ON [T Adhérents].N°Adherent = T_Cotisation.T_Adherent_FK
    WHERE (((T_Cotisation.Cotisation_An) Between Year(Date())-5 And Year(Date())+1) AND (([T Adhérents].Adherent)=True))
    GROUP BY [T Adhérents].Titre, [T Adhérents].N°Adherent, [T Adhérents].Nom, [T Adhérents].Prenom
    ORDER BY [T Adhérents].N°Adherent, [T Adhérents].Nom, [T Adhérents].Prenom
    PIVOT T_Cotisation.Cotisation_An;

  5. #5
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 274
    Points : 6 583
    Points
    6 583
    Par défaut
    Salut
    Il y aurait une solution en 2 temps
    - une qry de sélection (qry_01) pour filtrer selon tes critères. La lecture du résultat est verticale. Ici j'ai mis Année en cours - 5
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [T Adhérents].N°Adherent, [Titre] & " " & [Nom] & " " & [Prenom] AS Adh, T_Cotisation.Cotisation_An, T_Cotisation.Cotisation_Du, [T Adhérents].Adherent
    FROM [T Adhérents] INNER JOIN T_Cotisation ON [T Adhérents].N°Adherent = T_Cotisation.T_Adherent_FK
    WHERE (((T_Cotisation.Cotisation_An) Between Year(DateAdd("yyyy",-5,Date())) And Year(Date())) AND ((T_Cotisation.Cotisation_Du)=0) AND (([T Adhérents].Adherent)=True)) OR (((T_Cotisation.Cotisation_An)=Year(DateAdd("yyyy",1,Date()))) AND ((T_Cotisation.Cotisation_Du)>0) AND (([T Adhérents].Adherent)=True))
    - une qry tableau croisé dynamique (qry_02) pour faciliter la lecture en 2D
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TRANSFORM Sum(qry_01.Cotisation_Du) AS SommeDeCotisation_Du
    SELECT qry_01.N°Adherent, qry_01.Adh, Sum(qry_01.Cotisation_Du) AS TotalCotisations
    FROM qry_01
    GROUP BY qry_01.N°Adherent, qry_01.Adh
    PIVOT qry_01.Cotisation_An

  6. #6
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour à tous les deux et merci de vos réponses.

    J'ai moi-même cherché de mon côté.
    Sauf erreur de ma part, comme je le craignais un peu, on ne peut "exploiter" directement une requête analyse croisée.
    La solution semble donc plus s'orienter vers ce que propose Hyperion13.

    Je vais creuser cette voie pour mettre en place le test "si total=0,...."
    Par ailleurs, je me demande si une exportation de cette requête Transform vers Excel ne serait pas encore plus simple.

    Je vous tiens au courant
    C15

  7. #7
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Rebonjour,

    Je ne sais si c'est du fait du décalage horaire avec Hyperion13, mais j'ai écrit n'importe quoi dans mon post précédent.
    En effet sa solution nous ramène à une requête analyse croisée dont je ne sais m'en sortir.
    Ce n'est peut-être pas satisfaisant, mais comme je le pressentais, j'ai trouvé une solution en passant par Excel.

    J'ai exporté ma requête initiale sous Excel, converti en numérique ce qui était en texte et rajouté une colonne avec la formule suivante :
    Code formule : Sélectionner tout - Visualiser dans une fenêtre à part
    =MAX.SI.ENS($F$1:$L$1;F2:L2;"=0")
    les années sont en colonne F à L.
    La PJ illustre le résultat escompté.

    Pour moi le problème est considéré comme résolu, même si ce n'est pas sous Access.

    A vous de voir comment vous le considérez ; dans tous les cas de figures, merci de votre aide.

    A+

    C15
    N 47°18'35.63"
    W 001°33'51.05"
    Images attachées Images attachées

  8. #8
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 274
    Points : 6 583
    Points
    6 583
    Par défaut
    Re,
    Il y a bien une solution
    La colonne DernLigne lorsqu'elle affiche 0 indique l'année depuis laquelle les cotisations n'ont pas été réglées. Lorsque DernLigne affiche 25 indique l'année de reprise du règlement des cotisations.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Cotisation.NUM_COTISATION_PK, T_Cotisation.T_Adherent_FK, T_Cotisation.Cotisation_An, T_Cotisation.Cotisation_Du AS DernLigne, T_Cotisation_1.Cotisation_Du AS LignePrec, [T_Cotisation_1].[Cotisation_Du]-[T_Cotisation].[Cotisation_Du] AS Diff
    FROM T_Cotisation, T_Cotisation AS T_Cotisation_1
    WHERE ((([T_Cotisation_1].[Cotisation_Du]-[T_Cotisation].[Cotisation_Du])<>0) AND ((T_Cotisation_1.NUM_COTISATION_PK)=[T_Cotisation].[NUM_COTISATION_PK]-1))
    ORDER BY T_Cotisation.NUM_COTISATION_PK, T_Cotisation.T_Adherent_FK, T_Cotisation.Cotisation_An;

  9. #9
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour

    Merci de cette réponse complémentaire.
    J'ai quelques doublons qui sont liés, a priori, à des changements de statuts.

    A+
    C15

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

Discussions similaires

  1. [DATA] Obtenir les dernières lignes (et non pas "la")
    Par alers dans le forum SAS Base
    Réponses: 2
    Dernier message: 23/02/2017, 17h08
  2. Réponses: 38
    Dernier message: 13/05/2015, 12h18
  3. Indemnité de stage non payée sur les 6 dernières semaines
    Par mvk44 dans le forum Droit du travail
    Réponses: 3
    Dernier message: 25/01/2011, 17h34
  4. vacances non payées
    Par *alexandre* dans le forum Congés
    Réponses: 3
    Dernier message: 05/02/2007, 23h45
  5. Lecture de fichier - dernière ligne non prise en compte
    Par JulienPles dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 16/03/2005, 12h57

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