Requête de non correspondance qui ne fonctionne pas [Résolu]

Signaler
-
Messages postés
15637
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2021
-
Bonjour,
Je bloque sur une requête de non correspondance qui donne un résultât erroné et j'aurai vraiment besoin de vos compétences.
Mon Objectif est d'obtenir la liste des personnes qui n'ont pas assisté à une action.

Ma requête utilise deux tables, la table Personnel et la table Participant
Elles sont reliés par deux champs pour la table Personnel : Personnel.Personnel_Num et pour Participant : Participant.Participant_Personnel_Num.

J'ai besoin de préfiltrer filtrer Personnel avec : Personnel.Personnel_Num_Client=330 et Personnel.Personnel_Activite=-1 .

Pour Participant je préfiltre avec : Participant.Participant_Présent=-1 et Participant.Participant_Module_Num=1528785947.

La requête est écrite de la manière suivante :


SELECT Personnel.Personnel_Num, Personnel.Personnel_Equipe, Personnel.Personnel_Num_Client, Personnel.Personnel_Activite, Personnel.Personnel_Prenom, Personnel.Personnel_Nom
FROM Personnel
WHERE (((Personnel.Personnel_Num_Client)=330) AND ((Personnel.Personnel_Activite)=-1) AND ((Exists (SELECT Participant.Participant_Personnel_Num, Participant.Participant_Module_Num FROM Participant WHERE
Participant.Participant_Personnel_Num=Personnel.Personnel_Num AND Participant.Participant_Présent=-1 AND Participant.Participant_Module_Num=1528785947))=False));




Le résultat de la requête me donne une liste qui intègre des personnes qui ont déjà assisté à l'action ciblée, seuls quelques salariés sont extraits.

Pourriez vous me dire ou est ce que vous voyez un soucis.
Je vous en remercie par avance.

5 réponses

Messages postés
15637
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2021
855
bonjour, et ceci?
SELECT Personnel.Personnel_Num, Personnel.Personnel_Equipe,
 Personnel.Personnel_Num_Client, Personnel.Personnel_Activite, 
Personnel.Personnel_Prenom, Personnel.Personnel_Nom
FROM Personnel left join Participant 
on Participant.Participant_Personnel_Num = Personnel.Personnel_Num
where Personnel.Personnel_Num_Client =330
 AND  Personnel.Personnel_Activite
 AND  Participant.Participant_Présent
 AND Participant.Participant_Module_Num = 1528785947
and Participant.Participant_Personnel_Num is null;
Bonsoir, j'ai essayé et malheureusement non..... même si à la lecture du code ça devrait fonctionner. Merci néanmoins pour votre proposition.
Messages postés
15637
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2021
855
à toi maintenant d'expliquer factuellement la différence entre ce que tu obtiens et ce que tu souhaites.
qu'est-ce qui manque, qu'est)ce qui est en trop.
en partageant, bien sûr, les données correspondantes dans les deux tables.

ta description initiale était extrêmement floue.
tu mélangeais ce que tu voulais obtenir et comment tu essayais de l'obtenir.
tu mentionnais des préfiltres sans préciser si tu voulais inclure ou exclure certaines conditions.
Merci pour votre précédent retour.

J'ai 2 tables. PERSONNEL et PARTICIPANT.
Je souhaite obtenir par une requête de non correspondance tous les personnels qui n'ont pas participé à une action.
J'ai retravaillé PARTICIPANT pour ne plus préfiltrer sur PERSONNEL.

Plus clairement je souhaite obtenir les Numero, Nom, Prenom dans PERSONNEL des personnes Actives qui n'ont pas suivi l'action 906 et appartenant au client 330.

Donc maintenant dans PERSONNEL j'ai :
Personnel_Num
Personnel_Nom
Personnel_Prenom
Personnel_Num_Client (qui doit être égal à 330)
Personnel_Activite (qui doit être égal à -1 / vrai)

Dans Participant j'ai :
Participant_Personnel_Num (lie à Personnel_Num ) Est Null
Participant_Client_Num (qui doit être égal à 330)
Participant_Module_Num (qui doit être égal à 906)


Voici le code de la requête que j'ai mis en place et qui ne donne aucun résultat. (ligne de recordset vide).


SELECT Personnel.Personnel_Num, Personnel.Personnel_Num_Client, Personnel.Personnel_Activite, Personnel.Personnel_Prenom, Personnel.Personnel_Nom, Participant.Participant_Personnel_Num, Participant.Participant_Client_Num
FROM Personnel LEFT JOIN Participant ON Personnel.[Personnel_Num] = Participant.[Participant_Personnel_Num]
WHERE (((Personnel.Personnel_Num_Client)=330) AND ((Personnel.Personnel_Activite)=True) AND ((Participant.Participant_Personnel_Num) Is Null) AND ((Participant.Participant_Module_Num)=906) AND ((Participant.Participant_Client_Num)=330));



J'espère que mes explications vous permettront de mieux cerner mon propos.
Cdlt.
Messages postés
15637
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2021
855
à toi maintenant d'expliquer factuellement la différence entre ce que tu obtiens et ce que tu souhaites.
qu'est-ce qui manque, qu'est-ce qui est en trop.
en partageant, bien sûr, les données correspondantes dans les deux tables.
Sur ce que je souhaite et ce que j'obtiens je ne sais pas comment le dire différemment que précédemment.
Je souhaite la liste des salariés qui n'ont pas participé à une action.
J'obtiens un recordset vide.

Après plusieurs tests sur l'expression de la requête de non correspondance je pense que filtrer sur la partie droite de la requête n'est pas possible car dès qu'un élément de filtre est rajouté par exemple "Participant_Client_Num=330" le résultat est un recordset vide.

J'ai néanmoins obtenu le bon résultat en procédant différemment mais la forme n'est pas satisfaisante. Je ne filtre plus dans la requête de non correspondance. La requête de non correspondance se fait entre la table PERSONNEL et une requête préparatoire qui intègre les filtrages que je souhaite.
Dans ce cas le résultat obtenu est correct : la liste des salariés qui n'ont pas participé à une action est affichée.


La requête de NC est nommée PRINCIPAL elle appelle une autre requête qui intègre les filtrage que se nome PREPA.

PRINCIPAL :


SELECT Personnel.Personnel_Num_Client, Personnel.Personnel_Activite, Personnel.Personnel_Num, Personnel.Personnel_Equipe, Personnel.Personnel_Prenom, Personnel.Personnel_Nom
FROM Personnel LEFT JOIN PREPA ON Personnel.[Personnel_Num] = PREPA.[Participant_Personnel_Num]
WHERE (((Personnel.Personnel_Num_Client)=330) AND ((Personnel.Personnel_Activite)=True) AND ((PREPA.Participant_Personnel_Num) Is Null));




PREPA :


SELECT Participant.Participant_Personnel_Num, Participant.Participant_Client_Num, Participant.Participant_Module_Num, Participant.Participant_Annee_Num
FROM Participant
WHERE (((Participant.Participant_Client_Num)=330) AND ((Participant.Participant_Module_Num)=906) AND ((Participant.Participant_Annee_Num)>=Year(Now())-3));




Par contre je dois absolument éviter de faire appel à la requête PREPA mais l'intégrer dans le texte de PRINCIPAL pour que dans le corps de mon programme, 330 et 906 soient remplacés par des variables de session........ je ne sais pas du tout comment faire.

Vous est il possible de me montrer comment Modifier PRINCIPAL aux deux endroit ou prépa apparait dans le texte?


PREPA devrait s'écrire:


SELECT Participant.Participant_Personnel_Num, Participant.Participant_Client_Num, Participant.Participant_Module_Num, Participant.Participant_Annee_Num
FROM Participant
WHERE (((Participant.Participant_Client_Num)="&Session("UtilCompte")&") AND ((Participant.Participant_Module_Num)="&Session("UtilModule")&") AND ((Participant.Participant_Annee_Num)>=Year(Now())-3));



Je vous remercie par avance pour votre retour.
Messages postés
15637
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2021
855
"comment le dire différemment que précédemment": en donnant des faits.
quel données veux-tu voir dans le résultat et n'y vois-tu pas?
que contiennent tes tables.
bref, donner un exemple à partir duquel nous pouvons travailler.
par exemple, partager ton fichier.
Messages postés
15637
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2021
855
pour insérer la source de PREPA dans la requête principale:
 ... FROM Personnel
LEFT JOIN
 (SELECT Participant.Participant_Personnel_Num, Participant.Participant_Client_Num, Participant.Participant_Module_Num, Participant.Participant_Annee_Num
FROM Participant
WHERE (((Participant.Participant_Client_Num)="&Session("UtilCompte")&") 
AND ((Participant.Participant_Module_Num)="&Session("UtilModule")&") 
AND ((Participant.Participant_Annee_Num)>=Year(Now())-3)))
 as PREPA
ON ...
Voici le requête finale qui fonctionne :


SELECT Personnel.Personnel_Num_Client, Personnel.Personnel_Activite, Personnel.Personnel_Num, Personnel.Personnel_Equipe, Personnel.Personnel_Prenom, Personnel.Personnel_Nom
FROM Personnel
LEFT JOIN

(SELECT Participant.Participant_Personnel_Num, Participant.Participant_Client_Num, Participant.Participant_Module_Num, Participant.Participant_Annee_Num
FROM Participant
WHERE (((Participant.Participant_Client_Num)=330)
AND ((Participant.Participant_Module_Num)=906 )
AND ((Participant.Participant_Annee_Num)>=Year(Now())-3)))

AS PREPA

ON Personnel.[Personnel_Num] = PREPA.[Participant_Personnel_Num]
WHERE (((Personnel.Personnel_Num_Client)=330) AND ((Personnel.Personnel_Activite)=True) AND ((PREPA.Participant_Personnel_Num) Is Null));


J'y réintégrerai dans le code les variables de session.

Je vous remercie, yg_be, pour votre patience et pour l'aide que vous m'avez apporté durant tout un Samedi et un Dimanche matin.

Bien cordialement.
Messages postés
15637
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2021
855
peux-tu alors marquer la discussion comme résolue?