zoukankan      html  css  js  c++  java
  • [轉]訂單編號方式探討

     

    轉自:http://blog.blueshop.com.tw/topcat/archive/2005/09/13/11728.aspx

    最近有幾個網友問到關於訂單編號產生的問題
    小喵針對小喵的經驗做以下的整理,提供大家參考

    一、編號方式(年月編定法):
    訂單編號的方式,沒有特定的哪一種是比較好的,其實依照不同的需求會有不同的方式
    小喵介紹的是依照訂單產生的年月來做編號的方式

    首先,要先確認您的編號位數有幾位
    如果以民國年來編排,那麼例如今天是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) as MOdrNo 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
    If IsNull(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 Set OrderNo = '" & NewOrderNo & "' "
        Conn.
    Execute sqlUpdate
    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

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    PlayerPrefs存储Vector3等结构数据
    Kafka集群部署及測试
    火云开发课堂
    Thinking in Java:容器深入研究
    求int型数据在内存中存储时1的个数
    JAVA 几种多线程的简单实例 Thread Runnable
    Android利用Intent与其它应用交互
    kernel
    Azure DocumentDB 正式发布
    在公有云平台体验开源方案的自动部署
  • 原文地址:https://www.cnblogs.com/Athrun/p/1523801.html
Copyright © 2011-2022 走看看