IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Encore un problème de date


Sujet :

VBA Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut Encore un problème de date
    J'avais eu des problèmes de date, et j'en ai à nouveau...

    Dans une zone texte ayant pour masque de saisie 00/00/0000;0;_ , l'utilisateur doit entrer une date. Celle-ci semble être présentée sous le format jj/mm/aaaa, puisqu'en entrant la date 12/31/2000, la valeur affichée après changement du focus est 31/21/2000.
    A la fin de sa saisie, l'utilisateur active un bouton, j'utilise "INSERT INTO" pour enregistrer les données dans une table, où les données semblent présentée sur le même schéma jj/mm/aaaa. (j'ai une date 30/06/1112 affichée) Lors de cette insertion, j'ajoute 6 mois à la date renseignée dans la zone de texte.
    Et là, problème. Concernant les dates ayant un jour > 12, rien à signaler, tout se passe comme désiré. Pour les autres, par contre, c'est la valeur du jour qui est modifiée dans la table, alors que l'année change aussi.
    J'utilise ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL "INSERT INTO TblDocs VALUES ('" & Replace(Me.txtNomST.Value, Chr(39), " ") & "', '" & Me.lbldoc1.Caption & "', #" & DateAdd("m", 6, Me.txtdoc1.Value) & "#) "
    Ainsi, quand 31/12/2000 devient bien 31/06/2001, 11/11/1111 devient par contre 05/11/1112...

    Si l'utilisateur veut modifier ces dates, il peut rouvrir le formulaire. Je cherche donc à afficher la date qu'il a renseignée, non pas celle qui a été enregistrée, et là je n'ai aucun soucis que le jour soit supérieur ou inférieur à 12. Enfin, aucun problème, si on considère que la date enregistrée est la bonne, ce qui est rarement le cas...

    J'ai essayé d'appliquer la fonction CDate a mon code de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL "INSERT INTO TblDocs VALUES ('" & Replace(Me.txtNomST.Value, Chr(39), " ") & "', '" & Me.lbldoc1.Caption & "', #" & CDate(DateAdd("m", 6, Me.txtdoc1.Value)) & "#) "
    et de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL "INSERT INTO TblDocs VALUES ('" & Replace(Me.txtNomST.Value, Chr(39), " ") & "', '" & Me.lbldoc1.Caption & "', #" & DateAdd("m", 6, CDate(Me.txtdoc1.Value)) & "#) "
    mais sans succès...

    En vous remerciant d'avance pour votre aide,
    wulfram

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 553
    Points : 566
    Points
    566
    Par défaut
    Bonjour,

    J'ai eu ce genre de problème

    quand tu insères ta date dans la table, n'y mets pas la date seulement.... Précise la au format mm/jj/aaaa et tu verras qu'il mettra la bonne date dans la table et que tu devrais t'en servir normalement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Format(taDate,"mm/jj/aaaa")
    c'est bizarre mais çà marche
    Moi aussi, si j'insérais 12/01/2007 par exemple, il m'écraivait 01/12/2007
    Si je faisias Format(12/01/2007,"mm/jj/aaaa"), il m'écraivait effectivement 12/01/2007

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut
    En fait, le problème se pose au moment de l'insertion, si j'utilise une msgbox pour afficher DateAdd("m", 6, Me.txtdoc1.Value), j'ai la valeur souhaitée...

    Quand tu parles du Format, c'est à quel niveau qu'il faut l'utiliser ? Mes champs sont de type Date, au format date abrégée, l'exemple est 19/06/1994, donc c'est bien du jj/mm/aaaa....
    En utilisant Format(DateAdd("m", 6, Me.txtdoc1.Value), "jj/mm/aaaa") (ou mm/jj/aaaa) j'ai l'erreur suivante : Erreur d'exécution 3075 -- Erreur de syntaxe dans la date dans l'expression '#jj/05/aaaa#'
    En gros, le jour et l'année (qui ne sont pas changés par le DateAdd) semble poser problème...
    J'ai remplacé les j par des d, et les a par des y.
    L'erreur n'est plus.
    Mon problème persiste...
    Tu pourrais me donner un exemple de code pour insérer la date 10/07/2000 dans une table après y avoir ajouté 6 mois, sachant que le 07 correspond au mois ?

    Edit : n utilisant le format après l'insertion, j'obtiens un résultat cohérent. Le problème est que je n'arrive plus à exporter les dates vers Excel, j'ai des # qui s'affichent...
    En fait non, le résultat est cohérent dans le formulaire récupérant les dates, mais pas dans la table, les jours/mois sont encore inversés selon que le jour soit supérieur ou inférieur à 12, donc également dans le résultat de la requête.
    Le problème avec Excel venait simplement de date trop vieilles, avec des dates plus récentes, ça fonctionne.

    J'ai utilisé ce code pour faire différents essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DoCmd.RunSQL "INSERT INTO TblDocs VALUES ('" & Replace(Me.txtNomST.Value, Chr(39), " ") & "', '" & Me.lbldoc1.Caption & "', #" & Format(DateAdd("m", 6, Me.txtdoc1.Value), "dd/mm/yyyy") & "#) "
    DoCmd.RunSQL "INSERT INTO TblDocs VALUES ('" & Replace(Me.txtNomST.Value, Chr(39), " ") & "', '" & Me.lbldoc2.Caption & "', #" & Format(DateAdd("m", 6, Me.txtdoc2.Value), "dd/mm/yyyy") & "#) "
    DoCmd.RunSQL "INSERT INTO TblDocs VALUES ('" & Replace(Me.txtNomST.Value, Chr(39), " ") & "', '" & Me.lbldoc3.Caption & "', #" & Format(DateAdd("m", 6, Me.txtdoc3.Value), "dd/mm/yyyy") & "#) "
    DoCmd.RunSQL "INSERT INTO TblDocs VALUES ('" & Replace(Me.txtNomST.Value, Chr(39), " ") & "', '" & Me.lbldoc4.Caption & "', #" & Format(DateAdd("m", 6, Me.txtdoc4.Value), "dd/mm/yyyy") & "#) "
    Les dates entrées, dans l'ordre des documents : 11/11/2000 - 30/11/2000 - 11/30/2000 (qui se "transforme" en 30/11/2000 déjà dans la txtdoc) - 06/07/2000

    Dans la table, ces résultats : 05/11/2001 - 30/05/2001 - 30/05/2001 - 01/06/2001
    Donc Format(...) ne change en rien la façon dont access enregistre la date...
    (Pour ce test, pas de Format défini pour le champs)
    Avec un format jj/mm/aaaa pour le champs, le résultat est strictement le même...

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    En vb et en SQL les dates littérales doivent être au format US mm/dd/yyyy ou mm-dd-yyyy et encadrées par des dièses (#).
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim dt As Date
     
    dt = #5/23/2008#  ' 23 mai 2008
     
    ' Les deux lignes qui suivent font la même chose
    DoCmd.RunSQL "INSERT INTO LaTable (ChpDate) VALUES(#5/23/2008#)"
    DoCmd.RunSQL "INSERT INTO LaTable (ChpDate) VALUES(#" & Format(dt, "mm\/dd\/yyyy") & "#)"
    Reste le problème de la saise de dates.
    L'inversion jour/mois est toujours possible.

    Si on veut que la valeur de la zone de texte (dont le format d'affichage est de type date) soit de type variant/date,
    le moyen le plus sûr est de saisir conformément au format défini dans les paramètres régionnaux.
    Mais il est vrai que peu d'utilisateurs savent le faire.
    Généralement je met un exemple sur le formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim strFmtDt As String
    strFmtDt = Format(#12/31/2999#, "Short Date")
    strFmtDt = Replace(strFmtDt, "12", "mm")
    strFmtDt = Replace(strFmtDt, "31", "jj")
    strFmtDt = Replace(strFmtDt, "2999", "aaaa")
    strFmtDt = Replace(strFmtDt, "99", "aa")
    Me.lbl_DtSample.Caption = "Format date : " & strFmtDt & _
                              " - Ex. Ajourd'hui : " & Format(Date, "Short Date")
    Si on veut imposer un format particulier, on laisse le format d'affichage à blanc, de manière à ce que la valeur
    de la zone de texte soit de type Variant/String.
    Ensuite on extrait le jour le mois et l'année à l'aide du séparateur imposé, pour recomposer une date.
    Ex si j'impose jj.mm.aaaa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim arrDt() As String, dt As Date
     
    arrDt = Split(Me.txtDate2, ".")
    dt = DateSerial(CInt(arrDt(2)), CInt(arrDt(1)), CInt(arrDt(0)))
    A+

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut
    PS : j'utilise Access 2002 (10.2627.6839) SP3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim arrDt() As String
    Dim echea As Date
    arrDt = Split(Me.txtdoc1.Value, "/")
    echea = DateSerial(CInt(arrDt(2)), CInt(arrDt(1)), CInt(arrDt(0)))
    MsgBox (echea)
    echea = DateAdd("m", 6, echea)
    MsgBox (echea)
     
    DoCmd.RunSQL "INSERT INTO TblDocs VALUES ( #" & echea & "#) "
    Si la première MsgBox retourne 11/11/1111, la seconde me retourne 11/05/1112. Et la date est enregistrée en tant que 05/11/1112.
    Si la première MsgBox retourne 30/11/2000, la seconde retourne 30/05/2001.
    Et la date est enregistrée en tant que 30/05/2001.
    La zone de texte a eu pour format jj/mm/aaaa et mm/jj/aaaa pour ces tests, les résultats sont parfaitement identique.
    Sans format, ni masque de saisie, les résultats sont encore identiques : les valeurs enregistrées telles qu'elles apparaissent dans la table sont : 05/11/1112 et 30/05/2001.


    Encore une fois, la date est inversée. Ce que je souhaite, c'est qu'elle soit toujours de la forme 30/05/2001 ; 11/05/1112 dans la table. C'est-à-dire, comme dans les MsgBox.

    Je vais récapituler l'ensemble des actions avec ces deux exemples de dates.
    Pour commencer, l'utilisateur doit entrer une date dans une zone de texte, ayant de préférence un masque de saisie, si possible au format français : 11/11/1111 et 30/11/2000. (affichage zone de texte)
    J'ajoute ensuite six mois à cette date : 11/05/1112 et 30/05/2001. (affichage msgbox)
    J'insère ensuite ces valeurs dans un champ date d'une table. Le problème survient à ce niveau : les dates dont le jour est inférieur à douze sont enregistrées avec le format mm/jj/aaaa, les autres au format recherché jj/mm/aaaa : 05/11/1112 et 30/05/2001. (affichage dans la table)

    Table ouverte, et en cliquant sur certains enregistrement (champs au format mm/jj/aaaa), le format change "visuellement". (il est traité, dans une zone de liste par exemple, selon son format avant clic) Ces enregistrements correspondent tous à la date 11/05/1112 (et 05/30/2001 enregistré pour l'autre date test) Le format passe alors à 05/11/1112, c'est-à-dire le même q'avec une date ayant un jour > 12. C'est déjà pas mal, ça prouve qu'Access reconnait le "problème", reste à le lui faire résoudre.


    Edit : un début de piste
    En utilisant ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DoCmd.RunSQL "INSERT INTO TblEcheance VALUES (#" & Format(DateAdd("m", 6, Me.txt9.Value), "mm/dd/yyyy") & "#, #" & Format(DateAdd("m", 6, Me.txt9.Value), "mm/dd/yyyy") & "#, #" & Format(DateAdd("m", 6, Me.txt9.Value), "mm/dd/yyyy") & "# )"
    DoCmd.RunSQL "INSERT INTO TblEcheance VALUES (#" & Format(DateAdd("m", 6, Me.txt10.Value), "mm/dd/yyyy") & "#, #" & Format(DateAdd("m", 6, Me.txt10.Value), "mm/dd/yyyy") & "#, #" & Format(DateAdd("m", 6, Me.txt10.Value), "mm/dd/yyyy") & "# )"
    pour insérer dans un champs date, un champ date au format jj/mm/aaaa et un champs date au format mm/jj/aaaa. J'obtiens une "bonne présentation" au niveau de la table pour les champs sans format et avec format jj/mm/aaaa. (contraire au format de l'INSERT mm/dd/yyyy)
    Je ne dois pas avoir tout à fait saisi l'ordre des actions dans ce genre de commande.
    Je vais me lancer dans le traitement inverse (passer de la table aux zones de texte) et je viendrai ajouter un tag résolu ensuite.

    Hop, même si je ne comprend pas pourquoi c'est comme ça que ça fonctionne, mon problème semble être résolu...
    Merci de m'avoir guidé dans ma réflexion,

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    dans ton code
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim arrDt() As String
    Dim echea As Date
    arrDt = Split(Me.txtdoc1.Value, "/")
    echea = DateSerial(CInt(arrDt(2)), CInt(arrDt(1)), CInt(arrDt(0)))
    MsgBox (echea)
    echea = DateAdd("m", 6, echea)
    MsgBox (echea)
     
    DoCmd.RunSQL "INSERT INTO TblDocs VALUES ( #" & echea & "#) "
    tu as oublié de formater la date en mm/dd/yyyy dans l'instruction SQL.
    C'est ce qui cause l'inversion.

    A+

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par LedZeppII Voir le message
    dans ton code
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim arrDt() As String
    Dim echea As Date
    arrDt = Split(Me.txtdoc1.Value, "/")
    echea = DateSerial(CInt(arrDt(2)), CInt(arrDt(1)), CInt(arrDt(0)))
    MsgBox (echea)
    echea = DateAdd("m", 6, echea)
    MsgBox (echea)
     
    DoCmd.RunSQL "INSERT INTO TblDocs VALUES ( #" & echea & "#) "
    tu as oublié de formater la date en mm/dd/yyyy dans l'instruction SQL.
    C'est ce qui cause l'inversion.

    A+
    Il y a toujours inversion lors d'une insertion/update en SQL ?
    Si au début je suis en jj/mm/aaaa, ça enregistrera en mm/jj/aaaa et si je suis en mm/jj/aaaa ça enregistrera en jj/mm/aaaa ?
    En fait, je pensais plus qu'il y avait des "formats par défaut" différents selon l'endroit où la date est utilisé, et que c'était pour cette raison qu'avec un même départ, j'obtenais deux résultats différents au fil des changements.
    11/05/1112 (dans code SQL) => 05/11/1112 (dans la table)
    31/05/2001 (dans code SQL) => 31/05/2001 (dans la table)
    La deuxième date a un format "obligatoire" vu que le jour > 12, mais la seconde permet des pirouettes...
    Enfin, j'ai un résultat qui semble m'apporter satisfaction à première vue... la seule chose qui me dérange, c'est de ne pas comprendre pourquoi j'ai du imposer un format mm/jj/aaaa à une date au format jj/mm/aaaa pour l'enregistrer avec ce même format. (jj/mm/aaaa)

  8. #8
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Dans sa représentation interne (type Date/heure) une date est un nombre réel (Double).
    C'est une représentation indépendante du format d'affichage.
    Le format d'affichage est plus une sorte d'interface homme-machine.

    Une instruction SQL c'est juste du texte. On a pas le support d'une variable ou d'un champ qui tous deux sont typés (Texte,Nombre,Date).
    Si on doit écrire une donnée littérale il faut se conformer à une certaine syntaxe et à certaines conventions pour que le moteur de données puisse reconnaître le type de la donnée littérale.
    Les textes sont encadrés par des quotes (simple ou double)
    Les nombres utilisent le point (.) comme séparateur décimal
    Les dates sont encadrée par des dièses (#) et au format américain (mois/jour/Année).
    Par convention, le point est le séparateur décimal en SQL (comme en vba) et toujours par convention les dates littérales sont écrites au format US.

    Il y a toujours inversion lors d'une insertion/update en SQL ?
    Non, ça dépend des paramètres régionnaux.
    Mais si tu es en jour/mois/année il y a de forte chances qu'il y ait une inversion.
    Sauf tu l'as remarqué quand le jour est supérieur à 12.

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de date (encore)
    Par Piett dans le forum Général Python
    Réponses: 18
    Dernier message: 29/02/2008, 12h32
  2. Encore un problème sur le format d'une date!
    Par bygui dans le forum Langage
    Réponses: 1
    Dernier message: 26/06/2006, 08h41
  3. [Dates] Encore un problème de dates
    Par philippef dans le forum Langage
    Réponses: 3
    Dernier message: 04/03/2006, 12h46
  4. [Dates] Encore un problème de date
    Par philippef dans le forum Langage
    Réponses: 1
    Dernier message: 12/01/2006, 21h30
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo