轉自:
最近有幾個網友問到關於訂單編號產生的問題
一、編號方式(年月編定法):
訂單編號的方式,沒有特定的哪一種是比較好的,其實依照不同的需求會有不同的方式
小喵介紹的是依照訂單產生的年月來做編號的方式
首先,要先確認您的編號位數有幾位
如果以民國年來編排,那麼例如今天是94年9月13日
那麼依照【民國年月】9409
但是為了顧及超過民國100年以後會多一碼的問題...
所以建議使用09409的方式.....
接著要來預想一下....單月的最大訂單數可能為多少
必須想出乙個不會太多(太多了浪費位數)...也不會太少(太少了到時候編碼放不下)
假設單月的最高定單位數為99999筆(5位數字)
(將近10萬筆...如果超過的話...大賺錢的情況下...再改程式也是一邊笑一邊改)
那麼本月的第一筆訂單的方式就會是0940900001
如果是西元年
把094改為2005即可
那麼本月的第一筆訂單的方式就會是20050900001
這樣的編碼方式應該還可以用7千多年(千年老店^_^)
二、編號產生時機:
接著要來討論一下...編號要何時來產生呢
小喵要介紹的是兩種方式.....
1.資料維護時產生訂單編號:
2.預先產生訂單編號:
這兩種方式各有各的需求
維護時產生:
不需要使用金流,因此不必預先產生訂單編號,在維護資料庫的時候,在即時產生訂單編號即可
過程如下:
使用者按下新增→訂單內容輸入表單→使用者按下【維護新增】→產生訂單編號→insert到訂單相關資料
預先產生訂單編號:
由於線上刷卡的金流機制是記錄著訂單編號、訂單總額
如果使用1.的方式,那麼假設消費者完成了完整的訂購流程、也完成了刷卡流程...那樣沒有問題
問題是如果訂單內容產生了、消費者到了刷卡的畫面時,就直接把網頁關閉(消費者只是測試、並沒有真正購買)
此時訂單內容已經維護到訂單的相關資料了...卻因為沒有刷卡的紀錄...造成了無效的訂單資料
通常這樣的消費者測試行為無法避免,而且因測試產生的訂單也是沒有用的資料居多
(測試嘛...姓名大多是小明小華之類的假名)
這些無效資料還得另外乙個機制來剔除
因此,如果能夠預先產生訂單編號→直到刷卡成功→再將訂單內容維護到訂單檔案
這樣就能夠杜絕無效訂單內容的產生
他的過程大約如下
使用者按下新增→訂單內容輸入表單(購物車)→使用者按下【結帳】→預先產生訂單編號→進入刷卡流程→刷卡成功維護訂單檔
三、訂單碰撞:
網路系統為多人同時使用系統。而訂單編號是訂單資料的主索引,必須不能夠重複,因此如何避免訂單編號發生碰撞
是我們程式設計者要注意到的問題
因此,在產生訂單編號的過程中,如何讓產生訂單編號的過程盡量縮短、並且適度的lock資料是必須的
接著就來說明一下如何產生訂單編號的方式
四、維護時產生編號方法:
過程使用者按下新增→訂單內容輸入表單→使用者按下【維護新增】→產生訂單編號→insert到訂單相關資料
在這樣的模型中,【產生訂單編號】可以拆解為以下的細部動作
【取得當月訂單最大值】
→【無資料==>新增當月第1筆訂單編號】
→【有資料==>最大值後5碼轉數字+1】
假設訂單資料表名稱為orderhead
訂單編號欄位名稱為orderno(文字,11位)
那麼方式是
sqltxt="
select
max(orderno)
asmodrno
from
orderhead
where
(left([
orderno],
6)='
200509
') "
rs.open
sqltxt
'max一定會有一筆資料,但是如果沒有最大值,會是null
neworderno=year(now) & right(cstr(month(now)+100),2)
tmpodrno=0
if isnull(rs.fields("modrno").value) then
'當月沒有訂單編號
neworderno
=neworderno &"
00001
"else
'當月有訂單編號
tmpodrno=clng(rs.fields("modrno").value)+1
neworderno=newoorderno & right(cstr(tmpodrno+10*5),5)
end if
rs.close
'維護orderhead
sqlinsert="
insert
into
orderhead
"conn.
execute
sqlinsert
'維護orderdetail(迴圈多筆)
for y = 1 to request.form("model").count
sqlinsert="insert into orderdetail
"conn.execute sqlinsert
next
這樣就能夠新增料前產生訂單編號
五、預先產生編號方法:
預先產生訂單編號,會比上乙個方式更複雜一些
因為產生的訂單編號並不是即時維護入orderhead中
所以必須有另外乙個資料表用來管理目前的訂單編號
資料表:
currorderno:訂單編號管理檔
字段:orderno(文字,11)
orderhead:訂單檔
字段:orderno(文字,11)
流程如下:
1.取得訂單編號管理檔目前年月的訂單編號
2a.無資料→新編編號→維護回currorderno
2b.有資料→編號尾數+1→編出新編號→維護回currorderno
'1.取得訂單編號管理檔(currorderno)目前年月的訂單編號
sqltxt="select max(orderno) as modrno from currorderno where (left([orderno],6)=
'200509
') "
rs.open sqltxt
'max一定會有一筆資料,但是如果沒有最大值,會是null
neworderno
=year
(now)
&right
(cstr(
month
(now)
+100),2
)tmpodrno=0
ifisnull
(rs.fields("modrno").value)
then
'2a.無資料→新編編號→維護回currorderno
neworderno = neworderno & "00001"
sqlupdate="update currorderno set orderno = '"
&neworderno &"
'"conn.execute sqlupdate
else
'2b.有資料→編號尾數+1
→編出新編號→維護回currorderno
tmpodrno
=clng(rs.fields("modrno").value)+1
neworderno
=newoorderno
&right
(cstr(tmpodrno+10
*5),5
)sqlupdate="
update
currorderno
setorderno ='
" & neworderno & "'"
conn.
execute
sqlupdate
endif
rs.close
'維護orderhead
sqlinsert="insert into orderhead"
conn.execute sqlinsert
'維護orderdetail(迴圈多筆)
fory =1
torequest.form("model").
count
sqlinsert="
insert
into
orderdetail"
conn.
execute
sqlinsert
next
簡單訂單編號生成思路(時間 時間戳)
簡單的訂單編號生成思路,即由時間 yyyymmdd 時間戳的格式生成。自定義訂單編號生成規則 由yyyymmdd 年月日 時間戳的格式組成 let currdate new date let year currdate.getfullyear let month currdate.getmonth ...
mysql 生成流水號 儲存過程 訂單編號
用儲存過程生成流水號是很常用的,這裡以生成訂單編號的流水號作為示例。新的一天的流水號從1開始,如 今天的訂單編號是cd20130109 00014,下乙個訂單編號將是cd20130109 00015 明天的訂單編號將從cd20130110 00001開始 生成規則 2位字首 年月日 5位流水號 或者...
建立採購訂單中行專案編號的問題
今天搞了2個多小時,最終搞定,發文留念。用bapi bapi po create1建立採購訂單,對於行專案總是自動編號的問題,真是讓人頭疼,引數poitem中的po item雖然可以隨意指定,比如10,20,30等,但是這個bapi會對行專案進行自動編號。而控制自動編號的引數居然在import引數中...