技術(shù) 點
- 技術(shù)
- 點
- V幣
- 點
- 積分
- 6865
|
一般自動編號功能,是先取得表中的已有最大號,然后在此基礎(chǔ)上加1,如果每次生成編號都要從表中去取得最大編號,也就意味著每次生成編號都需要查詢表中所有的記錄,如果表中數(shù)據(jù)量很大,如有十萬條以上,那么性能就很差了。(當(dāng)然數(shù)據(jù)庫引擎會有優(yōu)化,但再優(yōu)化總歸是有限的)。并且這種方法在多用戶同時錄入時,存在生成重復(fù)編號的問題。
本示例采用的方式為:調(diào)用GetNewID函數(shù)時,從編碼表(USysSN)中讀取指定編號字段對應(yīng)的編號記錄,如果記錄為空,則先從原表中讀取最大編號寫入到該記錄中;如果記錄不為空,則讀取該記錄中的編號,并加1生成新編號,同時將編碼表中的編號更新為新生成的編號。這樣每次生成編號時只需要查詢編碼表中的很少的記錄即可,并且由于生成的編號和原表無關(guān),還可以防止多用戶同時錄入時生成重復(fù)編號的問題。
假設(shè)某個表中有10萬條記錄,那么直接讀取表生成新編號的方式需要查詢10萬條記錄,而使用編碼表的方式則每次只需要查詢編碼表中的幾十條記錄。
- '============================================================================================================================
- '-函數(shù)名稱: GetNewID
- '-功能描述: 高效率的文本型自動編號函數(shù),除了第一次調(diào)用,以后每次生成編號時不需要再訪問編號字段所在的表,因此效率非常高,
- ' 表中數(shù)據(jù)量越大,效果越明顯。并且在多用戶環(huán)境下,也不會出現(xiàn)多個用戶基于一個表同時錄入時,會出現(xiàn)的編號重復(fù)問
- ' 題。適用于各種單據(jù)的編號及流水碼等,具體請參考使用示例。
- '-輸入?yún)?shù): TableName 必需的,表名稱或查詢名稱。
- ' FieldName 必需的,自動編號字段名。
- ' Digit 必需的,不包含前綴的序號位數(shù)。
- ' Prefixal 可選的,編號前綴字符串,除了單據(jù)類型的描述字符,還可以把其它信息要素如部門ID等加入到此參數(shù)中。
- ' DateFormat 可選的,編號中的日期部分格式,具體使用請參考Format函數(shù)中關(guān)于日期的數(shù)的部分說明。
- '-其它說明: 必需要有一個編號維護(hù)表配合使用,表名稱:USysSN 字段:TableName|FieldName|LastID ,3個字段均為文本型,大小60。
- '-使用注意:
- '-返回參數(shù): 返回生成的編號,出錯時返回空字符串("")。
- '-兼 容 性:
- '-使用示例: =GetNewID("Orders","OrderID",5,"XS","yymmdd") 返回示例:XS01042500004
- ' =GetNewID("Orders","OrderID",5,"XS","-yyyymmdd-") 返回示例:XS-20100425-00004
- ' =GetNewID("Orders","OrderID",5,"XS") 返回示例:XS00004
- ' =GetNewID("Orders","OrderID",5,"XS","-") 返回示例:XS-00004
- ' =GetNewID("Orders","OrderID",5) 返回示例:00004
- ' =GetNewID("Orders","OrderID",5,"【售】") 返回示例:【售】00004
- '-相關(guān)調(diào)用:
- '-作 者: 紅塵如煙
- '-創(chuàng)建日期: 2011-1-25
- '=============================================================================================================================
- Function GetNewID(TableName As String, FieldName As String, Digit As Integer, _
- Optional Prefixal As String, Optional DateFormat As String) As String
- On Error GoTo Err_GetNewID
- Dim strDate As String
- Dim strLastID As String
- Dim strSN As String
- Dim strWhere As String
-
- If DateFormat <> "" Then strDate = Format$(Date, DateFormat)
- strSN = String$(Digit, "0")
- strWhere = "TableName='" & TableName & "' AND FieldName='" & FieldName & "'"
- strLastID = Nz(DLookup("LastID", "USysSN", strWhere))
-
- If strLastID = "" Then
- strLastID = Nz(DMax(FieldName, TableName), strSN)
- CurrentDb.Execute "DELETE FROM USysSN WHERE " & strWhere
- CurrentDb.Execute "INSERT INTO USysSN(TableName,FieldName) " & _
- "VALUES('" & TableName & "','" & FieldName & "')"
- End If
-
- strLastID = Prefixal & strDate & Format$(Val(Right$(strLastID, Digit)) + 1, strSN)
- CurrentDb.Execute "UPDATE USysSN SET LastID='" & strLastID & "' WHERE " & strWhere
- GetNewID = strLastID
-
- Exit_GetNewID:
- Exit Function
-
- Err_GetNewID:
- GetNewID = ""
- MsgBox Err.Description, vbCritical, "Error #" & Err
- Resume Exit_GetNewID
- End Function
復(fù)制代碼
|
本帖子中包含更多資源
您需要 登錄 才可以下載或查看,沒有帳號?注冊
x
|