Mike Gagnon Canada Membre Simple # 0000000025 enregistré le 14/10/2004
Gagnon Mike Pointe Cla H9R 3K8 de la société Carver Technologies Inc. Fiche personnelle
Note des membres 17,3/20 3 votes
Contributions > 20 - Trucs et Astuces
SYS(2015) En code VFP
# 0000000052
ajouté le 12/11/2004 22:00:11 et modifié le 01/12/2004
consulté 9375 fois
Niveau
initié
Version(s) Foxpro : VFP 7.0
Description
Il est parfois utilise de savoir ou VFP prend ses valeurs. Voici du code qui imite la fonction SYS(2015)
Code source :
MESSAGEBOX('Valeur de SYS(2015) ='+SYS2(DATETIME())) FUNCTION SYS2(tDateTime) LOCAL nMilliSecs,nDays,cBase36,cSys2016 IFVARTYPE(nMilliSeconds)<>'N'
nMilliSeconds=0 ENDIF
nMilliSecs=(HOUR(tDateTime)*3600+MINUTE(tDateTime)*60+SEC(tDateTime))*1000+nMilliSeconds
nDays=TTOD(tDateTime)-DATE(YEAR(tDateTime),1,1)+1+MOD(YEAR(tDateTime),100)*367
cBase36='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
cSys2015='' FOR nCounter=1 TO 6
cSys2015=SUBSTR(cBase36,MOD(nMilliSecs,36)+1,1)+cSys2015
nMilliSecs=INT(nMilliSecs/36) ENDFOR FOR nCounter=1 TO 3
cSys2015=SUBSTR(cBase36,MOD(nDays,36)+1,1)+cSys2015
nDays=INT(nDays/36) ENDFOR
cSys2015='_'+cSys2015 RETURN cSys2015
Commentaires
le 01/12/2004, Robert Plagnard a écrit : Ce n'est pas tout à fait exact. Si l'on compare avec sys(2015) il y une différence sur l'apreciation des millisecondes. Par ailleurs, on sent bien que la variable nMilliseconds doit avoir son importance. En fait elle doit être héritée du contexte, cela pour mémoriser la valeur de l'appel précédent afin de garantir 2 valeurs différentes de la fonction même si ces appels ont lieux dans la même milliseconde. (Erreur bien connue de cette fonction dans des versions antérieures de FoxPro). Par ailleurs, j'ai déterminé (par essai) une constante magique qui permet d'obtenir que Sys(2015) et Sys2(DateTime()) donnent le même résultat. Pour que "? sys2(datetime()),sys2(DateTime())" donne 2 résultats différents il faut déclarer public nMilliSeconds dans le contexte appelant. Voici ma modif : Function SYS2(tDateTime) Local nMilliSecs,nDays,cBase36,cSys2016 local nMilli local nSeconds nSeconds = Seconds() nMilli = Int(1000*( nSeconds -Int( nSeconds ))) - 106000 && MAGIC CONSTANT If Vartype(nMilliSeconds)<>'N' nMilliSeconds = nMilli else nMilliSeconds = Iif( nMilliSeconds = nMilli, nMilli + 1, nMilli ) endif nMilliSecs=(Hour(tDateTime)*3600+Minute(tDateTime)*60+Sec(tDateTime))*1000+nMilliSeconds nDays=Ttod(tDateTime)-Date(Year(tDateTime),1,1)+1+Mod(Year(tDateTime),100)*367 cBase36='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
cSys2015='' For nCounter=1 To 6 cSys2015=Substr(cBase36,Mod(nMilliSecs,36)+1,1)+cSys2015 nMilliSecs=Int(nMilliSecs/36) Endfor
For nCounter=1 To 3 cSys2015=Substr(cBase36,Mod(nDays,36)+1,1)+cSys2015 nDays=Int(nDays/36) Endfor cSys2015='_'+cSys2015
Return cSys2015
le 01/12/2004, Robert Plagnard a écrit : Je suis désolé pour la présentation du code dans le commentaire précédent. J'ai simplement fait un copier/coller d'un code bien présenté et voilà ce que ça donne. C'est quelque chose qui va falloir ameliorer.
le 27/07/2006, laurent.dellacherie a écrit : Merci à tous les deux pour cette fonction qui est bien pratique pour passer dans un autre language
Amicalement, Laurent
le 01/08/2006, laurent.dellacherie a écrit : J'ai testé un peu plus en profondeur la fonction que tu as refaite, robert... je n'ai pas réussis à obtenir le même résultat, car le problème est que les instructions s'execute plus rapidement que 1 toute les ms. Ce qui fait que les doublons ne sont pas rare... peut être manque t-il une ligne?
Bien à toi
le 23/05/2016, Francis Faure a écrit : Excellent ! Dans ma recherche du fonctionnement de SYS(2015) je trouve cet article datant de novembre 2004 ! Il y à donc 12 ans ! Bravo et merci Mike... Je propose une version fonctionnant avec les machines actuelles http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000918 Cordialement Francis
le 23/05/2016, Mike Gagnon a écrit : Cela nous rajeuni pas LOL
Ce n'est pas tout à fait exact. Si l'on compare avec sys(2015) il y une différence sur l'apreciation des millisecondes. Par ailleurs, on sent bien que la variable nMilliseconds doit avoir son importance. En fait elle doit être héritée du contexte, cela pour mémoriser la valeur de l'appel précédent afin de garantir 2 valeurs différentes de la fonction même si ces appels ont lieux dans la même milliseconde. (Erreur bien connue de cette fonction dans des versions antérieures de FoxPro). Par ailleurs, j'ai déterminé (par essai) une constante magique qui permet d'obtenir que Sys(2015) et Sys2(DateTime()) donnent le même résultat. Pour que "? sys2(datetime()),sys2(DateTime())" donne 2 résultats différents il faut déclarer public nMilliSeconds dans le contexte appelant. Voici ma modif :
Function SYS2(tDateTime)
Local nMilliSecs,nDays,cBase36,cSys2016
local nMilli
local nSeconds
nSeconds = Seconds()
nMilli = Int(1000*( nSeconds -Int( nSeconds ))) - 106000 && MAGIC CONSTANT
If Vartype(nMilliSeconds)<>'N'
nMilliSeconds = nMilli
else
nMilliSeconds = Iif( nMilliSeconds = nMilli, nMilli + 1, nMilli )
endif
nMilliSecs=(Hour(tDateTime)*3600+Minute(tDateTime)*60+Sec(tDateTime))*1000+nMilliSeconds
nDays=Ttod(tDateTime)-Date(Year(tDateTime),1,1)+1+Mod(Year(tDateTime),100)*367
cBase36='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
cSys2015=''
For nCounter=1 To 6
cSys2015=Substr(cBase36,Mod(nMilliSecs,36)+1,1)+cSys2015
nMilliSecs=Int(nMilliSecs/36)
Endfor
For nCounter=1 To 3
cSys2015=Substr(cBase36,Mod(nDays,36)+1,1)+cSys2015
nDays=Int(nDays/36)
Endfor
cSys2015='_'+cSys2015
Return cSys2015