Se connecter avec
S'enregistrer | Connectez-vous

Condition if dans une requete sql dans access

Dernière réponse : dans Programmation

Bonjour j'ai un prob dans une requete dans access je veux mettre une condition if
mais je ne trouve pa la bonne sintaxe
pouvez vous m'aider et me dire si c possible
je vous laisse mon code

SELECT Count([Dossier].[idAffaire]) FROM Dossier WHERE( (if Month([Dossier].[dateARO]))=10 Then (Month([Dossier].[dateARO]))=01)And ((Month([Dossier].[dateMEC])*100))=((tab3mois.moisliste)*100)) And
(((Year([Dossier].[dateMEC])*10000))=((tab3mois.anneeliste)*10000)) And
((((Year([Dossier].[dateARO])*10000)+(Month([Dossier].[dateARO])*100)+Day([Dossier].[dateARO]))<((Year([Dossier].[dateMEC])*10000)+(Month([Dossier].[dateMEC])*100)+Day([Dossier].[dateMEC]))))

merci d'avance pour vos reponses vos reponses

Autres pages sur : condition requete sql access

Lassé par la pub ? Créez un compte

Un if dans un where c'est totalement impossible, par contre il existe le iif que tu peux mettre dans un select.

Je dois avouer que ta requête faire peur et c'est totalement incompréhensible, donc ce que je peux te conseiller c'est de commencer par faire une requête select simple qui convertit tout tes champs, et une deuxième requête qui applique ton count avec les conditions.

A la place de ca dans le where tu le met dans le select de la 1ere requete :

  1. (if Month([Dossier].[dateARO]))=10 Then (Month([Dossier].[dateARO]))=01)
  2.  
  3. iif(Month([Dossier].[dateARO]) = 10;01;Month([Dossier].[dateARO])) as DtARO


Tu auras pour ta seconde requête un champs dtARO qui sera déjà retraité. Fais de même pour tes conversions complexes.
  1. ((((Year([Dossier].[dateARO])*10000)+(Month([Dossier].[dateARO])*100)+Day([Dossier].[dateARO]))
  2.  
  3. (Year([Dossier].[dateARO])*10000)+(Month([Dossier].[dateARO])*100)+Day([Dossier].[dateARO]) as convAro

merci déja pr ça
mé dans ma requéte je dois faire 3 tests si 10 si 11 si 12 sinon
je les enchaine comment , j'avais essayé ça mé ça marche pa :s

SELECT Count([Dossier].[idAffaire]) FROM Dossier WHERE( (IIf (Month([Dossier].[dateARO]))=10,(Month([Dossier].[dateARO]))=01),IIf (Month([Dossier].[dateARO]))=11,(Month([Dossier].[dateARO]))=02),IIf (Month([Dossier].[dateARO]))=12,(Month([Dossier].[dateARO]))=03),Month([Dossier].[dateARO])=Month([Dossier].[dateARO])+3) And ((Month([Dossier].[dateMEC])*100))=((tab3mois.moisliste)*100)) And
(((Year([Dossier].[dateMEC])*10000))=((tab3mois.anneeliste)*10000)) And
((((Year([Dossier].[dateARO])*10000)+(Month([Dossier].[dateARO])*100)+Day([Dossier].[dateARO]))<((Year([Dossier].[dateMEC])*10000)+(Month([Dossier].[dateMEC])*100)+Day([Dossier].[dateMEC]))));

Il faut que tu fasses 2 requetes, passe par le créateur de requête et non directement par SQL.

Dans la première tu met tes tables, et tu créé tous les champs que tu auras besoin avec juste un select sans condition, car tu ne peux pas mettre de if ou iif dans un where.

Puis tu créé une seconde requête tu verras en mode création tu peux choisir une table ou une requête donc tu prend ta première requete en source et tu fais ton select count avec tes conditions directement avec tes champs.

Ton orthographe se dégrade de message en message... Un petit effort serait bienvenue.

Maintenant à quoi te sert ceci :

  1. ((((Year([Dossier].[dateARO])*10000)+(Month([Dossier].[dateARO])*100)+Day([Dossier].[dateARO]))


Si il s'agit de remettre en forme le format d'une date regarde plutot la fonction Format et pour la comparaison de date : Datediff
Car à partir du moment ou tu fais des multiplications tes données deviennent des entiers ou réel et donc plus de stockage de chiffre inutile.

  1. DateDiff("dd";[Dossier].[dateRecepPlanMinute];[Dossier].[dateARO])

Datediff te renvoie la différence en jour, donc par exemple ce que tu as écris va faire : "WHERE 2" ca fait logiquement une erreur si tu ne compare pas derrière à qqch.
Un seul "d" suffit.
  1. DateDiff("d";[Dossier].[dateRecepPlanMinute];[Dossier].[dateARO])

Si tu regardes l'aide tu verras ceci : DateDiff(interval,date1,date2)

Si date1 est plus récent que date2 la fonction renvoie une valeur négative et positive dans le cas contraire, donc suivant ce que tu veux il faut que tu mettes un <=0 ou >=0.
  1. WHERE DateDiff("d";[Dossier].[dateRecepPlanMinute];[Dossier].[dateARO]) > 0

Voila mes 2 requétes

  1. SELECT Count([Dossier].[idAffaire])
  2. FROM Dossier
  3. WHERE (((Month([Dossier].[dateRecepPlanMinute])*100))=((tab3mois.moisliste)*100)) And (((Year([Dossier].[dateRecepPlanMinute])*10000))=((tab3mois.anneeliste)*10000)) And ((([Dossier].[dateRecepPlanMinute]-[Dossier].[dateARO])<28));


qui est divisée par celle ci

  1. SELECT Count([Dossier].[idAffaire])
  2. FROM Dossier
  3. WHERE (((Month([Dossier].[dateRecepPlanMinute])*100))=((tab3mois.moisliste)*100)) And (((Year([Dossier].[dateRecepPlanMinute])*10000))=((tab3mois.anneeliste)*10000));

Comme je te l'ai dit ca ne pose aucun problème dans ce cas puisque les requêtes ne renvoient qu'un seul enregistrement. Par contre nomme tes champs résultats avec "As" ou en mode création en préfixant ton champs par => nom : count([Dossier].[idAffaire])

- Tu créé une nouvelle requête en mode création.
- Quand tu ajoutes les tables tu vas sur l'onglet requête
- Tu met tes deux requêtes et tu créé un champs contenant la division des 2 autres.
Lassé par la pub ? Créez un compte