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

Access Discussion :

[SQL] Format de date


Sujet :

Access

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 148
    Points : 103
    Points
    103
    Par défaut [SQL] Format de date
    Bonjour,
    J'écris ce post apres avoir lu la FAQ et qqs posts deja existants sur le sujet.
    Voici mon problème, je fais saisir ds une zone de texte une date au format jj/mm/aaaa. Je teste si la saisie est correcte grâce à la fonction IsDate() et bien sur si jamais l'utilisateur entre par exemple le 12/13/2005, la date est validée (j'ai bien compris que cela correspondait au format US des dates).
    Ensuite à partir de cette même date, j'effectue une requete directement sous access (mode SQL) pour afficher un état.
    Je voulais donc savoir comment être sur que ma requete s'effectue avec la bonne date et le bon format. Est ce que je peux faire un test de ma saisie de date et dire qu'elle n'est pas bonne meme qd on entre 12/13/2005 par exemple... (j'ai essayé de faire isdate(format(madate, "dd/mm/yyyy")) et ça ne marche pas).
    Voici un exemple d'une de mes requetes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Sum(T_Stat.LI2QTECOM) AS QTCM, Sum(T_Stat.LI2QTELIV) AS QTLV, Sum(T_Stat.LI2PLHTN) AS PLHTN, Sum(IIF(T_Stat.LI2NFA <> 0,T_Stat.LI2PLHTN,0)) AS CA
    FROM T_Stat
    WHERE (((T_Stat.LI2FAM)=[forms]![F_MenuTriParFamArt]![zdldFamille])) and T_Stat.LI2DABC > #Format(Me.zdtDate, "dd/mm/yyyy")#;
    Merci de m'aider à bien comprendre

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    C'est simple:
    En VB, en VBa et en SQL sous Access, tu doit formater tes dates au format mm/dd/yyyy.

    En VBA par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MySQLString="SELECT Nom, Ville FROM MaTable WHERE DateNaissance Between #12/31/2000# AND #12/09/2004#"
    Quand tu ne sais pas, tu peux reconstituer, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      myTempStringDate = Month(AnyDate) & "/" & Day(AnyDate) & "/" & Year(AnyDate)
      myGoodDate = CDate(myTempStringDate)
    Argy

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 148
    Points : 103
    Points
    103
    Par défaut
    Bonjour argy,
    Ok pour ça...
    Mais dans ma table, j'ai des dates au format "français" (jj/mm/aaaa) et je sais que ça ne compte pas puisque la date est en fait un réel double sous access. Je voudrais savoir comment faire pour etre sur que la date saisie va bien etre comparée avec celle de ma table et qu'il n'y aura pas d'intervertion jour/mois ou mois/jour.
    Est ce que je suis clair???

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    en VBA quand tu compare deux dates, c'est une comparaison numérique. Tu le dis toi-même.
    Ce que tu vois dans tes tables et tes formulaires reste purement dédié au confort visuel, c''est un format.

    Une date jj/mm/aaaa ets égale à une date mm/jj/aaaa.
    C'est ce je t'ai expliqué:
    Si tu as une routine de comparaison écrite en VBA ou si tu exploites une chaîne SQL, il faut la formater en mm/dd/yyyy avant de comparer quelque que soit la date saisie.

    Argy

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 148
    Points : 103
    Points
    103
    Par défaut
    Ok argy c'est définitivement compris
    Une dernière question : j'utilise l'interface access en mode SQL pr faire ma requete et je ne peux pas mettre #" Format(Forms!F_MenuTriStat![zdtDateSaisie], "mm/dd/yyyy") "# sans avoir un message d'erreur.
    Ma requete ainsi ecrite est elle bonne au moins????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Stat.LI2ZOP803, T_Pays.PAYNOM, Sum(T_Stat.LI2QTECOM) AS QTCM, Sum(T_Stat.LI2QTELIV) AS QTLV, Sum(T_Stat.LI2PLHTN) AS PLHTN, Sum(IIF(T_Stat.LI2NFA <> 0,T_Stat.LI2PLHTN,0)) AS CA
    FROM T_Stat INNER JOIN T_PAYS ON T_Stat.LI2ZOP803=T_Pays.PAYCEE
    WHERE T_Stat.LI2DABC < Format(Forms!F_MenuTriStat![zdtDateSaisie], "mm/dd/yyyy")
    GROUP BY T_Stat.LI2ZOP803, T_Pays.PAYNOM;
    Merci et bon we tout le monde
    Podz

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Ma requete ainsi ecrite est elle bonne au moins????
    1/ Euh, une clause GROUP BY exploite un HAVING et non un WHERE...

    2/ Je n'utilise jamais les champs de formulaire dans une requête... Car cela t'oblige à essayer avec ton formulaire ouvert (non modal).

    Si tu ne veux pas t'embêter avec la syntaxe, tu peux procéder ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE CSng(T_Stat.LI2DABC) < CSng((Forms!F_MenuTriStat![zdtDateSaisie])
    Argy

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 148
    Points : 103
    Points
    103
    Par défaut
    Bonjour
    Pour l'histoire du having argy je suis pas spécialiste en SQL comme en access d'ailleurs et ma requete semble bien fonctionner alors je vois pas ce qui changerait à moins que tu me donnes un exemple que je puisse tester.
    Pour CSng(), j'ai une erreur lorsque je fais le remplacement ds ma requete.

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    1/ Oui, ça fonctionne... sous ACCESS...
    Dans SQL Server, tu recevras un beau message d'erreur de syntaxe.

    2/ Si la conversion échoue, c'est certainement parce que tu exploites des données de critères issus d'un formulaire.
    Donc, créé un champ indépendant que tu nomme txtNumDate auquel tu appliques la formule de conversion.
    C'est ce champ que tu mettras en lieu et place dans ta zone de critère:
    Au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE CSng(T_Stat.LI2DABC) < CSng(Forms!F_MenuTriStat![zdtDateSaisie])
    tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE CSng(T_Stat.LI2DABC) < (Forms!F_MenuTriStat![txtNumDate])
    Argy

  9. #9
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 148
    Points : 103
    Points
    103
    Par défaut
    • 1. OK pr SQLServer c'est noté
    • 2. J'ai fait ce que tu m'as dit j'ai tjrs une erreur pour incompatibilité de type entre zdtDateSaisie et txtNumDate.
    Crois tu vraiment que ma requete ne donne pas les bon résultats?

  10. #10
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Est-ce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms!F_MenuTriStat![zdtDateSaisie])
    est bien une date ?
    Si oui, il ne devrait pas y avoir d'erreur...
    Mais tu peux y parer par exemple comme ceci enb affectant à txtNumDate la formule suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =IIf(IsDate([zdtDateSaisie]; CSng([zdtDateSaisie]); 0)
    Mais essaye déjà dans le form avant de tester dans ta requête...

    ***************************************************
    Enfin, tout ceci prend une tournure un peu tengeante et démeusurée...
    Es-tu certain que tes dates soient si vulnérables au point que je te propose cette conversion. Je ne suis pas certain...
    Il y a des tonnes de script SQL qui comparent des dates au format date sans erreur sur cette planète...
    Si tu crains que les utilisateurs puissent saisir des dates au format US alors mets un masque de saisie...

    Argy

  11. #11
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 148
    Points : 103
    Points
    103
    Par défaut
    Je pense que tu as raison argy
    J'ai mis en place un test sur l'evenement click d'un bouton qui apres la saisie de la date permet d'ouvrir un etat. Donc sur cet evenement, je teste le champs zdtDateSaisie avec IsDate et je fais ma requete avec Format(Forms!F_MenuTriStat![zdtDateSaisie], "mm/dd/yyyy") . Je pense que cela suffit pour que ma requete retourne les bons enregistrements et ainsi eviter les problemes liés au format de la date.
    Merci encore pour ton aide et ta patience et si tu estimes que c'est pas suffisant pour etre sur dis le moi tout de meme
    Podz

  12. #12
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 148
    Points : 103
    Points
    103
    Par défaut
    Ah oui j'oubliais...
    J'ai mis un masque de saisie (00/00/0000;0;*) pour le champs zdtDateSaisie.
    Podz

  13. #13
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    le masque de saisie est déconnecté de la valeur renvoyée par le contrôle ...

  14. #14
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 148
    Points : 103
    Points
    103
    Par défaut
    Bonjour
    le masque de saisie est déconnecté de la valeur renvoyée par le contrôle ...
    Ok Cafeine mais c'etait juste pour dire que je ne faisais pas saisir la date n'importe comment.
    Podz

  15. #15
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    je préfère la méthode lourde mais sure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = " .... WHERE MonchampDate = #" & Format(Me.CtlDate, "mm/dd/yyyy") & "# ..."

  16. #16
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 148
    Points : 103
    Points
    103
    Par défaut
    Bonjour
    Tu penses donc qu'il faut que je traite ce problème de format de date en passant par vba et non pas en utilisant l'interface SQL de access pour les requetes??? Que ça serait plus sur en terme de fiabilité des enregistrements retournées par ma requete???
    Si c'est ça je suis pas specialiste et je ne sais pas comment m'y prendre convenablement pour gérer ça ds un etat. Car la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Stat.LI2ZOP803, T_Pays.PAYNOM, Sum(T_Stat.LI2QTECOM) AS QTCM, Sum(T_Stat.LI2QTELIV) AS QTLV, Sum(T_Stat.LI2PLHTN) AS PLHTN, Sum(IIF(T_Stat.LI2NFA <> 0,T_Stat.LI2PLHTN,0)) AS CA 
    FROM T_Stat INNER JOIN T_PAYS ON T_Stat.LI2ZOP803=T_Pays.PAYCEE 
    WHERE T_Stat.LI2DABC < Format(Forms!F_MenuTriStat![zdtDateSaisie], "mm/dd/yyyy") 
    GROUP BY T_Stat.LI2ZOP803, T_Pays.PAYNOM;
    sert de source à un état qui permet de faire l'affichage des enregistrements retournées. J'imagine qu'avec qqs recherches sur le forum... mais si tu as des conseils je suis preneur car je cherche à ce que les données que je vais afficher soient les plus fiables possibles pour etre traiter apres par les commerciaux de la boite ou je bosse.
    Merci d'avance
    Podz

  17. #17
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Humm, le principe est simple...
    Tu as un état ;
    Ce dernier possède tout comme un formulaire un RecordSource ;
    Ce RecordSource peut être soit une table, soit une requête, soit une chaîne SQL directement tapée dans la zone prévue soit et enfin, une chaine SQL créé en VBA et affectée dynamiquement à l'état...

    Il est donc possible de faire en sorte que l'état s'ouvre alors qu'il possède toujours la même source SQL et en l'occurence une requête. Cette dernière, tu peux la créer dynamiquement en appuyant sur ton bouton Imprimer...

    Je te fournis le déroulement, à toi de nous pondre un beau script...

    cmdPrint
    1/ Vérifier existence requête
    2/ Construction nouvelle chaîne SQL
    - Si existe déjà mettre à jour
    - Sinon créer requête
    3/ Ouvrir état
    4/ Les données sont à jour.

    Pour ce faire, tu jettes un oeil à ce tuto.

    Bon courage

    Argy

  18. #18
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 148
    Points : 103
    Points
    103
    Par défaut
    Merci argy
    Je me lance de suite pour voir si j'aurai des differences d'affichage avec la méthode utilisées actuellement (Source de mon état = Requete créée sous l'interface access et que j'ai cité dans mon précédent post).
    j'aurai sans doute besoin d'aide pour utiliser la clause Having dans la requete (comme tu m'en avais parlé...).
    Podz

Discussions similaires

  1. [SQL-SERVER] Configurer le format de date
    Par Angath dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 23/09/2010, 14h15
  2. [SQL]format de date
    Par arn.oo dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 02/04/2007, 16h09
  3. [ASE][T-SQL]Format de date : YYYYMMDDhhmmss
    Par e-miel dans le forum Sybase
    Réponses: 5
    Dernier message: 16/02/2006, 17h42
  4. requete SQL et probleme de format de Date
    Par huon dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/08/2005, 11h56
  5. [SQL][DateTime] Formater les dates en SQL
    Par Husqvarna dans le forum C++Builder
    Réponses: 3
    Dernier message: 09/11/2004, 21h36

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