Dates anglo-saxonnes
Certaines de mes requêtes (exécutées notamment en Visual Basic ou en pur SQL) donnent des résultats curieux lorsqu’elles sont basées sur des dates. Access ne comprendrait-il pas les dates françaises ?
Explication
Lorsque vous manipulez des dates dans Access, celles-ci s’écrivent différemment selon que vous travaillez via l’interface graphique ou par programmation.
- Dans l’interface graphique d’Access, les dates respectent les réglages de votre machine (donc de votre pays). Une date française s’écrira
15/07/2008
(ce qu’Access transformera en#15/07/2008#
). - Dès que vous programmez Access (VB ou SQL), vous passez en « mode anglo-saxon » :
mm/jj/aaaa
au lieu dejj/mm/aaaa
. La même date devient donc#07/15/2008#
.
Une fonction DateUS
Une solution pratique et définitive consiste à écrire une fonction de conversion en Visual Basic, et à l’appeler dès que vous en avez besoin. Pour écrire cette fonction :
- Cliquez sur l’onglet Modules de la base de données.
- Cliquez ensuite sur le bouton Nouveau.
- Tapez le code ci-dessous dans le module.
- Enregistrez le module en le nommant par exemple
mod Dates
.
1 2 3 4 |
Function DateUS(ByVal dt As Variant) If IsNull(dt) Then Exit Function DateUS = "#" & Month(dt) & "/" & Day(dt) & "/" & Year(dt) & "#" End Function |
Lorsque vous souhaiterez convertir une date française en date anglo-saxonne, vous remplacerez votre champ [Date française]
par DateUS([Date française])
.
Variante
Sur le même principe, il peut être utile de tenir compte de la date et de l’heure. Utilisez dans ce cas la fonction suivante :
1 2 3 4 5 |
Function DateHeureUS(ByVal dt As Variant) If IsNull(dt) Then Exit Function DateHeureUS = "#" & Month(dt) & "/" & Day(dt) & "/" & Year(dt) _ & " " & Format(dt, "hh:nn:ss") & "#" End Function |
k027p15 > C’est une possibilité effectivement. Mais si la date est stockée sous forme de texte (et non pas de champ Date/Heure), on perd de nombreuses fonctionnalités intéressantes : toutes les fonctions de manipulation de dates (
DateAdd
,DateDiff
), et tout le calcul sur le temps en général.Pour ma part, je serais plus tenté de stocker « nativement » (Date/Heure), et de convertir au besoin selon le logiciel destinataire.
Bonjour,
Pour ma part, ayant eu des fichiers provenant de divers pays, j’ai résolu le problème de date en utilisant le format de date ISO dans mes tables.
YYYY-MM-DD
L’avantage est que si, par exemple, on exporte des dates format ISO d’une table Access vers une feuille Excel, Excel va interprêter correctement la date en fonction des paramètres régionaux du poste de travail.
Cordialement,
José
Sellig60 > Les Recordsets permettent effectivement d’éviter les problèmes de conversions (imposés par SQL), ça peut être une bonne idée dans certains scénarios.
Mais ça ne résout pas les problèmes d’extraction : si un SELECT SQL doit être filtré par un WHERE, la date qu’il contient devra être convertie au format US obligatoirement.
Juste un complément, par rapport à ton exemple : le Edit que tu fais modifie le premier enregistrement du Recordset. Comme il n’y a pas de WHERE dans le SQL, rien ne dit qu’on modifie l’enregistrement affiché actuellement dans le formulaire.
Bonsoir
J’ai trouvé un moyen de contourner ce problème.
soit un champ texte
Me.ChampTexte.value qui contient : blabla’blabla’blabla (l’apostrophe devrait être échappé sinon message d’erreur)
et un champ date Me.Date.value contenant 15/02/2012 (ce qui donnerait: 02/15/2012 au format anglo saxon.)
en faisant:
SqlSelect = « SELECT NomDeMaTable.champ1, NomDeMaTable.date1 FROM NomDeMaTable; »
set Rs = Application.CurrentDb.openrecordset(SqlSelect)
Rs.Edit
With Rs
.champTexte = Nz(Me.ChampTexte.value, » »)
If isdate (Me.Date.value)= true then
.Date = Me.Date.value
end if
end with
Rs.Update
….
Le résultat est nickel. Le texte est enregistré (pas besoin de replace). Les apostrophes ne posent aucun problème et la date est enregistrée au format français.
voilà voilà
Sellig