Requete Access

Sagara-kun Messages postés 38 Statut Membre -  
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]!'

26 réponses

blux Messages postés 4932 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
Salut,

il ne manquerait pas une virgule après 'Accident_travail.NbJourArret ?
0
Sagara-kun Messages postés 38 Statut Membre 1
 
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])'
0
idées noires
 
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.
0
Sagara-kun Messages postés 38 Statut Membre 1
 
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blux Messages postés 4932 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
Les ! font référence à une zone de formulaire ?
0
Sagara-kun Messages postés 38 Statut Membre 1
 
Non en fait c'est: [Table]![ChampTable]
En SQL sa serai Table.champ
0
blux Messages postés 4932 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
alors pourquoi dans ton SELECT tu as mis un point ?
et pourquoi dans ton GROUP BY tu mets des points d'interrogation, c'est pas du SQL ?
0
Sagara-kun Messages postés 38 Statut Membre 1
 
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
0
blux Messages postés 4932 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
je ne vois pas de virgule entre Accident_travail.NbJourArret et DateAccident: VraiFaux, ce qui fait que la syntaxe SQL n'est pas respectée.
et j'ai du mal avec la syntaxe de la fonction que je ne connais pas (qui semble ne pas être une fonction intégrée à ACCESS, mais une fonction utilisateur)
0
Sagara-kun Messages postés 38 Statut Membre 1
 
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.
0
blux Messages postés 4932 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
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.
0
Sagara-kun Messages postés 38 Statut Membre 1
 
le iif ne marche pas et je l'ai mis apres parce que je ne savait pas où le placer
0
blux Messages postés 4932 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
je l'ai mis apres parce que je ne savait pas où le placer
Donc, ne cherchons pas plus loin l'erreur.

Tu veux faire quoi au juste ?
0
Sagara-kun Messages postés 38 Statut Membre 1
 
Maintenant qu'on sait que je reflechi pas assez je veux savoir où mettre mon SI dans ma requete
0
blux Messages postés 4932 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
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.
0
Sagara-kun Messages postés 38 Statut Membre 1
 
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
0
MachinChose
 
Peux-tu nous remettre ta requète dans son état actuel, telle que tu l'as modifiée ?
Merci
0
Sagara-kun Messages postés 38 Statut Membre 1
 
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
0
Sagara-kun Messages postés 38 Statut Membre 1
 
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)
0
blux Messages postés 4932 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
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
0
Sagara-kun Messages postés 38 Statut Membre 1
 
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;
0
blux Messages postés 4932 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
remplace tes ! par des points et mets des ; comme séparateur d'argument du iif.
0
Sagara-kun Messages postés 38 Statut Membre 1
 
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
0
blux Messages postés 4932 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
supprime la virgule avant le FROM...
0
Sagara-kun Messages postés 38 Statut Membre 1
 
Erreur et toujours erreur :s :

Vous avez essayé d'exécuter une requête ne comprenant pas l'expression spécifiée
'IIf(Month(Accident_travail.MoisEnCours)=Heures_trvaillees.Mois,Accident_travail.NbJourArret,NbJourArret=0)'
comme une partie de la fonction d'agrégat.
0
blux Messages postés 4932 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
colle ta requête...
0