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() asstring #define C_BASE36 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" local dDate asdate local nSeconds asnumber dDate = date() nSeconds = seconds() * store last SYS(2015) values for same millisecond (in public var for this example) public _dLastSys2015_Date ifvartype(m._dLastSys2015_Date) <> "D" _dLastSys2015_Date = m.dDate endif public _nLastSys2015_Seconds ifvartype(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 asNumber nMilliSecs= m._nLastSys2015_Seconds * 1000 local cSys2015 asstring cSys2015 = "" LOCAL nCounter asInteger 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 asInteger 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