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

SYS(2015) En code VFP - v2   



L'auteur

Francis Faure
France France
Membre Actif (personne physique)
# 0000000001
enregistré le 11/10/2004

http://www.wanagain.net
50 ans
Faure Francis
de la société Design Or Decline
Fiche personnelle


Note des membres
pas de note

Contributions > 20 - Trucs et Astuces

SYS(2015) En code VFP - v2
# 0000000918
ajouté le 23/05/2016 19:34:17 et modifié le 23/05/2016
consulté 3846 fois
Niveau débutant

Version(s) Foxpro :
VFP 9.0

Description
Bonjour,

Dans ma recherche du fonctionnement de SYS(2015) :
- je trouve un article de Mike Gagnon datant de novembre 2004 ! Il y à donc 12 ans !

Lien : http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000052
le code proposé par Mike Gagnon contient la solution.

Puis Robert Plagnard avait travaillé dessus peu de temps après et trouvé qu'il fallait "mémoriser" la dernière valeur de SYS(2015) pour éviter d'avoir la même valeur dans la même milliseconde.

En testant les codes de Mike et Robert, mais sur nos machines actuelles sur lequelle plusieurs lignes de codes VFP peuvent être traitées dans les mêmes 10ms (limite de SECONDS()) : alors on à pas les bonnes valeurs et des doublons :

J'ai repris le code pour une version "2", ci-après qui me donne bien le bon résultat.

Merci Mike !
Cordialement
Francis
Code source :
clear
for lnI = 1 to 40
  ? sys(2015), sys2015()
endfor

* SYS2015() : SYS(2015) mimic
* Based on Mike Gagnon's code "SYS(2015) En code VFP"
* http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000052
*
function sys2015() as string
  #define C_BASE36 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  local dDate as date
  local nSeconds as number
  dDate = date()
  nSeconds = seconds()
  * store last SYS(2015) values for same millisecond (in public var for this example)
  public _dLastSys2015_Date
  if vartype(m._dLastSys2015_Date) <> "D"
    _dLastSys2015_Date = m.dDate
  endif
  public _nLastSys2015_Seconds
  if vartype(m._nLastSys2015_Seconds) <> "N"
    _nLastSys2015_Seconds = 0
  endif
  if m._dLastSys2015_Date == m.dDate and ;
      m._nLastSys2015_Seconds >= m.nSeconds && important: >=
    _nLastSys2015_Seconds = m._nLastSys2015_Seconds + 0.001
  else
    _dLastSys2015_Date = m.dDate
    _nLastSys2015_Seconds = m.nSeconds
  endif
  * H M S ms
  local nMilliSecs as Number
  nMilliSecs= m._nLastSys2015_Seconds * 1000
  local cSys2015 as string
  cSys2015 = ""
  LOCAL nCounter as Integer
  for nCounter = 1 to 6
    cSys2015 = substr(C_BASE36, mod(m.nMilliSecs,36)+1, 1) + m.cSys2015
    nMilliSecs = int(m.nMilliSecs/36)
  ENDFOR
  * Days
  local nDays as Integer
  nDays = m.dDate - date(year(m.dDate),1,1) + 1 + mod(year(m.dDate), 100) * 367
  for nCounter = 1 to 3
    cSys2015 = substr(C_BASE36, mod(m.nDays,36)+1, 1)+  m.cSys2015
    nDays = int(m.nDays/36)
  endfor
  return '_' + m.cSys2015
endfunc

Commentaires
Aucun commentaire enregistré ...

Publicité

Les pubs en cours :

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