{Access} requête incompatible avc CDate

Fermé
eric13500 - 2 nov. 2009 à 12:30
castours Messages postés 2955 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 31 août 2019 - 20 avril 2011 à 16:31
Bonjour,

Je suis face à un problème... très curieux !

Je fais une requête sur 3 champs :

champ1 = CIVILITE_Ref (type Texte)
champ2 = CIVILITE_Date_Naissance (type Date)
champ3 = Anniversaire: CDate(PartDate("d";[CIVILITE_Date_Naissance]) & "/" & PartDate("m";[CIVILITE_Date_Naissance]) & "/" & PartDate("yyyy";Maintenant()))

En d'autres termes, le champ3 est un cham calculé qui donne la date d'anniversaire de la personne dans l'année courante (par exemple, si nous sommes en 2009 et qu'elle est née un 29/12/69, le champ3 donnera : 29/12/2009).

Jusque là, tout va bien ! ça fonctionne !

Ce qui m'intéresserait, ce serait d'avoir tous ceux dont l'anniversaire est à venir dans l'année...

Je mets donc dans ce même champ3 le critère : >Maintenant()
C'est là que ça dérape : à l'exécution de la requête, il me répond : "Type de données incompatible dans l'expression du critère."...

J'ai pourtant bien utilisé CDate pour convertir la chaîne en date... j'ai vérifié de deux façons que CDate fonctionnait : d'une part j'ai vérifié les formats de champ disponible pour champ3, et seuls des formats date et heure figuraient dans la liste, et j'ai aussi tout bêtement tenté d'enlever CDate(), et le résultat de la requête me donnait des dates de type 3/5/2009 (au lieu de 03/05/2009 avec CDate()).

Avant de poster, j'ai évidemment essayé de définir plusieurs critères dans mon champ3, tous basés sur des comparatifs de date, et j'ai toujours la même erreur... Et j'ai aussi tenté d'inculre des # avant et après dans mon expression :
Anniversaire: CDate("#" & PartDate("d";[CIVILITE_Date_Naissance]) & "/" & PartDate("m";[CIVILITE_Date_Naissance]) & "/" & PartDate("yyyy";Maintenant()) & "#")
et là il n'accepte directement pas l'expression...

Dans l'attente de vos réponse et vous en remerciant par avance, bien cordialement,
Eric.

6 réponses

blux Messages postés 26536 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 décembre 2024 3 317
2 nov. 2009 à 15:57
si tu ne mets pas le where ?

et si dans le where, tu vires toutes les parenthèses inutiles pour revenir à la syntaxe du select (bien que je n'y croie pas, car elles sont pairées correctement) ?
2
Ca ne change rien...
De toutes façons, je travaille en mode création, pas en SQL direct (pas assez de maîtrise du langage).
Pour te fournir le code SQL, j'ai juste basculé d'affichage.

En fait, il semblerait que l'erreur Utilisation incorrecte de Null se produise dès que je rajoute la clause WHERE, quels qu'en soient les critères.

Merci en tout cas de ta patience !
0
eric13500 > eric13500
2 nov. 2009 à 16:56
Je viens d'essayer d'ajouter la fonction Nz() qui permet de remplacer les valeurs Null par autre chose. Dans mon cas, je demande de remplacer les éventuels champs Null par "01/01/1900" :

SELECT CDate(Nz(CStr(DatePart("d",[CIVILITE_Date_Naissance])) & "/" & CStr(DatePart("m",[CIVILITE_Date_Naissance])) & "/" & CStr(DatePart("yyyy",Now())),"01/01/1900")) AS Anniversaire
FROM [PréClassement par anniversaire (N)]
WHERE (((CDate(Nz(CStr(DatePart("d",[CIVILITE_Date_Naissance])) & "/" & CStr(DatePart("m",[CIVILITE_Date_Naissance])) & "/" & CStr(DatePart("yyyy",Now())),"01/01/1900")))>Now()));

... Et ça continue de me dire que je fais une Utilisation incorrecte de Null !!!
0
eric13500 Messages postés 8 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 22 août 2018
20 avril 2011 à 15:01
Salut à tous, et désolé de n'être pas revenu plus tôt poster la solution... car je l'ai enfin, la solution !!!
la voici :
Dans ma requête, je crée un champ calculé "Anniversaire" (code à saisir dans le champ "champ" de l'assistant requête :
Anniversaire:
VraiFaux(SérieDate(Année(Date());Mois(CIVILITE_Date_Naissance);Jour(CIVILITE_Date_Naissance))<Date();
SérieDate(Année(Date())+1;Mois(CIVILITE_Date_Naissance);Jour(CIVILITE_Date_Naissance));
SérieDate(Année(Date());Mois(CIVILITE_Date_Naissance);Jour(CIVILITE_Date_Naissance)))

Note : les sauts de lignes ont été rajoutés ici pour une meilleure lisibilité. Il ne faut évidemment pas les mettre dans le code, qui doit être saisi sans saut de ligne ni espace.

Pour ceux qui préfèrent le SQL :
SELECT IIf(DateSerial(Year(Date()),Month(CIVILITE_Date_Naissance),Day(CIVILITE_Date_Naissance))<Date(),DateSerial(Year(Date())+1,Month(CIVILITE_Date_Naissance),Day(CIVILITE_Date_Naissance)),DateSerial(Year(Date()),Month(CIVILITE_Date_Naissance),Day(CIVILITE_Date_Naissance))) AS Anniversaire, CIVILITE.CIVILITE_Ref, CIVILITE.CIVILITE_Prenom, CIVILITE.CIVILITE_Nom, CIVILITE.CIVILITE_Secteur, CIVILITE.CIVILITE_Tel_Gsm, CIVILITE.[CIVILITE_E-mail], CIVILITE.CIVILITE_Date_Naissance
FROM CIVILITE
WHERE (((CIVILITE.CIVILITE_Date_Naissance) Is Not Null))
ORDER BY IIf(DateSerial(Year(Date()),Month(CIVILITE_Date_Naissance),Day(CIVILITE_Date_Naissance))<Date(),DateSerial(Year(Date())+1,Month(CIVILITE_Date_Naissance),Day(CIVILITE_Date_Naissance)),DateSerial(Year(Date()),Month(CIVILITE_Date_Naissance),Day(CIVILITE_Date_Naissance)));


Voilà, ça fonctionne... qui a dit que c'était compliqué ???

En espérant que ça pourra en aider certains, et remerciant encore ceux qui ont participé à ce post, bien cordialement,
Eric.
(en revenche, je ne sais pas comment marquer le sujet comme résolu...)
0
blux Messages postés 26536 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 décembre 2024 3 317
2 nov. 2009 à 13:53
Salut,

comment est tapée ta requête : avec l'assistant ou c'est toi qui tapes le SQL ?

As-tu essayé now() au lieu de maintenant() ?
0
Salut Blux, et meci pour la rapidité de ta réponse.

Je travaille toujours en mode création (je programme assez régulièrement en VBA, et je préfère généralement maîtriser l'ensemble des opérations).

Eu égard à la variété du VBA (à commencer par les différences de nom de fonction entre access et vba, comme PartDate() en access qui devient DatePart() en VBA), j'utilise aussi l'assistant pour la syntaxe, et si besoin j'intègre mon propre code (car l'assistant est parfois plus pesant que la frappe directe !).

Donc, là comme à mon habitude, j'ai construit ma requête ne mode création et j'ai saisi mon code dans l'assistant conception de formule, au niveau du nom du champ.

J'ai bien essayé Now(), ainsi que Date() (ce dernier étant de rigueur en VBA)...

Dans le cas de Now(), il le remplace automatiquement par Maintenant(), et Date() fonctionne aussi bien, sauf quand je rajoute dans les critères >Maintenant() (ou Date(), ou Now(), il me renvoit cette incompatibilité de type incompréhensible...

A titre indicatif, jai aussi essayé de mettre des critères de sélection basés sur le champ2, et ça fonctionne :
PartDate("m";[CIVILITE_Date_Anniversaire])>PartDate("m";Maintenant())

Ceci ayant le mérite de prouver que mon champ2 a bien le format date et que le moteur fonctionne correctement.
La question se situe donc bien au niveau du champ3 qui refuse les critères de type date alors que CDate() a bien un effet puisqu'au moins il remet en forme le contenu du champ.
0
eric13500 > eric13500
2 nov. 2009 à 14:42
J'ajoute que j'ai aussi essayé d'enlever CDate()
Dans ce cas, la requête n'est plus rejetée, mais le critère est transparent, il n'est pas respecté, et tous les enregistrements sont affichés.
autre test, j'ai simplement ajouté un champ4 :
Date:Maintenant()
Ce qui a eu le mérite de prouver que le format de date est bien de la forme dd/mm/yyy hh:mm, et donc qu'il ne doit pas s'agir d'une question de format de date (Anglais - Français)

Merci encore.
0
blux Messages postés 26536 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 décembre 2024 3 317
2 nov. 2009 à 14:32
partdate renvoie un numérique, je le mettrais en entrée d'un cstr avant la concaténation, car là tu juxtaposes des integers et des strings...

CDate(CStr(PartDate("d";[CIVILITE_Date_Naissance])) & "/" & Cstr(PartDate("m";[CIVILITE_Date_Naissance])) & "/" & Cstr(PartDate("yyyy";Maintenant())))
0
J'y avais pensé, et j'avais essayé... mais comme le gros imbécile que je suis, je ne l'ai mis que sur le premier PartDate() !!!

Par contre, je tombe sur une nouvelle erreur : Utilisation incorrecte de Null

Ce Null vient du fait que certaines dates ne sont pas renseignées...

Je vais essayer de créer une sous requête qui élimine les dates vides, et je reviens donner des nouvelles !
0
eric13500 > eric13500
2 nov. 2009 à 14:54
Même problème avec la sous-requête : Utilisation incorrecte de Null alors qu'aucun champ n'est à Null et que je n'utilise pas l'expression dans mes champs ou critères....

Il y a vraiment des fois où on se demande....
0
eric13500 > eric13500
2 nov. 2009 à 14:59
J'oubliais : cette erreur n'intervient que lorsque je place mon critère de sélection >Maintenant(), sans quoi tout s'affiche correctement...
0
blux Messages postés 26536 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 décembre 2024 3 317
2 nov. 2009 à 15:14
Moi, j'ai ça qui marche :

SELECT CDate(cstr(datepart("d",champ1)) & "/" & cstr(datepart("m",champ1)) & "/" & cstr(datepart("yyyy",champ1))) AS Expr1
FROM table2
WHERE CDate(cstr(datepart("d",champ1)) & "/" & cstr(datepart("m",champ1)) & "/" & cstr(datepart("yyyy",champ1))) >now()

champ1 est de type date et j'ai des virgules qui séparent les paramètres de datepart...
0
euh...

SELECT CDate(CStr(DatePart("d",[CIVILITE_Date_Naissance])) & "/" & CStr(DatePart("m",[CIVILITE_Date_Naissance])) & "/" & CStr(DatePart("yyyy",Now()))) AS Anniversaire
FROM [PréClassement par anniversaire (N)]
WHERE (((CDate(CStr(DatePart("d",[CIVILITE_Date_Naissance])) & "/" & CStr(DatePart("m",[CIVILITE_Date_Naissance])) & "/" & CStr(DatePart("yyyy",Now()))))>Now()));

J'ai beau écarquiller les yeux, il me semble que le code SQL de ma requête est identique au tien, aux noms de sources et champ près...

et ça me renvoie toujours cette erreur Utilisation incorrecte de Null...

A titre indicatif, [PréClassement par anniversaire (N)] et une requête basée sur ma table CIVILITE et qui en élimine les enregistrements ne comportant pas de date (critère Est Pas Null).
En gros, je base cette nouvelle requête sur une autre dont aucun champ n'est Null...
Alors j'ai vraiment du mal à comprendre d'où il me sort ce Null.

Précision sûrement importante, l'erreur n'intervient que lors de l'ajout d'un critère de sélection dans le champ [Anniversaire] ([expr1] dans ton exemple).

On est bien face à un drôle de problème...

Je vais tenter de redémarrer Acces (c'est idiot, mais face à un problème illogique...)
0
eric13500 > eric13500
2 nov. 2009 à 15:55
Comme je le disais, c'est idiot... et ça n'apporte rien.
0

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

Posez votre question
Bonjour à tous,

Je travaille sur une base de donnée ACCESS, et je cherche à trier mes dates soit 01/02/2010 par année, par mois puis par jour, seulement ACCESS ne me trie absolument pas les dates dans cet ordre la.
Quelle fonction je dois intégrer dans les critères de tri/filtre ?
0
blux Messages postés 26536 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 décembre 2024 3 317
19 avril 2011 à 15:22
Merci de démarrer une nouvelle discussion...
0
eric13500 Messages postés 8 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 22 août 2018
20 avril 2011 à 15:03
Effectivement, il serait plus judicieux de démarer un nouveau sujet.
Pour celles et ceux qui serait venus consulter le sujet original, la réponse se trouve un peu plus haut.
0
castours Messages postés 2955 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 31 août 2019 217
20 avril 2011 à 16:31
Bonjour
j'ai fait un exemple de requete pour connaitre l'age des personnes pour une année choisie . J'extrais du champ date de naissance l'année puis tu parametres la requete pour en choisir l'année

SELECT T_Adherents.Titre, [Prénom ] & " " & [Nom de famille] AS Identé, T_Adherents.Ville, (Date()-[Date de naissance])/365.25 AS Age, [T_Saisons des cours].Saison, T_Adherents.[Date de naissance], Year([Date de naissance]) AS Année
FROM [T_Saisons des cours] INNER JOIN (T_Adherents INNER JOIN T_AdherentsInscrits ON T_Adherents.IdAdh = T_AdherentsInscrits.IdAdh) ON [T_Saisons des cours].Saison = T_AdherentsInscrits.Saison
WHERE (((Year([Date de naissance]))=1958))
ORDER BY (Date()-[Date de naissance])/365.25;
0