Requete Access
Sagara-kun
Messages postés
38
Statut
Membre
-
blux Messages postés 4932 Date d'inscription Statut Modérateur Dernière intervention -
blux Messages postés 4932 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
j'essaye desesperement d'integrer un if dans mes requetes SQL mais rien faire il me sort un message d'erreur comme quoi il manque l'opérateur.
Voici mon code:
SELECT Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Sum(Heures_travaillees.Heures) AS Heures, Accident_travail.DateAccident, Accident_travail.NbJourArret AS NbJourArret
FROM Heures_travaillees INNER JOIN Accident_travail ON Heures_travaillees.Matricule = Accident_travail.Matricule
WHERE (((Heures_travaillees.Mois)=6) AND (Month([Accident_travail]![MoisEnCours])=6))
GROUP BY Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Accident_travail.DateAccident, Accident_travail.NbJourArret
DateAccident: VraiFaux([Heures_travaillees]![Matricule]<>[Accident_Travail]![Matricule];DateAccident=#31/12/9999#;[Accident_travail]![DateAccident])
NbJourArret: VraiFaux([Heures_travaillees]![Matricule]<>[Accident_Travail]![Matricule];NbJourArret=0;[Accident_travail]![NbJourArret]);
et le message d'erreur:
Erreur de syntaxe (opérateur absent) dans l'expression 'Accident_travail.NbJourArret
DateAccident: VraiFaux([Heures_travaillees]![Matricule]<>[Accident_Travail]![Matricule];DateAccident=#31/12/9999#;[Accident_travail]![DateAccident])
NbJourArret: VraiFaux([Heures_travaillees]![Matricule]<>[Accident_Travail]!'
j'essaye desesperement d'integrer un if dans mes requetes SQL mais rien faire il me sort un message d'erreur comme quoi il manque l'opérateur.
Voici mon code:
SELECT Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Sum(Heures_travaillees.Heures) AS Heures, Accident_travail.DateAccident, Accident_travail.NbJourArret AS NbJourArret
FROM Heures_travaillees INNER JOIN Accident_travail ON Heures_travaillees.Matricule = Accident_travail.Matricule
WHERE (((Heures_travaillees.Mois)=6) AND (Month([Accident_travail]![MoisEnCours])=6))
GROUP BY Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Accident_travail.DateAccident, Accident_travail.NbJourArret
DateAccident: VraiFaux([Heures_travaillees]![Matricule]<>[Accident_Travail]![Matricule];DateAccident=#31/12/9999#;[Accident_travail]![DateAccident])
NbJourArret: VraiFaux([Heures_travaillees]![Matricule]<>[Accident_Travail]![Matricule];NbJourArret=0;[Accident_travail]![NbJourArret]);
et le message d'erreur:
Erreur de syntaxe (opérateur absent) dans l'expression 'Accident_travail.NbJourArret
DateAccident: VraiFaux([Heures_travaillees]![Matricule]<>[Accident_Travail]![Matricule];DateAccident=#31/12/9999#;[Accident_travail]![DateAccident])
NbJourArret: VraiFaux([Heures_travaillees]![Matricule]<>[Accident_Travail]!'
26 réponses
Jai toujours une erreur similaire:
Erreur de syntaxe (oéprateur absent) dans l'expression
'DateAccident: VraiFaux([Heures_travaillees]![Matricule]<>[Accident_travail]![Matricule]; DateAccident=#31/12/9999#;[Accident_travail]![DateAccident])'
Erreur de syntaxe (oéprateur absent) dans l'expression
'DateAccident: VraiFaux([Heures_travaillees]![Matricule]<>[Accident_travail]![Matricule]; DateAccident=#31/12/9999#;[Accident_travail]![DateAccident])'
les points virgules signifient la fin de la requête, et comme ici il y en a plusieurs ta requête ne peux pas fonctionner il faut mettre des simples virgules à la place dans un premier temps, je pense.
Malheuresement sa ne change rien jai toujours le meme message d'erreur.
Et aussi est-ce que la requete en elle meme est dans le bon ordre?
Et aussi est-ce que la requete en elle meme est dans le bon ordre?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Les lignes correspondant a DateAccident: ** et MoisEnCours: ** ne font pas parti du GROUPBY et les points d'interrogations sont utilises parce que j'utilise une fonction integrée a Access en mode creation de ma requete
J'ai essayer en mettant une virgule mais l'erreur apparait toujours.
Alors ma question est comment et ou faire un SI dans une requete.
Alors ma question est comment et ou faire un SI dans une requete.
En SQL ACCESS, c'est iif(test;valeur_vrai:valeur_faux).
Ce que je ne comprends pas, c'est pourquoi tu veux mettre un test APRES le GROUP BY.
Ce que je ne comprends pas, c'est pourquoi tu veux mettre un test APRES le GROUP BY.
Maintenant qu'on sait que je reflechi pas assez je veux savoir où mettre mon SI dans ma requete
Ca dépend de quel SI tu veux parler...
Il y a le test pour restreindre les données, qui se met dans la clause WHERE.
Il y a le test pour afficher une donnée ou une autre en fonction d'un test (genre afficher 0 au lieu d'un message d'erreur si un champ n'est pas rempli), c'est la fonction IIF qui se met dans le SELECT
Donc explique ce que tu veux faire.
Il y a le test pour restreindre les données, qui se met dans la clause WHERE.
Il y a le test pour afficher une donnée ou une autre en fonction d'un test (genre afficher 0 au lieu d'un message d'erreur si un champ n'est pas rempli), c'est la fonction IIF qui se met dans le SELECT
Donc explique ce que tu veux faire.
Jai 2 tables lies par le matricule qui sont:
Heures_travaillees:
Matricule
Nom
Prenom
Activite
Mois
Annee
Heures
Accident_travail:
Matricule
Nom
Prenom
DateAccident
MoisEnCours
NbJourArret
Mon but est de mettre dans une table commune:
Matricule
Nom
Prenom
Activite
Mois
Annee
Heures
DateAccident
NbJourArret
sauf que si l'employe n'a pas eu d'accident de travail alors il n'apparait pas dans la table.
Je voudrais faire un SI pour que meme si il n'est pas dans la table Accident_travail alors il recoit 31/12/9999 dans le champs DateAccident et 0 dans le champs NbJourArret
Heures_travaillees:
Matricule
Nom
Prenom
Activite
Mois
Annee
Heures
Accident_travail:
Matricule
Nom
Prenom
DateAccident
MoisEnCours
NbJourArret
Mon but est de mettre dans une table commune:
Matricule
Nom
Prenom
Activite
Mois
Annee
Heures
DateAccident
NbJourArret
sauf que si l'employe n'a pas eu d'accident de travail alors il n'apparait pas dans la table.
Je voudrais faire un SI pour que meme si il n'est pas dans la table Accident_travail alors il recoit 31/12/9999 dans le champs DateAccident et 0 dans le champs NbJourArret
Jai 2 tables liees par le champ Matricule qui sont:
Heures_travaillees:
Matricule
Nom
Prenom
Activite
Heures
Accident_travail:
Matricule
Nom
Prenom
DateAccident
MoisEnCours
NbJourArret
Je veux regrouper ces deux tables dans une autre table mais sa ne m'affiche que ceux presents dans les 2 tables.
Donc mon Si doit faire en sorte que si les employes n'apparaissent pas dans la table Accident_travail alors le champ DateAccident recoit 31/12/9999 et le champs NbJourArret recoit 0
Heures_travaillees:
Matricule
Nom
Prenom
Activite
Heures
Accident_travail:
Matricule
Nom
Prenom
DateAccident
MoisEnCours
NbJourArret
Je veux regrouper ces deux tables dans une autre table mais sa ne m'affiche que ceux presents dans les 2 tables.
Donc mon Si doit faire en sorte que si les employes n'apparaissent pas dans la table Accident_travail alors le champ DateAccident recoit 31/12/9999 et le champs NbJourArret recoit 0
voila ma requete:
SELECT Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Heures_travaillees.Mois, Heures_travaillees.Annee, Heures_travaillees.Heures, Accident_travail.DateAccident, Sum(Accident_travail.NbJourArret) AS NbJourArret
FROM Heures_travaillees INNER JOIN Accident_travail ON Heures_travaillees.Matricule=Accident_travail.Matricule
GROUP BY Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Heures_travaillees.Mois, Heures_travaillees.Annee, Heures_travaillees.Heures, Accident_travail.DateAccident, Accident_travail.MoisEnCours;
et voila mes SI:
IIf(Month([Accident_travail]![MoisEnCours])=[Heures_travaillees]![Mois];[Accident_travail]![DateAccident];[DateAccident]=#31/12/9999#)
IIf(Month([Accident_travail]![MoisEnCours])=[Heures_travaillees]![Mois];[Accident_travail]![NbJourArret];0)
SELECT Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Heures_travaillees.Mois, Heures_travaillees.Annee, Heures_travaillees.Heures, Accident_travail.DateAccident, Sum(Accident_travail.NbJourArret) AS NbJourArret
FROM Heures_travaillees INNER JOIN Accident_travail ON Heures_travaillees.Matricule=Accident_travail.Matricule
GROUP BY Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Heures_travaillees.Mois, Heures_travaillees.Annee, Heures_travaillees.Heures, Accident_travail.DateAccident, Accident_travail.MoisEnCours;
et voila mes SI:
IIf(Month([Accident_travail]![MoisEnCours])=[Heures_travaillees]![Mois];[Accident_travail]![DateAccident];[DateAccident]=#31/12/9999#)
IIf(Month([Accident_travail]![MoisEnCours])=[Heures_travaillees]![Mois];[Accident_travail]![NbJourArret];0)
Alors tu n'es pas sur le bon chemin.
Il faut faire une jointure de type left ou right, ça se fait en cliquant-droit sur la ligne de relation entre les deux tables (lorsque tu crées ta requête) pour modifier le type de jointure. Ensuite, tu mettras les iif dans la clause SELECT.
Ou alors, tu fais en deux fois :
- une requête qui créée les matricules depuis heures_travaillées et qui met les données AT à zéro
- une requête qui met à jour les données depuis accident_travail
en supposant que tous ceux qui sont dans A_T sont aussi dans H_T
Il faut faire une jointure de type left ou right, ça se fait en cliquant-droit sur la ligne de relation entre les deux tables (lorsque tu crées ta requête) pour modifier le type de jointure. Ensuite, tu mettras les iif dans la clause SELECT.
Ou alors, tu fais en deux fois :
- une requête qui créée les matricules depuis heures_travaillées et qui met les données AT à zéro
- une requête qui met à jour les données depuis accident_travail
en supposant que tous ceux qui sont dans A_T sont aussi dans H_T
Sa ne marche toujours pas, j'ai toujours le meme message d'erreur mais cette fois il me selectionne le premier nom de table dans le FROM:
SELECT Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Heures_travaillees.Mois, Heures_travaillees.Annee, Heures_travaillees.Heures, Accident_travail.DateAccident, Sum(Accident_travail.NbJourArret) AS NbJourArret, iif((Month([Accident_travail]![MoisEnCours])=[Heures_travaillees]![Mois],[Accident_travail]![DateAccident],[DateAccident]=#31/12/9999#), iif(Month([Accident_travail]![MoisEnCours])=[Heures_travaillees]![Mois],[Accident_travail]![NbJourArret],[NbJourArret]=0),
FROM Heures_travaillees RIGHT JOIN Accident_travail ON Heures_travaillees.Matricule = Accident_travail.Matricule
GROUP BY Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Heures_travaillees.Mois, Heures_travaillees.Annee, Heures_travaillees.Heures, Accident_travail.DateAccident, Accident_travail.MoisEnCours;
SELECT Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Heures_travaillees.Mois, Heures_travaillees.Annee, Heures_travaillees.Heures, Accident_travail.DateAccident, Sum(Accident_travail.NbJourArret) AS NbJourArret, iif((Month([Accident_travail]![MoisEnCours])=[Heures_travaillees]![Mois],[Accident_travail]![DateAccident],[DateAccident]=#31/12/9999#), iif(Month([Accident_travail]![MoisEnCours])=[Heures_travaillees]![Mois],[Accident_travail]![NbJourArret],[NbJourArret]=0),
FROM Heures_travaillees RIGHT JOIN Accident_travail ON Heures_travaillees.Matricule = Accident_travail.Matricule
GROUP BY Heures_travaillees.Matricule, Heures_travaillees.Nom, Heures_travaillees.Prenom, Heures_travaillees.Activite, Heures_travaillees.Mois, Heures_travaillees.Annee, Heures_travaillees.Heures, Accident_travail.DateAccident, Accident_travail.MoisEnCours;
Les points virgules ne marchent pas faut mettre des virgules simples et le nouveau message d'erreur est:
Dans l'instruction SELECT, un mot réservé ou un argument est mal orthographié ou absent, ou la ponctuation est incorrecte.
alors que ma virgule a la fin de mon select est bien présente et il me surligne le FROM
Dans l'instruction SELECT, un mot réservé ou un argument est mal orthographié ou absent, ou la ponctuation est incorrecte.
alors que ma virgule a la fin de mon select est bien présente et il me surligne le FROM