ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

SYS(2015) En code VFP   



L'auteur

Mike Gagnon
Canada Canada
Membre Simple
# 0000000025
enregistré le 14/10/2004

Gagnon Mike
Pte Claire Quebec - Canada
de la société MCRG Software
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é 5489 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
IF VARTYPE(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

Publicité

Les pubs en cours :


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2019.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3