Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Conversion date / long

7 réponses
Avatar
Driss HANIB
Bonjour

je voudrai faire un tri sur un tableau de date avec parfois des dates
"nulles".
Pour cela je voudrai convertir la date en équivalent entier long (les dates
"nulles" étant =0) et donc trier sur des valeurs.
Pouvez vous me rappeler comment faire la conversion date >>> entier long ?

Merci d'avance

Driss

7 réponses

Avatar
David
Bonjour,

Voila un copier/coller de mon programme
ou je trie des dates d'une colonne en mettant
les longs dans une autre colonne..
Cela Vous convient-il ?

For I% = 1 To MSFlexGrid1.Rows - 1
MSFlexGrid1.TextMatrix(I%, 15) = CLng(DateValue(MSFlexGrid1.TextMatrix(I%,
2)))
Next I%

--
a+ Jean-Pol
Site Web : www.colovid.be
Site Web perso pour le fun : http://users.skynet.be/DAVID/
Cette page est transmise avec des électrons 100% recyclés.


"Driss HANIB" a écrit dans le message de news:

Bonjour

je voudrai faire un tri sur un tableau de date avec parfois des dates
"nulles".
Pour cela je voudrai convertir la date en équivalent entier long (les
dates "nulles" étant =0) et donc trier sur des valeurs.
Pouvez vous me rappeler comment faire la conversion date >>> entier long ?

Merci d'avance

Driss



Avatar
Jean-marc
Driss HANIB wrote:
Bonjour



Hello Driss,

je voudrai faire un tri sur un tableau de date avec parfois des dates
"nulles".
Pour cela je voudrai convertir la date en équivalent entier long (les
dates "nulles" étant =0) et donc trier sur des valeurs.
Pouvez vous me rappeler comment faire la conversion date >>> entier
long ?



La méthode de David est partiellement bonne (usage de DateValue) mais hélas
aussi partiellement fausse : si le champ est null, alors DateValue va
provoquer une erreur d'exécution. Or tu cherches justement à régler le
problème des champs Null.

Il y a 2 façons de régler le problème:

1) Régler le problème en aval : tu fais un select normal et tu
vérifies que le champ est non null avant de convertir en long.
Ca donne ceci :

Dim db As Database
Dim rs As Recordset
Dim Date_long As Long


Set db = OpenDatabase("c:test.mdb")
Set rs = db.OpenRecordset("SELECT mydate FROM Table1")

If rs.EOF And rs.BOF Then
' la table est vide
Else
While Not rs.EOF
If Not IsNull(rs.Fields("mydate")) Then
Date_long = CLng(DateValue(rs.Fields("mydate")))
Else
Date_long = 0
End If
Debug.Print Date_long
rs.MoveNext
Wend
End If
rs.Close
db.Close

Set db = Nothing: Set rs = Nothing

2) Régler le problème en amont : tu fais un SELECT un peu
spécial qui se charge de convertir les champs null en "0" puis
tu fais une boucle sans plus te soucier de null, car il n'y en
a plus.

Ca donne :

Dim db As Database
Dim rs As Recordset
Dim Date_long As Long


Set db = OpenDatabase("c:test.mdb")
Set rs = db.OpenRecordset("SELECT IIF(Not ISNULL(mydate),mydate,0) AS
DATE1 FROM Table1")

If rs.EOF And rs.BOF Then
' la table est vide
Else
While Not rs.EOF
Date_long = CLng(DateValue(rs.Fields("DATE1")))
Debug.Print Date_long
rs.MoveNext
Wend
End If
rs.Close
db.Close

Set db = Nothing: Set rs = Nothing

Les 2 méthodes se valent. Perso, j'aime bien la seconde, mais c'est très
personnel et je n'aurais pas de problèmes à utiliser l'une ou l'autre des
2 méthodes.

Petite remarque générale : Tu n'as pas précisé, mais je suppose que tu
utilises Access. Dans d'autres bases de données du genre MS-SQL, Oracle
ou DB2, il existe un mot clé qui s'appelle COALESCE, qui est standard SQL
et qui fait en gros ce qu'on a fait avec le IIF().

Bien cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
David
Bonjour,

Monsieur Noury,

Vous avez tout à fait raison; je ne me
souvenais plus qu'à l'époque pour faire vite
j'avais remplacer les champs null par un fausse date,
date bien antérieure à la création du programme.


Ha, avec l'âge tout s'en va petit à petit :-))


--
a+ Jean-Pol
Site Web : www.colovid.be
Site Web perso pour le fun : http://users.skynet.be/DAVID/
Cette page est transmise avec des électrons 100% recyclés.

"Jean-marc" a écrit dans le message de news:
4b7aef55$0$2864$
Driss HANIB wrote:
Bonjour



Hello Driss,

je voudrai faire un tri sur un tableau de date avec parfois des dates
"nulles".
Pour cela je voudrai convertir la date en équivalent entier long (les
dates "nulles" étant =0) et donc trier sur des valeurs.
Pouvez vous me rappeler comment faire la conversion date >>> entier
long ?



La méthode de David est partiellement bonne (usage de DateValue) mais
hélas
aussi partiellement fausse : si le champ est null, alors DateValue va
provoquer une erreur d'exécution. Or tu cherches justement à régler le
problème des champs Null.

Il y a 2 façons de régler le problème:

1) Régler le problème en aval : tu fais un select normal et tu
vérifies que le champ est non null avant de convertir en long.
Ca donne ceci :

Dim db As Database
Dim rs As Recordset
Dim Date_long As Long


Set db = OpenDatabase("c:test.mdb")
Set rs = db.OpenRecordset("SELECT mydate FROM Table1")

If rs.EOF And rs.BOF Then
' la table est vide
Else
While Not rs.EOF
If Not IsNull(rs.Fields("mydate")) Then
Date_long = CLng(DateValue(rs.Fields("mydate")))
Else
Date_long = 0
End If
Debug.Print Date_long
rs.MoveNext
Wend
End If
rs.Close
db.Close

Set db = Nothing: Set rs = Nothing

2) Régler le problème en amont : tu fais un SELECT un peu
spécial qui se charge de convertir les champs null en "0" puis
tu fais une boucle sans plus te soucier de null, car il n'y en
a plus.

Ca donne :

Dim db As Database
Dim rs As Recordset
Dim Date_long As Long


Set db = OpenDatabase("c:test.mdb")
Set rs = db.OpenRecordset("SELECT IIF(Not ISNULL(mydate),mydate,0) AS
DATE1 FROM Table1")

If rs.EOF And rs.BOF Then
' la table est vide
Else
While Not rs.EOF
Date_long = CLng(DateValue(rs.Fields("DATE1")))
Debug.Print Date_long
rs.MoveNext
Wend
End If
rs.Close
db.Close

Set db = Nothing: Set rs = Nothing

Les 2 méthodes se valent. Perso, j'aime bien la seconde, mais c'est très
personnel et je n'aurais pas de problèmes à utiliser l'une ou l'autre des
2 méthodes.

Petite remarque générale : Tu n'as pas précisé, mais je suppose que tu
utilises Access. Dans d'autres bases de données du genre MS-SQL, Oracle
ou DB2, il existe un mot clé qui s'appelle COALESCE, qui est standard SQL
et qui fait en gros ce qu'on a fait avec le IIF().

Bien cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
Jean-marc
David wrote:
Bonjour,



Bonsoir !

Vous avez tout à fait raison; je ne me
souvenais plus qu'à l'époque pour faire vite
j'avais remplacer les champs null par un fausse date,
date bien antérieure à la création du programme.



Ca arrive :-)

Ha, avec l'âge tout s'en va petit à petit :-))



Oui, mais heureusement, il semble
que la pratique quotidienne de la programmation entretienne
quand même bien l'intellect, j'en veux pour preuve certains de
mes collègues qui à un age ou d'autres sont déjà pensionnés depuis
bien longtemps sont encore fidèles au poste, avec un enthousiasme
et une clarté d'esprit intacte !

Bonne soirée !

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Driss HANIB
Salut Jean-Pol et Jean-Marc

En fait la réponse est entre les deux.

En fait effectivement je stocke dans une base Access mes données mais elles
sont plus complexes.

Il s'agit d'évenement qui sont créés.
Soit il y une date théorique (en fait un écart <>0 par rapport à une date de
départ) et / ou une date éffective de cet évènement.
On aura donc , à un instant donné pour chaque évènement :

- une date théorique et pas de date réelle de l'évènement (il est prévu,
mais ne s'est pas encore déroulé)
- soit pas de date théorique et une date réelle : évènement non prévu, mais
qui s'est déroulé.
- soit une date théorique et une date réelle : évènement prévu et réalisé*
- soit pas de date théorique et pas de date réelle : en principe ce cas ne
doit pas se passer, mais je veux néanmoins le prendre en charge dans mon
tri.

En fait la date théorique d'un évènement n'est pas inscrite en dur, mais
seulement un écart (en semaines) par rapport à une date de référence.
Celle-ci peut ne pas être connue : donc malgré l'écart <>0 la date sera
considérée comme nulle.

Aujourd'hui mon problème n'est pas de déterminer les dates (car je charge
d'abord les évènements) puis je "traite" les différentes dates.

je crée un tableau du type suivant :
DateLong : équivalent en Long de la date ou 0 si la date est nulle
Indice : indice du tableau dévènements extrait, pour garder justement la
position de l'évènement après le tri pour afficher les évènements ensuite.

Mon principe

Pour chaque évènement : s'il y a une date réelle, je prends cette date
s'il n'y a pas de date réelle : si il y a une date théorique je prends cette
date
sinon je mets 0

Donc mon problème est de convertir une date en son entier long
correspondant.
Est-ce que la version de Jean Pol peut fonctionner ?
Quant au tri directement lors de l'extraction de la base Access c'st
effectivement le Top : sans doute un peu de VBA dans un module ..

Merci

Driss


"Driss HANIB" a écrit dans le message de news:

Bonjour

je voudrai faire un tri sur un tableau de date avec parfois des dates
"nulles".
Pour cela je voudrai convertir la date en équivalent entier long (les
dates "nulles" étant =0) et donc trier sur des valeurs.
Pouvez vous me rappeler comment faire la conversion date >>> entier long ?

Merci d'avance

Driss



Avatar
Jean-marc
Driss HANIB wrote:
Salut Jean-Pol et Jean-Marc



Hello !

Donc mon problème est de convertir une date en son entier long
correspondant.
Est-ce que la version de Jean Pol peut fonctionner ?



Oui, DateValue() est bien la fonction à utiliser. IL faut prendre
la précaution indiquée dans ma méthode 1 pour ne pas donner
"null" à dateValue, sinon plantage.

Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Driss HANIB
Bonjour Jean marc,

Ok je vais mettre cela en place.

Merci

Driss
"Jean-marc" a écrit dans le message de news:
4b7d9fcb$0$2882$
Driss HANIB wrote:
Salut Jean-Pol et Jean-Marc



Hello !

Donc mon problème est de convertir une date en son entier long
correspondant.
Est-ce que la version de Jean Pol peut fonctionner ?



Oui, DateValue() est bien la fonction à utiliser. IL faut prendre
la précaution indiquée dans ma méthode 1 pour ne pas donner
"null" à dateValue, sinon plantage.

Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;