{Access} requête incompatible avc CDate
eric13500
-
castours Messages postés 2955 Date d'inscription Statut Membre Dernière intervention -
castours Messages postés 2955 Date d'inscription Statut Membre Dernière intervention -
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.
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
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) ?
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) ?
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() ?
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() ?
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.
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.
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.
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.
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())))
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 !
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 !
Moi, j'ai ça qui marche :
champ1 est de type date et j'ai des virgules qui séparent les paramètres de datepart...
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...
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...)
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...)
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 ?
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 ?
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;
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;
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 !
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 !!!
la voici :
Dans ma requête, je crée un champ calculé "Anniversaire" (code à saisir dans le champ "champ" de l'assistant requête :
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 :
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...)