Dates dans Mshflexgrid

cs_comme Messages postés 122 Date d'inscription dimanche 19 mars 2006 Statut Membre Dernière intervention 18 juillet 2009 - 19 mars 2006 à 18:22
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 - 21 mars 2006 à 10:25
Bonjour
Je travaille sur visual basic
les dates dans ma base de données access sont au format français(DD/MM/yyy) à l'aide d'une connexion j'affiche la table das une mshflexgrid,les dates sont alors affichées dans le format americain(MM/DD/YYYY) c'est une propriété originale de ce contrôle.
Pur corriger le probleme j'utilise la boucle suivante:
dim dt as date
for i=1 to mshflexgrid.rows-1
msh.row=i
msh.col=2
dt=mshflexgrid.text
mshflexgrid.text=format(dt,"DD/MM/YYYY")
next i
et voilà le problème qui se pose :
si le jour est inferieur ou égal à 12
le format americain persiste et ne se change pas
si le jour est superieur ou égal à 13 le format français est réalisé ,j'ai peur de devenir fou avant de comprendre pourquoi celà se passe comme ça.
Avezvous une idée geniale ? merci

3 réponses

rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
20 mars 2006 à 16:54
Salut comme,

essaies cela dans une fenêtre VB d'exécution immédiate (CTRL+G), et observe.

?format(#10/09/2001#,"DD/MM/YYYY")
réponse : 09/10/2001
et
?format(#10/13/2001#,"DD/MM/YYYY")
réponse : 13/10/2001

conclusion : Quand tu connais le dièse, tu connais la musique! :). Non, je détend l'atmosphère, ici le dièse spécifie que c'est une constante date qu'on lui donne, vérifies ce qui est stocké dedans en faisant :
?cdbl(#10/09/2001#)

Dans ta base de données, tes Dates sont affichées au format "DD/MM/YYYY", mais elles sont stockées au format Double (~nombre de jours écoulés depuis le 31 déc 1899, je crois, et cela marche en aussi en négatif).
Solution :
Dans une colonne cachée de mshflexgrid, stocke le long représentant la date, et formates ta date à partir de cette valeur dans ton itération.
Plus simple encore, utilise une colonne au format texte, et formates ta date toi-même, à partir de la valeur numérique, au moment ou tu remplit la mshflexgrid !

Qu'en penses-tu?
à+

rvblogn
0
cs_comme Messages postés 122 Date d'inscription dimanche 19 mars 2006 Statut Membre Dernière intervention 18 juillet 2009
20 mars 2006 à 22:47
J'ai lu et bien compris ta réponse qui n'a pas répondu à ma question.
1- d'abord le point d'interrogation que tu mets au debut est refusé
juste au moment de l'exection.
2-l'exemple :[format(#10/09/2001#,"DD/MM/YYYY")
réponse : 09/10/2001 ] marche bien mais moi je n'ai pas de date precise j'ai une boucle et dans chaque lecture de la boucle j'ai : "MSH.text" represente la date à formater et si on substitue dans ton exemple (#10/09/2001# ) par #MSH.text# , hummm rien ne marche ,à l'exection cette ecriture est refusée et est mise en surbrillance.
essayez encore de me conseiller... merci très bien
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
21 mars 2006 à 10:25
Salut comme,

baisses pas les bras! :)
L'exemple que je t'indique ne sert pas qu'à t'aider à réaliser, mais surtout à t'aider à comprendre (ce n'est pas inutile de comprendre, tu sauras transposer ce que tu as compris, si tant que je m'explique suffisament bien).

1- Si tu lis ce que j'ai écrit (je sais que j'écris beaucoup, mais il te suffit de lire moins vite), il s'agit d'écrire cette ligne d'instruction dans la fenêtre d'exécution immédiate (communément appelée fenêtre de debuggage), suivie d'un appui sur la touche [Entrée]. Pour y accéder :

- soit ton code n'est pas en marche, tu fais [CTRL]+[G] (ou menu Affichage>>Fenêtre d'exécution), et tu peux tester . L'opérateur ? est l'équivalent de l'instruction Print, dans la fenêtre d'exécution immédiatepanneau de code, là où se situent tes lignes d'instruction, des procédures...) sous la forme : Debug.Print "test".

- soit ton code est en marche, auquel cas il te suffit de faire [CTRL]+[Pause], pour stopper temporairement l'exécution de ton code, puis de faire [CTRL+[G], pour faire apparaître la fenêtre d'exécution immédiate.

2- Cet exemple sert à mettre en évidence (pour ceux qui en douteraient encore), que VB sait très bien gérer les dates, à nous (et à nous seuls) de les lui présenter sous la bonne forme. Je m'explique :
L'instruction Cdbl(#10/09/2001#) fait apparaître la représentation numérique d'une date, et on observe qu'ainsi présentée, aucune équivoque n'est possible.
Cependant, c'est une constante que l'on a fournit, et on a utilisé une notation (#) qui permet à VB (et à d'autres) de comprendre que c'est la représentation d'une constante de type date, et dans la plupart des cas, c'est une variable que l'on possède, et aucun moyen d'utiliser le signe # dans une variable (de type String), ce n'est pas prévu pour.
Le seul point commun entre cette constante et cette variable est le type. En effet, si tu exécutes immédiatement :

?Typename(#10/09/2001#)
VB répond Date
mais :
?typename(format(#10/09/2001#,"DD/MM/YYYY"))
VB répond String

Au risque de fâcher nombre d'entre nous (à tort), 10/09/2001 n'est pas une date (au sens informatique du terme), mais une représentation littérale d'une date.
Malheureusement, c'est ce que tu veux donner en entrée à la fonction Format. Comment veux-tu qu'elle sache quel est le format de la représentation littérale de la date que tu lui (ndrl, puisque qu'il n'est pas prévu dans son prototype qu'on le lui spécifie)?

Il s'agit donc de lui donner une valeur qu'elle peut comprendre, en l'occurence une valeur de type Date. Tu peux essayer toutes les fonctions de travail sur les dates (de VB), elles auront toutes les mêmes difficultés à transtyper ta représentation littérale d'une date, vers une date.

Dans ton malheur, ce que tu ne sais pas, c'est que tu as de la chance. Tu lis ta valeur à partir d'une base de données (en espérant que ce n'est pas une mauvaise base de données, ou une base de données mal utilisée), là où d'autres travaillent avec un fichier texte (et n'ont aucun moyen facile de transformer la représentation littérale d'une date qu'ils lisent, en une date). Et même, en plus, certains ne connaissent pas d'avance le format de toutes leurs représentations littérales de date.

Il te suffit donc, dans ta requete (SQL si c'en est une) de spécifier que tu ne souhaites pas une représentation littérale de date, mais une représentation numérique (normalisation ANSI) de date, qui, comme elle est normalisé est autorisée, par métonymie, à être appelée une Date.

Voilà, tu en sait trop maintenant,
à+

PS: ne te laisses pas abuser par mon ton, qui peut avoir l'air ironique parfois (même souvent), ce n'est qu'une façon de m'exprimer, je n'arrive pas à me contraindre de faire autrement, sinon à écrire avec beucoup moins d'entrain, et donc à écrire beaucoup moins.

rvblogn
0
Rejoignez-nous