clear
* Generate Serial Numbers
=GenerateSerialNums()
* Simulate obtaining a series of Network and Single serial numbers
local cNextSN, i
for i = 1 to 20
cNextSn = NextSN(iif(mod(i,2)==0,"N","S"))
? cNextSn
next
****
function NextSN
lparam cSnType
local array aNextSn[1]
select top 1 cSn ;
from SNS ;
where right(cSn,1)==cSnType .and. !Issued ;
order by cSn ;
into array aNextSn
update SNS set Issued = .t. where cSn = aNextSn[1]
return aNextSn[1]
endfunc
****
procedure GenerateSerialNums
create cursor SNS (SnId c(6),cSn c(15),Issued l)
index on cSn tag cSn candidate
local i, j, bError
on error bError = .t.
for j = 1 to 2 && Generate Network and Single serial numbers
for i = 1 to 1000
insert into SNS ;
(SnId,cSn) values ;
(iif(j==1,"N","S")+padl(trans(i),5,"0"),GenUniqueSerialNum()+iif(j==1,"N","S"))
if bError && Incase running on a very fast machine and you get the same value
i = i - 1
bError = .f.
endif
next
next
on error
endproc
function GenUniqueSerialNum
local cSnIn, cSnOut, i, nLen, j
cSnIn = substr(sys(2015),2)
nLen = len(cSnIn)
cSnOut = ""
for i = 1 to nLen step 2
cSnOut = cSnOut + substr(cSnIn,i,2) + "-"
next
return left(cSnOut,len(cSnOut)-1)+left(trans(rand()*100),1)
endfunc