OVH Cloud OVH Cloud

comparer les enregistrements

7 réponses
Avatar
rose
bonjour =E0 tous,

je suis sur une base de donn=E9es qui g=E8re des visites par centre.
un centre peut avoir plusieurs visites, j'ai donc un formulaire centre
avec un sous-formulaire visites. Lorsqu'une visite est termin=E9e, j'ai
une case =E0 cocher (coch=E9e donc)
je souhaite conna=EEtre les centres pour lesquels toutes les visites
sont termin=E9es, autrement dit, toutes les cases =E0 cocher sont
coch=E9es.
j'imagine qu'il faut faire une boucle, comparer pour chaque centre
toutes ses visites, et r=E9cup=E9rer ces derni=E8res si elles sont toutes
coch=E9es.

mais j'y arrive pas. Des id=E9es?

merci.

7 réponses

Avatar
Eric
Bonjour Rose,

Tu peux faire ça en SQL
En supposant que la table des centres s'appelle CENTRE, celle des
visites VISITE.

Schéma simplifié des tables:
CENTRE(#NumCentre,NomCentre)
VISITE(#NumVisite,NumCentre, DateVisite,Passe) {Passe est Booléen}

le sql suivant te retourne ls centres pour lesquels toutes les visites
prévues ont été réalisées.

SELECT V1.NumCentre, Nomcentre
FROM Visite V1 INNER JOIN Centre C ON V1.NumCentre=C.NumCentre
GROUP BY V1.NumCentre, NomCentre
HAVING count(passe)= (SELECT ABS(SUM(passe)) FROM visite WHERE
NumCentre= v1.NumCentre);

En adaptant les noms de tes tables et champs, si tu copies et colles ce
sql dans la fenêtre SQL des requêtes, tu auras donc la liste attendue.
Cette requête sera ensuite la source d'un formulaire.

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

bonjour à tous,

je suis sur une base de données qui gère des visites par centre.
un centre peut avoir plusieurs visites, j'ai donc un formulaire centre
avec un sous-formulaire visites. Lorsqu'une visite est terminée, j'ai
une case à cocher (cochée donc)
je souhaite connaître les centres pour lesquels toutes les visites
sont terminées, autrement dit, toutes les cases à cocher sont
cochées.
j'imagine qu'il faut faire une boucle, comparer pour chaque centre
toutes ses visites, et récupérer ces dernières si elles sont toutes
cochées.

mais j'y arrive pas. Des idées?

merci.



Avatar
rose
merci pour ta rapidité Eric.

je comprends légèrement le sql; voici le sql de ma requête:
SELECT [Centres visités].NomCentre, Visites.VisiteTerminée
FROM [Centres visités] INNER JOIN Visites ON [Centres
visités].NomCentre = Visites.NomCentre;

je ne vois pas ce que je dois remplacer; je ne comprends pas ce que
signifie V1 par exemple...
merci pour tes réponses, vraiment merci.

rose
Avatar
Eric
re Rose,

En adaptant à tes noms de tables et champs, ca donne, sauf erreur :

SELECT [Centres visités].NomCentre
FROM [Centres visités] INNER JOIN Visites
ON [Centres visités].NomCentre = Visites.NomCentre
GROUP BY [Centres visités].NomCentre
HAVING count(Visites.VisiteTerminée) (SELECT ABS(SUM(Visites.VisiteTerminée))
FROM Visites
WHERE NumCentre= [Centres visités].NumCentre)

V1 et C sont des alias des noms de tables pour alléger l'écriture du
code SQL (ce n'est pas indispensable)
--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

merci pour ta rapidité Eric.

je comprends légèrement le sql; voici le sql de ma requête:
SELECT [Centres visités].NomCentre, Visites.VisiteTerminée
FROM [Centres visités] INNER JOIN Visites ON [Centres
visités].NomCentre = Visites.NomCentre;

je ne vois pas ce que je dois remplacer; je ne comprends pas ce que
signifie V1 par exemple...
merci pour tes réponses, vraiment merci.

rose



Avatar
Eric
.../...
ben oui, y a une erreur.
Lire NomCentre au lieu de NumCentre dans la requête imbriquée. Ca donne:

SELECT ...
HAVING count(Visites.VisiteTerminée) (SELECT ...
WHERE NomCentre= [Centres visités].NomCentre)
--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

...
En adaptant à tes noms de tables et champs, ca donne, sauf erreur :


Avatar
rose
bingo!

j'en ai des frissons tellement ça marche bien!
merci beaucoup, sincèrement.

j'aimerai bien arrivé à faire ça un jour;
peux-tu m'expliquer ce que veut dire cette partie :
HAVING count(Visites.VisiteTerminée)=
(SELECT ABS(SUM(Visites.VisiteTerminée­))

en tout cas, merci Eric

rose, ravie
Avatar
Eric
re,

...
peux-tu m'expliquer ce que veut dire cette partie :
HAVING count(Visites.VisiteTerminée) > (SELECT ABS(SUM(Visites.VisiteTerminée­))



Il s'agit d'une requête par regroupement {GROUP BY
[Centres visités].NomCentre} sur le nom du centre pour lequel
il y a une clause restrictive {HAVING Count(Visites.VisiteTerminée)} sur
le nombre total de visites qui doit être égal au nombre de visites
terminées {le nb de visites terminées est donnée par le (SELECT
ABS(SUM(Visites.VisiteTerminée)) FROM Visites WHERE NomCentre= [Centres
visités].NomCentre)
Cette derniere requête est corrélée à la 1ere car le nb de visites
terminées est calculée pour *chacun* des centres et non pour tous les
centres ce qui explique la clause WHERE NomCentre= [Centres
visités].NomCentre). Le nom du centre préfixé par le nom de la table,
ici [Centres visités] fait référence au Nom du Centre du tout 1er Select.

En d'autres termes, tu cherches le nom des centres pour lesquels le
nombre total de visites est égal au nombre de visites effectivement
passées, c'est à dire toutes les visites dans ce centre ont été réalisées.

Le champ VisiteTerminée étant un booléen, s'il vaut Oui (ou Vrai), la
valeur correspondante est -1 sinon 0 donc pour calculer le nb de visites
terminées, j'en fais la somme et en prends la valeur absolue. Cette
somme est ensuite comparée au nb total de visites pour le centre. Si
c'est la même,EUREKA :-) , on a trouvé le centre dans lequel toutes les
visites prévues ont été réalisées. Et on fait ce traitement pour chacun
des centres.

Voilou, mais je ne sais pas si c'est plus clair !


rose, ravie



C'était avec un grand plaisir.

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
rose
c'est carrément plus clair...
chapeau pour ta logique, tu as tout à fait compris ma demande.

Merci

A une prochaine