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

Fontion iif dans requete ACCESS

8 réponses
Avatar
albert
Bonjour
J'ai un fichier Access, base de données des membres. Tous les abonnements
se terminent le 30 septembre de l'année suivante, excepté pour ceux qui se
désabonnent, la date du désabonnement est utilisée.
Pour la dernière saison j'ai créé la requête sélection suivante pour le
champ DUEDATE :
>2016-09-30
qui donnait le résultat voulu avec le champ ACTIF à NON

Que j'ai modifié en janvier pour la rendre automatique pour les années à
venir :
>Année(Date())-1 & "-09-30"

Pour la saison courante (2017-2018) cette formule
>Année(Date()) & "-09-30"
doit donner la date suivante pour octobre, novembre et décembre 2017 :
soit >2017-09-30

Pour l'année 2018 il faut soustraire 1, la formule devient
>Année(Date())-1 & "-09-30"

J'ai pensé utiliser la fonction iiF mais ça ne fonctionne pas.
IIF(mois(date())>9; >Année(Date()) & "-09-30" ; >Année(Date())-1 &
"-09-30")

Si mois > septembre ; année courante, sinon (pour 2018) soustraire un à l'année.
Merci pour vos suggestions
albert

8 réponses

Avatar
db
Le 04/10/2017 à 20:44, albert a écrit :
Bonjour
J'ai pensé utiliser la fonction iiF mais ça ne fonctionne pas.
IIF(mois(date())>9; >Année(Date()) & "-09-30" ; >Année(Date())-1  &
"-09-30")

Bonsoir,
Qu'est-ce qui ne fonctionne pas ? Ça ne renvoie pas la bonne valeur ?
db
Avatar
JièL
Hello,
même question que db mais perso je n'aurais pas géré ça comme du texte
mais plutot comme ceci
DateSerial(Year(Date())-VraiFaux(Month(Date()>9,0,1),9,30)
--
JièL
Le 04/10/2017 à 20:44, albert a écrit :
Bonjour
J'ai un fichier Access, base de données  des  membres. Tous les
abonnements se terminent le 30 septembre de l'année suivante, excepté
pour ceux qui se désabonnent, la date du désabonnement est utilisée.
Pour la dernière saison j'ai créé la requête sélection suivante pour le
champ DUEDATE :
2016-09-30

qui  donnait  le résultat voulu avec le champ ACTIF à NON
Que j'ai modifié en janvier pour la rendre automatique pour les  années
à venir :
Année(Date())-1 & "-09-30"

Pour la saison courante (2017-2018)  cette formule
Année(Date()) & "-09-30"
doit donner  la date suivante pour octobre, novembre et décembre  2017 :
soit  >2017-09-30
Pour l'année 2018 il faut soustraire 1, la formule devient
Année(Date())-1  & "-09-30"

J'ai pensé utiliser la fonction iiF mais ça ne fonctionne pas.
IIF(mois(date())>9; >Année(Date()) & "-09-30" ; >Année(Date())-1  &
"-09-30")
Si mois > septembre ; année courante, sinon (pour 2018) soustraire un à
l'année.
Merci pour vos suggestions
albert
Avatar
albert
Bonsoir JièL
Le numéro de l'expression entrée n'est pas valide.
J'ai changé les virgules pour des points-virgules comme c'est l'usage ici,
même résultat
Merci essayez encore
Albert
"JièL" a écrit dans le message de
news:59d552ba$0$10171$
Hello,
même question que db mais perso je n'aurais pas géré ça comme du texte
mais plutot comme ceci
DateSerial(Year(Date())-VraiFaux(Month(Date()>9,0,1),9,30)
--
JièL
Le 04/10/2017 à 20:44, albert a écrit :
Bonjour
J'ai un fichier Access, base de données des membres. Tous les abonnements
se terminent le 30 septembre de l'année suivante, excepté pour ceux qui
se désabonnent, la date du désabonnement est utilisée.
Pour la dernière saison j'ai créé la requête sélection suivante pour le
champ DUEDATE :
2016-09-30

qui donnait le résultat voulu avec le champ ACTIF à NON
Que j'ai modifié en janvier pour la rendre automatique pour les années à
venir :
Année(Date())-1 & "-09-30"

Pour la saison courante (2017-2018) cette formule
Année(Date()) & "-09-30"
doit donner la date suivante pour octobre, novembre et décembre 2017 :
soit >2017-09-30
Pour l'année 2018 il faut soustraire 1, la formule devient
Année(Date())-1 & "-09-30"

J'ai pensé utiliser la fonction iiF mais ça ne fonctionne pas.
IIF(mois(date())>9; >Année(Date()) & "-09-30" ; >Année(Date())-1 &
"-09-30")
Si mois > septembre ; année courante, sinon (pour 2018) soustraire un à
l'année.
Merci pour vos suggestions
albert
Avatar
albert
"db" a écrit dans le message de
news:59d53000$0$4843$
Le 04/10/2017 à 20:44, albert a écrit :
Bonjour

J'ai pensé utiliser la fonction iiF mais ça ne fonctionne pas.
IIF(mois(date())>9; >Année(Date()) & "-09-30" ; >Année(Date())-1 &
"-09-30")

Bonsoir, Qu'est-ce qui ne fonctionne pas ? Ça ne renvoie pas la bonne
valeur ?
db

Bonsoir ou Bonjour
Si j'utilise seulement l'expression >Year(Date()) & "-09-30" tout
fonctionne bien.
Si j'emploie IIF ou VraiFaux le résultat affiche tous les champs vides.
--------------------------------
SQL OK fonctionne bien
SELECT TBLmbcc.[ACTIF], TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME, TBLmbcc.DUEDATE
FROM TBLmbcc
WHERE (((TBLmbcc.[ACTIF])=No) AND (([TBLmbcc].[DUEDATE])>Year(Date()) &
"-09-30"))
ORDER BY TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME;
Donne le résultat qui suit:
ACTIF LASTNAME FIRSTNAME DUEDATE
Non RICHARD ALBERT 2018-03-30
____________________________________---
Le résultat est des champs vides quand l'expression ci-haut est utilisé dans
la fonction IIFF Ou Vraifaux
SELECT TBLmbcc.[ACTIF], TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME, TBLmbcc.DUEDATE
FROM TBLmbcc
WHERE (((TBLmbcc.[ACTIF])=No) AND
((TBLmbcc.DUEDATE)=IIf(Month(Date())>9,([TBLmbcc].[DUEDATE])>Year(Date()) &
"-09-30",([TBLmbcc].[DUEDATE])>Year(Date())-1 & "-
09-30")))
ORDER BY TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME;
champs vides
ACTIF LASTNAME FIRSTNAME DUEDATE
____________________________________
Merci do votre intérêt pour résoudre ce problème
Albert
Avatar
db
Au lieu de :
WHERE (((TBLmbcc.[ACTIF])=No) AND
((TBLmbcc.DUEDATE)=IIf(Month(Date())>9,([TBLmbcc].[DUEDATE])>Year(Date()) & > "-09-30",([TBLmbcc].[DUEDATE])>Year(Date())-1 & "09-30")))

essayer :
WHERE TBLmbcc.[ACTIF]=No AND
TBLmbcc.DUEDATE>IIf(Month(Date())>9,Year(Date()),Year(Date())-1) & "09-30"
mais Jièl a raison : ce serait plus propre d'écrire quelque chose comme :
WHERE TBLmbcc.[ACTIF]=No AND
TBLmbcc.DUEDATE>DateSerial(Year(Date())-VraiFaux(Month(Date()>9,0,1),9,30)
db
Avatar
db
Le 05/10/2017 à 19:18, albert a écrit :
"db" <mailto: a
écrit dans le message de news:59d5efd6$0$9403$
Au lieu de :
WHERE (((TBLmbcc.[ACTIF])=No) AND
((TBLmbcc.DUEDATE)=IIf(Month(Date())>9,([TBLmbcc].[DUEDATE])>Year(Date()) &
"-09-30",([TBLmbcc].[DUEDATE])>Year(Date())-1 & "09-30")))
/Après avoir remplacé le signe = par > avant le iif  de la ligne
ci-dessus la requête donnne le résultat attendu :/
SELECT TBLmbcc.[ACTIF], TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME, TBLmbcc.DUEDATE
FROM TBLmbcc
WHERE (((TBLmbcc.[ACTIF])=No) AND
((TBLmbcc.DUEDATE)>IIf(Month(Date())>9,Year(Date()) &
"-09-30",Year(Date())-1 & "-09-30")))
ORDER BY TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME;

Ah oui, vous avez remplacé = par >, mais vous avez aussi remplacé :
IIf(Month(Date())>9,([TBLmbcc].[DUEDATE])>Year(Date()) &
"-09-30",([TBLmbcc].[DUEDATE])>Year(Date())-1 & "09-30")))
par
IIf(Month(Date())>9,Year(Date()) & "-09-30",Year(Date())-1 & "-09-30")))
ce qui est effectivement moins… comment dire… original :-)
essayer :
WHERE TBLmbcc.[ACTIF]=No AND
TBLmbcc.DUEDATE>IIf(Month(Date())>9,Year(Date()),Year(Date())-1) &
"09-30"
/La requête avec cette ligne affiche les 2048 membres *NON* Actif et
leur dernière DueDate de 1984 à 2018./
SELECT TBLmbcc.[ACTIF], TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME, TBLmbcc.DUEDATE
FROM TBLmbcc
WHERE (((TBLmbcc.[ACTIF])=No) AND
(("Duedate")>IIf(Month(Date())>9,Year(Date()),Year(Date())-1) & "-09-30"))
ORDER BY TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME;

Ce serait mieux de recopier correctement ce que je vous ai proposé : je
n'ai pas écrit "Duedate" entre guillemets, mais TBLmbcc.DUEDATE, ce qui
n'a rien à voir et change complètement le résultat.
db
Avatar
albert
Re bonjour db
Je suis confus, j'ai fait trop d'essais et je me mêle.
Une part du problème est que je travaille plus en mode création qu'en mode
SQL, et je faisais du copier/coller, car je suis un piètre dactylographe.
Pour ce qui est du ("DueDate") j'essaie de me l'expliquer, sans doute Access
a corrigé un erreur. J'ai corrigé et tout est correct.
Je vous reviens et merci encore
albert
"db" a écrit dans le message de
news:59d66e80$0$3633$
Le 05/10/2017 à 19:18, albert a écrit :
"db" <mailto: a
écrit dans le message de news:59d5efd6$0$9403$
Au lieu de :
WHERE (((TBLmbcc.[ACTIF])=No) AND
((TBLmbcc.DUEDATE)=IIf(Month(Date())>9,([TBLmbcc].[DUEDATE])>Year(Date())
& > "-09-30",([TBLmbcc].[DUEDATE])>Year(Date())-1 & "09-30")))
/Après avoir remplacé le signe = par > avant le iif de la ligne ci-dessus
la requête donnne le résultat attendu :/
SELECT TBLmbcc.[ACTIF], TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME,
TBLmbcc.DUEDATE
FROM TBLmbcc
WHERE (((TBLmbcc.[ACTIF])=No) AND
((TBLmbcc.DUEDATE)>IIf(Month(Date())>9,Year(Date()) &
"-09-30",Year(Date())-1 & "-09-30")))
ORDER BY TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME;

Ah oui, vous avez remplacé = par >, mais vous avez aussi remplacé :
IIf(Month(Date())>9,([TBLmbcc].[DUEDATE])>Year(Date()) &
"-09-30",([TBLmbcc].[DUEDATE])>Year(Date())-1 & "09-30")))
par
IIf(Month(Date())>9,Year(Date()) & "-09-30",Year(Date())-1 & "-09-30")))
ce qui est effectivement moins… comment dire… original :-)
essayer :
WHERE TBLmbcc.[ACTIF]=No AND
TBLmbcc.DUEDATE>IIf(Month(Date())>9,Year(Date()),Year(Date())-1) &
"09-30"
/La requête avec cette ligne affiche les 2048 membres *NON* Actif et leur
dernière DueDate de 1984 à 2018./
SELECT TBLmbcc.[ACTIF], TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME,
TBLmbcc.DUEDATE
FROM TBLmbcc
WHERE (((TBLmbcc.[ACTIF])=No) AND
(("Duedate")>IIf(Month(Date())>9,Year(Date()),Year(Date())-1) &
"-09-30"))
ORDER BY TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME;

Ce serait mieux de recopier correctement ce que je vous ai proposé : je
n'ai pas écrit "Duedate" entre guillemets, mais TBLmbcc.DUEDATE, ce qui
n'a rien à voir et change complètement le résultat.
db

WHERE TBLmbcc.[ACTIF]=No AND
TBLmbcc.DUEDATE>IIf(Month(Date())>9,Year(Date()),Year(Date())-1) & "09-30"
Avatar
albert
Bonjour db
"db" a écrit dans le message de
news:59d66e80$0$3633$
Voici un début d'explication pour ce qui s'est passé.
Je suis un technicien télégraphiste retraité de 84 ans, sans formation en
informatique. À 76 ans on m'a apporté une logiciel Access2000 et une base de
données Access.
On m'a montré comment créer des Requêtes sur mon PC. Lorsque le sécrétaire
du Club avait un besoin, je créais une requête sur mon PC, je la notais et
j'allais chez le sécrétaire à quelques kilomètres et je récréais la requête
sur son PC.
En 2009 Eric et Fabien sur MPFA m'ont expliqué que je pouvais exporter mes
requêtes par courriel en utilisant SQL, c'était tout nouveau pour moi. Je
n'ai pas les connaissances nécessaires pour créer des requêtes en SQL.
Encore aujourd'hui, je crée mes requêtes en mode CRÉATION et je regarde le
résultat SQL aussi, ça aide.
Vous m'avez aidé plusieurs fois, et d'autres aussi, malheureusement il en
reste peu.
Je vous en remercie beaucoup.
Albert
Donc, j'avais créé la requête : VraiFaux(Mois(Date())>9;>Année(Date()) &
"-09-30";>Année(Date())-1 & "09-30"
que je vous ai trannsmise en SQL:
SELECT TBLmbcc.[ACTIF], TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME, TBLmbcc.DUEDATE
FROM TBLmbcc
WHERE (((TBLmbcc.[ACTIF])=No) AND
((TBLmbcc.DUEDATE)=IIf(Month(Date())>9,(TBLmbcc.DUEDATE)>Year(Date()) &
"-09-30",(TBLmbcc.DUEDATE)>Year(Date())-1 & "09-30")))
ORDER BY TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME;
et vous avez suggéré :
essayer :
WHERE TBLmbcc.[ACTIF]=No AND
TBLmbcc.DUEDATE>IIf(Month(Date())>9,Year(Date()),Year(Date())-1) & "09-30"
Et j'ai remplacé la Ligne WHERE par celle suggérée. Et j'avais alors la
boite d'erreur " Type de données incompatible dans l'expression du
critère.)
Aujourd'hui j'ai trouvé l'erreur, le "09-30" à la fin de ligne aurait dû
avoir le tiret avant le 09 comme "-09-30"
et tout est maintenant correct.
Pour l'erreur ("DUEDATE") je ne l'ai pas tapée, j'ai essayé aujourd'hui
de la reproduire, sans succès.
Lorsque je suis retourné en mode création, avant de recevoir votre message,
("DUEDATE") était sur la ligne champ, Je l'ai remplacé par DueDate et ttout
est devenu correct.
Cela me chicote, et éventuellement je trouve je vous fais savoir.
Merci de m'avoir lu
Albert


Le 05/10/2017 à 19:18, albert a écrit :
"db" <mailto: a
écrit dans le message de news:59d5efd6$0$9403$
Au lieu de :
WHERE (((TBLmbcc.[ACTIF])=No) AND
((TBLmbcc.DUEDATE)=IIf(Month(Date())>9,([TBLmbcc].[DUEDATE])>Year(Date())
& > "-09-30",([TBLmbcc].[DUEDATE])>Year(Date())-1 & "09-30")))
/Après avoir remplacé le signe = par > avant le iif de la ligne ci-dessus
la requête donnne le résultat attendu :/
SELECT TBLmbcc.[ACTIF], TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME,
TBLmbcc.DUEDATE
FROM TBLmbcc
WHERE (((TBLmbcc.[ACTIF])=No) AND
((TBLmbcc.DUEDATE)>IIf(Month(Date())>9,Year(Date()) &
"-09-30",Year(Date())-1 & "-09-30")))
ORDER BY TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME;

Ah oui, vous avez remplacé = par >, mais vous avez aussi remplacé :
IIf(Month(Date())>9,([TBLmbcc].[DUEDATE])>Year(Date()) &
"-09-30",([TBLmbcc].[DUEDATE])>Year(Date())-1 & "09-30")))
par
IIf(Month(Date())>9,Year(Date()) & "-09-30",Year(Date())-1 & "-09-30")))
ce qui est effectivement moins… comment dire… original :-)
essayer :
WHERE TBLmbcc.[ACTIF]=No AND
TBLmbcc.DUEDATE>IIf(Month(Date())>9,Year(Date()),Year(Date())-1) &
"09-30"
/La requête avec cette ligne affiche les 2048 membres *NON* Actif et leur
dernière DueDate de 1984 à 2018./
SELECT TBLmbcc.[ACTIF], TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME,
TBLmbcc.DUEDATE
FROM TBLmbcc
WHERE (((TBLmbcc.[ACTIF])=No) AND
(("Duedate")>IIf(Month(Date())>9,Year(Date()),Year(Date())-1) &
"-09-30"))
ORDER BY TBLmbcc.LASTNAME, TBLmbcc.FIRSTNAME;

Ce serait mieux de recopier correctement ce que je vous ai proposé : je
n'ai pas écrit "Duedate" entre guillemets, mais TBLmbcc.DUEDATE, ce qui
n'a rien à voir et change complètement le résultat.
db