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

Demande d'aide pour requête complexe

12 réponses
Avatar
mission
Bonjour,
J'ai besoin de votre aide pour la création d'une requête complexe :
Soit une table tblActions comprenant, entre autres, les champs Action,
DateAction et Projet.
A partir d'un formulaire frmChoix contenant les champs DateDébut et DateFin,
je dois sortir un état de tous les projets comprenant une action pour
laquelle DateAction est comprise entre DateDébut et DateFin. Pour ça, cette
requête fonctionne bien :
-- SELECT tblActions.CodeProjet, tblActions.CodeAction,
tblActions.DateAction FROM tblActions WHERE (((tblActions.DateAction)
Between [forms]![frmChoix].[DateDébut] And
[forms]![frmChoix].[DateFin])); --
Mon problème vient du fait qu'il faut que je sorte l'historique complet de
chaque projet, c'est-à-dire avec les actions en dehors des marges.....
Je subodore un INNER JOIN de derrière les fagots. Que je suis bien incapable
de réaliser.
Est-ce qu'une bonne âme accepterait de m'aider ?
Merci d'avance pour votre aimable attention.
PG

10 réponses

1 2
Avatar
ze Titi
Bonjour mission

J'ai du mal à comprendre ton problème... Si tu veux toutes les actions
de tes projets, tu crées une autre requête sans les bornes. Non ?
Peux-tu reformuler ton problème ?
Dans ton message <# du lundi
Bonjour,
J'ai besoin de votre aide pour la création d'une requête complexe :
Soit une table tblActions comprenant, entre autres, les champs Action,
DateAction et Projet.
A partir d'un formulaire frmChoix contenant les champs DateDébut et DateFin,
je dois sortir un état de tous les projets comprenant une action pour
laquelle DateAction est comprise entre DateDébut et DateFin. Pour ça, cette
requête fonctionne bien :
-- SELECT tblActions.CodeProjet, tblActions.CodeAction, tblActions.DateAction
FROM tblActions WHERE (((tblActions.DateAction) Between
[forms]![frmChoix].[DateDébut] And [forms]![frmChoix].[DateFin])); --
Mon problème vient du fait qu'il faut que je sorte l'historique complet de
chaque projet, c'est-à-dire avec les actions en dehors des marges.....
Je subodore un INNER JOIN de derrière les fagots. Que je suis bien incapable
de réaliser.
Est-ce qu'une bonne âme accepterait de m'aider ?
Merci d'avance pour votre aimable attention.
PG


--
Voilou !
Cordialement,

Ze Titi

Avatar
mission
Bonjour ze Titi,
Je vais essayer ...
J'ai donc des actions rattachées entre elles par le champ 'projet'.
Je dois établir régulièrement des rapports (états) ne reprenant que les
actions de la période choisie.
Jusque là, ça va.
Mais si une action appartient à un projet qui a des actions antérieures, je
dois intégrer cet historique.
Exemple :
Action A de 11/06 Projet 1
Action B de 12/06 Projet 1
Action C de 12/06 Projet 2
Action D de 01/07 Projet 1
Action E de 01/07 Projet 3
Période choisie :janvier 2007
Mon état devra me ressortir ici les actions A, B et D regroupées sous le
projet 1 et l'action E sous le projet 3. L'action C appartenant au projet 2
qui n'a pas d'action en janvier est négligé.
J'espère que c'est plus clair avec l'exemple. Qui me fait dire d'ailleurs
que je devrais sans doute partir sur l'idée d'une requête reprenant tous les
projets sauf ceux qui n'ont pas d'action dans la période.
Mais ça non plus je ne sais pas faire. Les requêtes avec l'assistant ou avec
les aides de quelques sites que j'exploite honteusement, ça va. Mais ici,
c'est un peu trop balaize pour moi.
Merci en tout cas pour ton intérêt.
PG

Dans son message ,
l'honorable ze Titi écrivait
Bonjour mission

J'ai du mal à comprendre ton problème... Si tu veux toutes les actions
de tes projets, tu crées une autre requête sans les bornes. Non ?
Peux-tu reformuler ton problème ?


Avatar
ze Titi
C'est déjà plus clair comme ça !

Déjà, tu peux supprimer ta borne inférieure dans ta requête existante
puisque tu veux toutes les actions antérieures ou égales à la date
sélectionnée, ce qui te permet d'avoir toutes les actions pour tes
projets.

SELECT tblActions.CodeProjet, tblActions.CodeAction,
tblActions.DateAction FROM tblActions WHERE
(((tblActions.DateAction)<=[forms]![frmChoix].[DateFin])) HAVING
DCount("*","tblActions","Format(DateActions),"yy
mmmm")=Format(Forms!frmchoix!datefin,"yy mmmm"))>=1

A tester, je ne suis pas complètement certain de la syntaxe...

Dans ton message <# du lundi
Bonjour ze Titi,
Je vais essayer ...
J'ai donc des actions rattachées entre elles par le champ 'projet'.
Je dois établir régulièrement des rapports (états) ne reprenant que les
actions de la période choisie.
Jusque là, ça va.
Mais si une action appartient à un projet qui a des actions antérieures, je
dois intégrer cet historique.
Exemple :
Action A de 11/06 Projet 1
Action B de 12/06 Projet 1
Action C de 12/06 Projet 2
Action D de 01/07 Projet 1
Action E de 01/07 Projet 3
Période choisie :janvier 2007
Mon état devra me ressortir ici les actions A, B et D regroupées sous le
projet 1 et l'action E sous le projet 3. L'action C appartenant au projet 2
qui n'a pas d'action en janvier est négligé.
J'espère que c'est plus clair avec l'exemple. Qui me fait dire d'ailleurs que
je devrais sans doute partir sur l'idée d'une requête reprenant tous les
projets sauf ceux qui n'ont pas d'action dans la période.
Mais ça non plus je ne sais pas faire. Les requêtes avec l'assistant ou avec
les aides de quelques sites que j'exploite honteusement, ça va. Mais ici,
c'est un peu trop balaize pour moi.
Merci en tout cas pour ton intérêt.
PG

Dans son message ,
l'honorable ze Titi écrivait
Bonjour mission

J'ai du mal à comprendre ton problème... Si tu veux toutes les actions
de tes projets, tu crées une autre requête sans les bornes. Non ?
Peux-tu reformuler ton problème ?



--
Voilou !
Cordialement,

Ze Titi


Avatar
mission
Merci bien,
J'ai malheureusement une injure-box :
Clause HAVING (DCount("*","tblActions","DateActions" =
Forms!frmchoix!datefin)>=1) sans regroupement.
Comme je ne comprends pas bien le processus .....
(J'ai volontairement ôté le "format" pour les tests)
Puis-je abuser ?


Dans son message ,
l'honorable ze Titi écrivait
C'est déjà plus clair comme ça !

Déjà, tu peux supprimer ta borne inférieure dans ta requête existante
puisque tu veux toutes les actions antérieures ou égales à la date
sélectionnée, ce qui te permet d'avoir toutes les actions pour tes
projets.

SELECT tblActions.CodeProjet, tblActions.CodeAction,
tblActions.DateAction FROM tblActions WHERE
(((tblActions.DateAction)<=[forms]![frmChoix].[DateFin])) HAVING
DCount("*","tblActions","Format(DateActions),"yy
mmmm")=Format(Forms!frmchoix!datefin,"yy mmmm"))>=1

A tester, je ne suis pas complètement certain de la syntaxe...

Dans ton message <# du lundi
Bonjour ze Titi,
Je vais essayer ...
J'ai donc des actions rattachées entre elles par le champ 'projet'.
Je dois établir régulièrement des rapports (états) ne reprenant que
les actions de la période choisie.
Jusque là, ça va.
Mais si une action appartient à un projet qui a des actions
antérieures, je dois intégrer cet historique.
Exemple :
Action A de 11/06 Projet 1
Action B de 12/06 Projet 1
Action C de 12/06 Projet 2
Action D de 01/07 Projet 1
Action E de 01/07 Projet 3
Période choisie :janvier 2007
Mon état devra me ressortir ici les actions A, B et D regroupées
sous le projet 1 et l'action E sous le projet 3. L'action C
appartenant au projet 2 qui n'a pas d'action en janvier est négligé.
J'espère que c'est plus clair avec l'exemple. Qui me fait dire
d'ailleurs que je devrais sans doute partir sur l'idée d'une requête
reprenant tous les projets sauf ceux qui n'ont pas d'action dans la
période. Mais ça non plus je ne sais pas faire. Les requêtes avec
l'assistant
ou avec les aides de quelques sites que j'exploite honteusement, ça
va. Mais ici, c'est un peu trop balaize pour moi.
Merci en tout cas pour ton intérêt.
PG

Dans son message ,
l'honorable ze Titi écrivait
Bonjour mission

J'ai du mal à comprendre ton problème... Si tu veux toutes les
actions de tes projets, tu crées une autre requête sans les bornes.
Non ? Peux-tu reformuler ton problème ?






Avatar
ze Titi
Ach, j'avais oublié le regroupement...

SELECT tblActions.CodeProjet, tblActions.CodeAction,
tblActions.DateAction FROM tblActions WHERE
(((tblActions.DateAction)<=[forms]![frmChoix].[DateFin])) GROUP BY
DCount("*","tblActions","Format(DateActions),"yy
mmmm")=Format(Forms!frmchoix!datefin,"yy mmmm") HAVING
DCount("*","tblActions","Format(DateActions),"yy
mmmm")=Format(Forms!frmchoix!datefin,"yy mmmm")>=1


Dans ton message <# du lundi
Merci bien,
J'ai malheureusement une injure-box :
Clause HAVING (DCount("*","tblActions","DateActions" =
Forms!frmchoix!datefin)>=1) sans regroupement.
Comme je ne comprends pas bien le processus .....
(J'ai volontairement ôté le "format" pour les tests)
Puis-je abuser ?


Dans son message ,
l'honorable ze Titi écrivait
C'est déjà plus clair comme ça !

Déjà, tu peux supprimer ta borne inférieure dans ta requête existante
puisque tu veux toutes les actions antérieures ou égales à la date
sélectionnée, ce qui te permet d'avoir toutes les actions pour tes
projets.

SELECT tblActions.CodeProjet, tblActions.CodeAction,
tblActions.DateAction FROM tblActions WHERE
(((tblActions.DateAction)<=[forms]![frmChoix].[DateFin])) HAVING
DCount("*","tblActions","Format(DateActions),"yy
mmmm")=Format(Forms!frmchoix!datefin,"yy mmmm"))>=1

A tester, je ne suis pas complètement certain de la syntaxe...

Dans ton message <# du lundi
Bonjour ze Titi,
Je vais essayer ...
J'ai donc des actions rattachées entre elles par le champ 'projet'.
Je dois établir régulièrement des rapports (états) ne reprenant que
les actions de la période choisie.
Jusque là, ça va.
Mais si une action appartient à un projet qui a des actions
antérieures, je dois intégrer cet historique.
Exemple :
Action A de 11/06 Projet 1
Action B de 12/06 Projet 1
Action C de 12/06 Projet 2
Action D de 01/07 Projet 1
Action E de 01/07 Projet 3
Période choisie :janvier 2007
Mon état devra me ressortir ici les actions A, B et D regroupées
sous le projet 1 et l'action E sous le projet 3. L'action C
appartenant au projet 2 qui n'a pas d'action en janvier est négligé.
J'espère que c'est plus clair avec l'exemple. Qui me fait dire
d'ailleurs que je devrais sans doute partir sur l'idée d'une requête
reprenant tous les projets sauf ceux qui n'ont pas d'action dans la
période. Mais ça non plus je ne sais pas faire. Les requêtes avec
l'assistant
ou avec les aides de quelques sites que j'exploite honteusement, ça
va. Mais ici, c'est un peu trop balaize pour moi.
Merci en tout cas pour ton intérêt.
PG

Dans son message ,
l'honorable ze Titi écrivait
Bonjour mission

J'ai du mal à comprendre ton problème... Si tu veux toutes les
actions de tes projets, tu crées une autre requête sans les bornes.
Non ? Peux-tu reformuler ton problème ?





--
Voilou !
Cordialement,

Ze Titi




Avatar
mission
En enlevant les formats de date (problème de guillemets je pense, mais ce
n'est pas important : je peux travailler avec des dates réelles) j'ai une
nouvelle insulte me disant que mes champs CodeProjet, CodeAction et
DateAction ne font pas partie de la fonction d'agrégat.
J'ai tenté ça (extrait du query en mode sql):
SELECT [tblActions].[CodeProjet], [tblActions].[CodeAction],
[tblActions].[DateAction],
DCount("*","tblActions","DateAction")<=[Forms]![frmchoix]![datefin] AS Expr1
FROM tblActions WHERE
((([tblActions].[DateAction])<=[forms]![frmChoix].[DateFin]))
GROUP BY [tblActions].[CodeProjet], [tblActions].[CodeAction],
[tblActions].[DateAction],
DCount("*","tblActions","DateAction")<=[Forms]![frmchoix]![datefin]
HAVING
(((DCount("*","tblActions","DateAction")=[Forms]![frmchoix]![datefin])>=1));
qui me renvoie un résultat vide alors que j'ai bien des données :-(

Honnêtement, je ne comprends pas comment DCOUNT va me filtrer les
'CodeProjet' n'ayant pas de 'DateAction' dans la période définie.
Os court :-)
Au fait, je n'ai pas précisé que je suis en Access 2000

Dans son message ,
l'honorable ze Titi écrivait
Ach, j'avais oublié le regroupement...

SELECT tblActions.CodeProjet, tblActions.CodeAction,
tblActions.DateAction FROM tblActions WHERE
(((tblActions.DateAction)<=[forms]![frmChoix].[DateFin])) GROUP BY
DCount("*","tblActions","Format(DateActions),"yy
mmmm")=Format(Forms!frmchoix!datefin,"yy mmmm") HAVING
DCount("*","tblActions","Format(DateActions),"yy
mmmm")=Format(Forms!frmchoix!datefin,"yy mmmm")>=1


Avatar
ze Titi
Sous quel format saisis-tu ta date ? C'est un format Date ou bien une
adaptation d'un champ texte ?

Dans ton message du lundi
En enlevant les formats de date (problème de guillemets je pense, mais ce
n'est pas important : je peux travailler avec des dates réelles) j'ai une
nouvelle insulte me disant que mes champs CodeProjet, CodeAction et
DateAction ne font pas partie de la fonction d'agrégat.
J'ai tenté ça (extrait du query en mode sql):
SELECT [tblActions].[CodeProjet], [tblActions].[CodeAction],
[tblActions].[DateAction],
DCount("*","tblActions","DateAction")<=[Forms]![frmchoix]![datefin] AS Expr1
FROM tblActions WHERE
((([tblActions].[DateAction])<=[forms]![frmChoix].[DateFin]))
GROUP BY [tblActions].[CodeProjet], [tblActions].[CodeAction],
[tblActions].[DateAction],
DCount("*","tblActions","DateAction")<=[Forms]![frmchoix]![datefin]
HAVING
(((DCount("*","tblActions","DateAction")=[Forms]![frmchoix]![datefin])>=1));
qui me renvoie un résultat vide alors que j'ai bien des données :-(

Honnêtement, je ne comprends pas comment DCOUNT va me filtrer les
'CodeProjet' n'ayant pas de 'DateAction' dans la période définie.
Os court :-)
Au fait, je n'ai pas précisé que je suis en Access 2000

Dans son message ,
l'honorable ze Titi écrivait
Ach, j'avais oublié le regroupement...

SELECT tblActions.CodeProjet, tblActions.CodeAction,
tblActions.DateAction FROM tblActions WHERE
(((tblActions.DateAction)<=[forms]![frmChoix].[DateFin])) GROUP BY
DCount("*","tblActions","Format(DateActions),"yy
mmmm")=Format(Forms!frmchoix!datefin,"yy mmmm") HAVING
DCount("*","tblActions","Format(DateActions),"yy
mmmm")=Format(Forms!frmchoix!datefin,"yy mmmm")>=1



--
Voilou !
Cordialement,

Ze Titi


Avatar
mission
C'est un format date tout bête.
Je mets une base test sur ci-joint, si ça peut t'aider à m'aider....
http://cjoint.com/?bElft0rzHc
Elle contient 2 requêtes réalisées à partir de tes données.

Merci encore et toujours pour ton attention.

Dans son message ,
l'honorable ze Titi écrivait
Sous quel format saisis-tu ta date ? C'est un format Date ou bien une
adaptation d'un champ texte ?



Avatar
ze Titi
SELECT tblActions.CodeProjet, tblActions.CodeAction, tblActions.CodeProjet
FROM tblActions
WHERE (((tblActions.DateAction)<=[forms]![frmChoix].[DateFin]))
GROUP BY tblActions.CodeProjet, tblActions.CodeAction, tblActions.CodeProjet
HAVING (((DCount("*","tblActions","CodeProjet=" & [CodeProjet] & " AND DateAction BETWEEN #" & [forms]![frmChoix].[DateDébut] & "# AND #" & [forms]![frmChoix].[DateFin] & "#"))>0));

C'est un format date tout bête.
Je mets une base test sur ci-joint, si ça peut t'aider à m'aider....
http://cjoint.com/?bElft0rzHc
Elle contient 2 requêtes réalisées à partir de tes données.

Merci encore et toujours pour ton attention.

Dans son message ,
l'honorable ze Titi écrivait
Sous quel format saisis-tu ta date ? C'est un format Date ou bien une
adaptation d'un champ texte ?



--
Voilou !
Cordialement,

Ze Titi


Avatar
mission
SUPERBE !
Mille mercis.
En plus, je crois à peu près comprendre la logique de cette requête.
Je vais maintenant pouvoir l'affiner pour obtenir ce dont j'ai besoin.
Ton aide patiente m'a beaucoup aidé.
Bonne continuation.
Cordialement.
PG
Dans son message ,
l'honorable ze Titi écrivait
SELECT tblActions.CodeProjet, tblActions.CodeAction,
......


1 2