Probleme requete sql

Signaler
Messages postés
15
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
23 juin 2004
-
Messages postés
15
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
23 juin 2004
-
Bonjour, voici ma requete SQL, sous access, mais j'ai une erreur de syntaxe et je n'arrive pas a voir ou elle est. Je n'ai rien trouver dans l'aide donc je vous demande votre avis.

Voila la requete :

SELECT Contact_Evenement.Co_Ev_Date,
(If(Format(Month([Co_Ev_Date]),"00" ) = [Formulaires]![Menu Edition]![MoisA], Format(Month([Co_Ev_Date]),"00")) AS Expr1,
(If(Format(Month([Co_Ev_Date]),"00" ) = DateAdd("m",1,[Formulaires]![Menu Edition]![MoisA]), Format(Month([Co_Ev_Date]),"00")) AS Expr2,
(If(Format(Month([Co_Ev_Date]),"00" ) = DateAdd("m",2,[Formulaires]![Menu Edition]![MoisA]), Format(Month([Co_Ev_Date]),"00")) AS Expr3,
Client.Cl_Nom,
Site.Si_Nom,
Contact.Co_Num,
Contact.Co_Nom,
Contact.Co_Prenom
FROM (Client INNER JOIN (Contact LEFT JOIN Site ON Contact.Co_Site Site.Si_Num) ON Client.Cl_Num Contact.Co_Client) INNER JOIN Contact_Evenement ON Contact.Co_Num = Contact_Evenement.Co_Ev_Contact

WHERE ((Format(Month([Co_Ev_Date]),"00"))=[Formulaires]![Menu Edition]![MoisA])
OR ((Format(Month([Co_Ev_Date]),"00"))=DateAdd("m",1,[Formulaires]![Menu Edition]![MoisA]))
OR ((Format(Month([Co_Ev_Date]),"00"))=DateAdd("m",2,[Formulaires]![Menu Edition]![MoisA]));

Cette requete permet "normalement" de selectionner d'afficher dans une 1ere colonne le mois selectionner dan le formualaire "Menu edition" ex : janvier, dans la 2eme colonne mois+1 dc fevrier et dans la 3eme mois+2 dc mars.

Si ce n'est pas clair poser moi des questions et si vous avez une autre solution faites vos propositions.

Merci beaucoup a l'avance

:)

27 réponses

Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
18
Salut, comment as-tu construit cette requete ? avec un assistant ou par toi même ?
Et avec quelle version d'access ?

Cordialement

CanisLupus
Messages postés
120
Date d'inscription
jeudi 31 octobre 2002
Statut
Membre
Dernière intervention
2 août 2004

bonjour,

au lieu de [Formulaires]![Menu Edition]![MoisA]

j'aurais mis :

forms.[menu edition].form![moisa]

mais je comprends mal l'objectif :

si tu as des données correspondant aux mois m+1 et m+2 par rapport au mois sélectionné dans le même enregistrement Client, il faut sélectionner ces mois.

Or, j'ai l'impression que tu veux faire une requête générant un tableau croisé dynamique car les données semblent être organisées avec la date en clef.

Dans ces conditions, utilise plutôt l'assistant pour voir comment il génère la requête

Colibri
Messages postés
15
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
23 juin 2004

C sous access 2002. Et pour la requete je l'ai faite avec des collegues.

En fait on selectionne qu'un seul mois dans le formulaire et il faut que 3 mois apparaissent. Si je selectionne Janvier il faut que Janvier, Fevrier et Mars apparaissent.

Je vais tester avec l'assistant

Merci

:)
Messages postés
15
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
23 juin 2004

J'ai testé avec forms.[menu edition].form![moisa] ca m'indique toujours une erreur de syntaxe et le curseur se positionne sur le AS de la 4eme ligne.

:sad)

Depuis hier je galere avec 2 de mes collegues c la misere...
Messages postés
120
Date d'inscription
jeudi 31 octobre 2002
Statut
Membre
Dernière intervention
2 août 2004

tout dépend de la structure de ta base de données :

si tu as :
client mois1 mois2 mois3

tu peux faire comme ceci (à adapter, bien sûr)
i = mois sélectionné
j = i + 1
k = i + 2
select mois & i, mois & j, mois & k.....

le nom de tes champs doivent se préter à ce genre d'astuce; avec CO_EV_DATE, ça me semble mal parti.

J'ai plutôt l'impression que ta base est :
client co_ev_date
client co_ev_date
........
Dans ce cas, ce n'est pas une requête de sélection banale mais de tableau croisé

Colibri
Messages postés
48
Date d'inscription
lundi 1 septembre 2003
Statut
Membre
Dernière intervention
5 avril 2006

Perso je connais pas cette fonction, t'ais sur qu'elle existe
Moi je connais IIf(<<expression>>,<<siVrai>>,<<siFaux>>)

Alors c'est peut etre ca qui va pas

Oh et puis pour le forms.[menu edition].form![moisa] , c'est pas bon ce que tu avais mis au départ était bon.
Messages postés
15
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
23 juin 2004

En fait MoisA c le mois que tu selectionne au debut, et Co_Ev_Date est la date de naissance dans la table Contact_Evenement. La date de naissance est jj/mm/aa et MoisA n'affiche que le mois. C'est pour cela que j'utilise (Format(Month([Co_Ev_Date]),"00")), pour convertir ma date.

Par contre je n'est pas mois1 et mois2 dans une table, ces valeurs doivent etre calculer. On doit ajouter 1 a MoisA pour avoir le mois suivant et 2 a MoisA pour avoir le mois encore d'apres.

Je ne suis pas sur que cette fonction existe c'est un collegue qui m'a donné celle la.
Messages postés
48
Date d'inscription
lundi 1 septembre 2003
Statut
Membre
Dernière intervention
5 avril 2006

Je sais pas si ca peut aider mais j'ai fait un copier/coller de ta requête dans access et il me met effectivement une erreur de syntaxe. En fait il y a des parenthèses en trop (en rouge) :

SELECT Contact_Evenement.Co_Ev_Date,
(If(Format(Month([Co_Ev_Date]),"00" ) = [Formulaires]![Menu Edition]![MoisA], Format(Month([Co_Ev_Date]),"00")) AS Expr1,
(If(Format(Month([Co_Ev_Date]),"00" ) = DateAdd("m",1,[Formulaires]![Menu Edition]![MoisA]), Format(Month([Co_Ev_Date]),"00")) AS Expr2,
(If(Format(Month([Co_Ev_Date]),"00" ) = DateAdd("m",2,[Formulaires]![Menu Edition]![MoisA]), Format(Month([Co_Ev_Date]),"00")) AS Expr3,
Client.Cl_Nom,
Site.Si_Nom,
Contact.Co_Num,
Contact.Co_Nom,
Contact.Co_Prenom
FROM (Client INNER JOIN (Contact LEFT JOIN Site ON Contact.Co_Site Site.Si_Num) ON Client.Cl_Num Contact.Co_Client) INNER JOIN Contact_Evenement ON Contact.Co_Num = Contact_Evenement.Co_Ev_Contact

WHERE ((Format(Month([Co_Ev_Date]),"00"))=[Formulaires]![Menu Edition]![MoisA])
OR ((Format(Month([Co_Ev_Date]),"00"))=DateAdd("m",1,[Formulaires]![Menu Edition]![MoisA]))
OR ((Format(Month([Co_Ev_Date]),"00"))=DateAdd("m",2,[Formulaires]![Menu Edition]![MoisA]));

Pour l'histoire de tes mois j'ai pas tout compris :
La date de naissance tu la stocke sous quelle format?

Et tu va faire cette requête où? (dans un formulaire, un état, du code VBA...)

car vu ce que tu veux faire je pense que ca serai plus simple de faire une table Mois qui contient douze lignes et trois colonnes. Comme ca tu eviterais tous tes (Format(Month([Co_Ev_Date]),"00")

A voir
Messages postés
15
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
23 juin 2004

Ok donc tu as raison c'était les parenthéses par contre maintenant quand je veux l'exécuter il me dit : fonction 'If' non définie dans l'expression.

La date de naissance est stockée sous le format jj/mm/aa
Cette requete est exécutée dans un état.
Messages postés
48
Date d'inscription
lundi 1 septembre 2003
Statut
Membre
Dernière intervention
5 avril 2006

Alors l'erreur te dis qu'il connait pas if donc c'est que ca existe peut etre pas.

Et puis je vois pas trop pourquoi tu fais si compliqué.

Si tu fais une table avec quatre colonnes : Num_Mois, nom_Mois, nom_Mois+1, nom_Mois+2

Ca serra beaucoup plus simple que ce que tu as pour le même.

SELECT Contact_Evenement.Co_Ev_Date,
ListeMois.nom_Mois,
ListeMois.nom_Mois+1,
ListeMois.nom_Mois+2,
Client.Cl_Nom,
Site.Si_Nom,
Contact.Co_Num,
Contact.Co_Nom,
Contact.Co_Prenom

FROM Client, Contact, Site, Contact_Evenement, ListeMois

WHERE Client.Cl_Num = Contact.Co_Client
AND Contact.Co_Site = Site.Si_Num
AND Contact.Co_Num = Contact_Evenement.Co_Ev_Contact
AND Month([Co_Ev_Date] = ListeMois.num_Mois

C'est quand même un peu plus simple :approve)

Voila

PS: la requête devrait marcher mais teste là car n'aillant pas ta base de données, je ne peut pas en etre sur à 100%
Messages postés
15
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
23 juin 2004

C'est vrai que c'est plus simple comme ca, ca m'affiche bien les mois + 1 et mois + 2 mais maintenant le soucis est qu'il faut que j'affiche les anniversaires de ces mois+1 et mois+2 et pas seulement les mois.

Ca donne ca en clair

SELECT Client.Cl_Nom, Contact.Co_Nom, Contact.Co_Prenom, Contact_Evenement.Co_Ev_Date, Mois.MoisA, Mois.Mois1, Mois.Mois2
FROM Contact, Client, Contact_Evenement, Mois
WHERE (((Client.Cl_Num)=[Contact].[Co_Client]) AND ((Contact.Co_Num)=[Contact_Evenement].[Co_Ev_Contact]) AND ((Format(Month([Co_Ev_Date]),"00"))=[Formulaires]![Menu Edition]![MoisA] And (Format(Month([Co_Ev_Date]),"00"))=[Mois].[Mois_Num]) AND ((Contact_Evenement.Co_Ev_Evenement)=1));

Mais la ca n'affiche pas dans mon etat les mois1 et mois2 et cette requete affiche les mois suivant et pas les dates d'anniversaires des mois suivants donc je vais etre obliger de reconvertir pour que mois1 affiche tous les gens nés en mois + 1 et mois2 les gens nés en mois +2.

Faut arriver a faire la liaison entre mois1="fevrier" et dans la table contact_evenement, co_ev_date="25/02/81" par exemple.
Messages postés
48
Date d'inscription
lundi 1 septembre 2003
Statut
Membre
Dernière intervention
5 avril 2006

Heu alors moi il a un truc que je comprend pas : Tu veux afficher quoi dans ton état ? Les date anniversaires des gens qui ont réservé une salle particulière sur le mois selectionné + les deux mois suivants. Il faudrait que tu me donnes plus de précision sur le contenu de ton état et les éléments que tu veux afficher. Car il y a bien des façons de faire ce que tu veux.
Messages postés
15
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
23 juin 2004

Alors ds mon etat ya 5 colonnes : nom et prenom du contact, nom du client, date anniversaire pour le mois selectionnés dans le formulaire precedent, date anniv + 1 mois par rapport au mois selectionné, et date anniv + 2 mois du mois selectionné.

Alors pour les noms et prenoms no problem et pour selectionner les dates de naissances du mois selectionné ca roule, voici la requete de base que je dois modifier :

SELECT Contact_Evenement.Co_Ev_Date, Format(Month([Co_Ev_Date]),"00") AS Expr1, Client.Cl_Nom, Contact.Co_Num, Contact.Co_Nom, Contact.Co_PrenomFROM (Client INNER JOIN (Contact LEFT JOIN Site ON Contact.Co_Site Site.Si_Num) ON Client.Cl_Num Contact.Co_Client) INNER JOIN Contact_Evenement ON Contact.Co_Num = Contact_Evenement.Co_Ev_Contact
WHERE ((Format(Month([Co_Ev_Date]),"00"))=[Formulaires]![Menu Edition]![MoisA]) AND ((Contact_Evenement.Co_Ev_Evenement)=1);

D'apres cette requete, il faut que je rajoute le mois +1 et le mois +2. Probleme les dates de naissances sont de format jj/mm/aa et le mois selectionné et de format "01".
Messages postés
48
Date d'inscription
lundi 1 septembre 2003
Statut
Membre
Dernière intervention
5 avril 2006

Bon donc si j'ai bien compris ca devrait donnée ca :

SELECT Contact.Co_Num, Contact.Co_Nom, Contact.Co_Prenom, Client.Cl_Nom, Contact_Evenement.Co_Ev_Date, DateAdd("m",1,[Date_De_Naissance]), DateAdd("m",2,[Date_De_Naissance])
FROM (Client INNER JOIN (Contact LEFT JOIN Site ON Contact.Co_Site Site.Si_Num) ON Client.Cl_Num Contact.Co_Client) INNER JOIN Contact_Evenement ON Contact.Co_Num = Contact_Evenement.Co_Ev_Contact
WHERE ((Format(Month([Co_Ev_Date]),"00"))=[Formulaires]![Menu Edition]![MoisA]) AND ((Contact_Evenement.Co_Ev_Evenement)=1);

En fait tu avais la solution au problème depuis le début. Tiens moi au courant de savoir si ca marche comme ca. :approve)

:big) Ah l'informatique c'est bien quant même :big)
Messages postés
15
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
23 juin 2004

Alors ca fonctionne mais non en fait c'est pas ca, en fait c a moitié ca enfin si je peux dire.
Là la requete m'affiche les gens nés par ex en janvier donc ca c good toujours, mais il rajoute un mois a janvier mais pas en cherchant les gens nés en fevrier, il affiche les gens nés en janvier en changeant leur mois de naissance et en mettant 02 a la place de 01.

Je sais pas si je m'exrpime bien. Disons par exemple Mr X est né le 25/01/50, Mr X sera afficher si l'on choisi le mois de janvier mais pour le mois de fevrier au lieu de prendre Mme Z née le 10/02/60, il affiche Mr X né le 25/02/50 pour le mois+1 et Mr X né le 25/03/50 pour le mois+2.

Ah l'informatique comme tu dis !!! :big)

Ce que je veux c'est la liste de sgens nés en janvier si janvier est selectionné ds le formulaire + la liste des gens nés en fevrier + la liste des gens nés en mars.

%-6
Messages postés
48
Date d'inscription
lundi 1 septembre 2003
Statut
Membre
Dernière intervention
5 avril 2006

ok ca y est, excuse moi il faut le temps que ca monte au cerveau.
Toi ce que tu veux c'est un planning sur 3 mois des dates anniversaires de ta table.

SELECT Contact.Co_Num, Contact.Co_Nom, Contact.Co_Prenom, Client.Cl_Nom, IIf(Month(Contact_Evenement.Co_Ev_Date)=8,Contact_Evenement.Co_Ev_Date,"") AS Mois, IIf(Month(Contact_Evenement.Co_Ev_Date)=9,Contact_Evenement.Co_Ev_Date,"") AS [Mois+1], IIf(Month(Contact_Evenement.Co_Ev_Date)=10,Contact_Evenement.Co_Ev_Date,"") AS [Mois+2]
FROM (Client INNER JOIN (Contact LEFT JOIN Site ON Contact.Co_Site Site.Si_Num) ON Client.Cl_Num Contact.Co_Client) INNER JOIN Contact_Evenement ON Contact.Co_Num = Contact_Evenement.Co_Ev_Contact

WHERE Month(Contact_Evenement.Co_Ev_Date)=8
OR Month(Contact_Evenement.Co_Ev_Date)=9
OR Month(Contact_Evenement.Co_Ev_Date)=10;

Bon voila ca devrait être ca.

:big) Ah l'informatique c'est bien quant même :big)
Messages postés
15
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
23 juin 2004

Juste une question pourquoi =8, =9 et =10. Ca peut etre d'autres mois.

Je vais tester je te tiens au courant en tout cas c'est tres gentil de repondre et de chercher a m'aider :big)
Messages postés
48
Date d'inscription
lundi 1 septembre 2003
Statut
Membre
Dernière intervention
5 avril 2006

Oui c'est parce que dans la requête de test j'ai mis ca. Mais toi tu va mettre ca :

SELECT Contact.Co_Num, Contact.Co_Nom, Contact.Co_Prenom, Client.Cl_Nom, IIf(Month(Contact_Evenement.Co_Ev_Date)=Str([Formulaires]![Menu Edition]![MoisA]),Contact_Evenement.Co_Ev_Date,"") AS Mois, IIf(Month(Contact_Evenement.Co_Ev_Date)=Str([Formulaires]![Menu Edition]![MoisA])+1,Contact_Evenement.Co_Ev_Date,"") AS [Mois+1], IIf(Month(Contact_Evenement.Co_Ev_Date)=Str([Formulaires]![Menu Edition]![MoisA])+2,Contact_Evenement.Co_Ev_Date,"") AS [Mois+2]
FROM (Client INNER JOIN (Contact LEFT JOIN Site ON Contact.Co_Site Site.Si_Num) ON Client.Cl_Num Contact.Co_Client) INNER JOIN Contact_Evenement ON Contact.Co_Num = Contact_Evenement.Co_Ev_Contact

WHERE Month(Contact_Evenement.Co_Ev_Date)=Str([Formulaires]![Menu Edition]![MoisA])
OR Month(Contact_Evenement.Co_Ev_Date)=Str([Formulaires]![Menu Edition]![MoisA])+1
OR Month(Contact_Evenement.Co_Ev_Date)=Str([Formulaires]![Menu Edition]![MoisA])+2;

Le Str te sert à pouvoir faire +1 ou +2

Voilà

:big) Ah l'informatique c'est bien quant même :big)
Messages postés
15
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
23 juin 2004

Voila tout comme tu m'as dit :

SELECT Contact_Evenement.Co_Ev_Date, Contact.Co_Num, Contact.Co_Nom, Contact.Co_Prenom, Client.Cl_Nom, IIf(Format(Month(Contact_Evenement.Co_Ev_Date))=Str([Formulaires]![Menu Edition]![MoisA]),Contact_Evenement.Co_Ev_Date,"") AS Mois, IIf(Format(Month(Contact_Evenement.Co_Ev_Date))=Str([Formulaires]![Menu Edition]![MoisA])+1,Contact_Evenement.Co_Ev_Date,"") AS Mois1, IIf(Format(Month(Contact_Evenement.Co_Ev_Date))=Str([Formulaires]![Menu Edition]![MoisA])+2,Contact_Evenement.Co_Ev_Date,"") AS Mois2
FROM Contact, Client, Contact_Evenement
WHERE (((Client.Cl_Num)=[Contact].[Co_Client]) AND ((Contact.Co_Num)=[Contact_Evenement].[Co_Ev_Contact])) AND (Format(Month(Contact_Evenement.Co_Ev_Date))=Str([Formulaires]![Menu Edition]![MoisA])
OR (Format(Month(Contact_Evenement.Co_Ev_Date))=Str([Formulaires]![Menu Edition]![MoisA])+1) OR (Format(Month(Contact_Evenement.Co_Ev_Date))=Str([Formulaires]![Menu Edition]![MoisA])+2));

Ca m'affiche bien les mois+1 et mois+2 mais plus le mois selectionné de départ. En fait colonne 1 : prenom et nom contact, colonne 2 : nom client, colonne 3 : date anniv pour le mois selectionné, colonne 4 : date anniv pour le mois+1, colonne 4 : date anniv pour le mois+2

Il manque la colonne 3, les colonnes 4 et 5 sont bien remplies mais la 3 est vide. G bien changé les noms des zones dans mon formulaire Mois, Mois1 et Mois2.
Messages postés
48
Date d'inscription
lundi 1 septembre 2003
Statut
Membre
Dernière intervention
5 avril 2006

Excuse moi mais j'ai oublié de te dire comment faire pour avoir le mois entre 1 et 12. J'ai un peu honte :blush) car un peu long et barbare mais bon ca marche alors c'est l'essentiel.

il faut que tu fasse comme ca :

Str([Formulaires]![Menu Edition]![MoisA]) - (Ent(Str([Formulaires]![Menu Edition]![MoisA]) / 12) * 12)

Pour le mois+1 :
(Str([Formulaires]![Menu Edition]![MoisA]) + 1) - (Ent((Str([Formulaires]![Menu Edition]![MoisA]) + 1) / 12) * 12)

Pour le mois+2 :
(Str([Formulaires]![Menu Edition]![MoisA]) + 2) - (Ent((Str([Formulaires]![Menu Edition]![MoisA]) + 2) / 12) * 12)


Voila tu as alors le mois entre 1 et 2. En fait pour faire un résumé, j'ai fait le nombre correspondant au mois modulo 12.

Voila

:big) Ah l'informatique c'est bien quant même :big)