Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Besoin d'aide pour une requête complexe sur plusieurs tables

2 réponses
Avatar
Denis P
Bonjour tout le monde,

Depuis quelques jours je tente de réaliser un requête qui me semble assez
complexe, en tout cas pour moi. Je voudrais bien vous expliquer mon problème
de façon simple et pas trop long, mais je crois que la complexité du
problème m'oblige à donner le plus de détails possibles. Donc vous
m'excuserai pour la longueur de ce message.

Pour commencer voici une partie de la structure de ma table qui est sous
Access 2000.

T_Appel

app_id numéro auto
app_client_id numérique
app_termine oui/non

T_Appel_Desc

app_desc_id numéro auto
app_desc_app_id correspond avec T_Appel
app_desc_emp_id_ref numérique


T_Appel_Retour

app_ret_id numéro auto
app_ret_app_id correspond avec T_Appel
app_ret_emp_id_ref numérique

T_Appel_Service

app_serv_id numéro auto
app_serv_app_id correspond avec T_Appel
app_serv_emp_id_ref numérique


T_Appel_Activite

app_act_id numéro auto
app_act_app_id correspond avec T_Appel
app_act_tbl_id numéro de la table où a eu lieu l'activité( par exemple 1
pour T_Appel_Desc)
app_act_oper_id numéro de l'activité dans la table correspondante(par
exemple 2 qui correspondrait avec app_desc_id de T_Appel_Desc)

Disons que ceci est un résumé d'une partie ma de base de données. Question
d'abréger un peu je n'ai pas mentionné tous les champs de chaque table.
C'est pourquoi je semble avoir 3 tables quasiment identique, mais en fait
chacune doit enregistrer des données différentes et c'est la raison pour
quoi j'en ai 3. En fait j'ai 6 tables du même genre que celles-ci mais je ne
croyais pas utile de toutes les énumérer.

Pour essayer que ce soit le plus clair poosible pour vous, je vous explique
le principe du programme. Sur réception d'un appel, le numéro du client
s'enregistre dans T_Appel, la description de l'appel et l'employé à qui
l'appel est référé s'engeristre dans T_Appel_Desc. Puisqu'une activité vient
d'avoir lieu, dans T_Appel_Activité s'enregistre le numéro de l'appel, soit
app_id, le numéro de la table, soit 1 pour désigner la table T_Appel_Desc,
le numéro de l'activité, soit app_desc_id. Ensuite pour le retour d'appel,
le numéro d'appel, soit app_id, et le numéro d'employé à qui est référé la
suite de l'appel est enregistré dans T_Appel_Retour. L'activité est
également enregistré dans T_Appel_Activite selon le même principe que
précédemment. Le processus est donc le même pour chaque processus d'un
appel.

Donc ce que je souhaite obtenir par la requête que je tente de faire
désespérément, c'est d'obtenir tous les appels qui ne sont pas classé
terminé dont la dernière activité est référé à un employé en particulier. Je
dois donc trouvé la dernière activité pour chaque appel de ma table T_Appel
dans ma table T_Appel_Activite, ensuite aller voir dans mes tables
T_Appel_Desc, T_Appel_Retour et T_Appel_Service si l'activité est référé à
un employé en particulier.

Espérant que les explications que je vous ai fourni seront assez claires
pour vous permettre de me donner une piste de solution pour réaliser cette
requête. S'il vous manque d'informations, dites-le et je vous donnerai plus
de détails.

Merci à l'avance pour votre précieuse aide.

@ +

Denis P

2 réponses

Avatar
Maxence HUBICHE
Bonjour, Hormis le fait que je pense qu'il y a un petit
problème dans l'architecture de ta base, je penseq ue tu
n'y arriveras pas en une seule requête.
Eventuellement en 3 ou 4, mais pas en une seule.

La première devra, pour chaque app_id de activité,
retrouver le act_id le plus élevé (donc le plus récent)
qryMaxParActivite_Prepa:=>
SELECT MAX(app_act_id) As act_Id, app_act_app_id
FROM T_Appel_Activite
GROUP BY app_act_app_id

Grace à cette requête, tu pourras récupérer la table de
l'activité concernée :
qryMaxParActivite :=>
SELECT app_act_tbl_id as tbl_ID, app_act_oper_id as
Oper_ID, app_act_app_id As App_ID
FROM T_Appel_Activite
INNER JOIN qryMaxParActivite_Prepa
ON
qryMaxParActivite_Prepa.act_ID=T_Appel_Activite.app_act_id

Maintenant, tu peux avoir le lien vers les données de
chacune des tables, que tu récupèreras par une requête
union :
qryListingASuivre :=>
SELECT listeDesChamps
FROM T_Appel_Desc
WHERE app_desc_id
IN(SELECT Oper_ID
FROM qryMaxParActivite
WHERE tbl_ID=2)
UNION
SELECT listeDesChamps
FROM T_Appel_Retour
WHERE app_ret_id
IN(SELECT Oper_ID
FROM qryMaxParActivite
WHERE tbl_ID=3)
UNION
SELECT listeDesChamps
FROM T_Appel_Service
WHERE app_serv_id
IN(SELECT Oper_ID
FROM qryMaxParActivite
WHERE tbl_ID=4)

ATTENTION? dans tous les cas, là où j'ai mis Liste des
champs, tu devras mettre la liste réelle des champs qui
t'intéressent, sachant qu'ils doivent être du même nombre
et dans le même Ordre, dans chaque clause SELECT.


J'espère que ca te fera avancer.
Avatar
Denis P
Merci Maxence,

Tu m'as donné au moins un bon début de piste et je crois bien arriver à me
débrouiller avec tout cela. Je vais sûrement trouver le moyen d'adapter
tout cela à mon programme. Je n'avais vraiment pas pensé faire une requête
Union et c'est sûrement là que je bloquais.

Merci encore de ton aide

@ +

Denis P
"Maxence HUBICHE" a écrit dans le
message de news:049301c3bb8a$e9f67530$
Bonjour, Hormis le fait que je pense qu'il y a un petit
problème dans l'architecture de ta base, je penseq ue tu
n'y arriveras pas en une seule requête.
Eventuellement en 3 ou 4, mais pas en une seule.

La première devra, pour chaque app_id de activité,
retrouver le act_id le plus élevé (donc le plus récent)
qryMaxParActivite_Prepa:=>
SELECT MAX(app_act_id) As act_Id, app_act_app_id
FROM T_Appel_Activite
GROUP BY app_act_app_id

Grace à cette requête, tu pourras récupérer la table de
l'activité concernée :
qryMaxParActivite :=>
SELECT app_act_tbl_id as tbl_ID, app_act_oper_id as
Oper_ID, app_act_app_id As App_ID
FROM T_Appel_Activite
INNER JOIN qryMaxParActivite_Prepa
ON
qryMaxParActivite_Prepa.act_ID=T_Appel_Activite.app_act_id

Maintenant, tu peux avoir le lien vers les données de
chacune des tables, que tu récupèreras par une requête
union :
qryListingASuivre :=>
SELECT listeDesChamps
FROM T_Appel_Desc
WHERE app_desc_id
IN(SELECT Oper_ID
FROM qryMaxParActivite
WHERE tbl_ID=2)
UNION
SELECT listeDesChamps
FROM T_Appel_Retour
WHERE app_ret_id
IN(SELECT Oper_ID
FROM qryMaxParActivite
WHERE tbl_ID=3)
UNION
SELECT listeDesChamps
FROM T_Appel_Service
WHERE app_serv_id
IN(SELECT Oper_ID
FROM qryMaxParActivite
WHERE tbl_ID=4)

ATTENTION? dans tous les cas, là où j'ai mis Liste des
champs, tu devras mettre la liste réelle des champs qui
t'intéressent, sachant qu'ils doivent être du même nombre
et dans le même Ordre, dans chaque clause SELECT.


J'espère que ca te fera avancer.