設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

12下一頁
返回列表 發(fā)新帖
查看: 5470|回復(fù): 11
打印 上一主題 下一主題

[模塊/函數(shù)] 【源碼示例】高效無重復(fù)自動編碼解決方案

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2011-1-28 14:45:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一般自動編號功能,是先取得表中的已有最大號,然后在此基礎(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萬條記錄,而使用編碼表的方式則每次只需要查詢編碼表中的幾十條記錄。


  1. '============================================================================================================================
  2. '-函數(shù)名稱:    GetNewID
  3. '-功能描述:    高效率的文本型自動編號函數(shù),除了第一次調(diào)用,以后每次生成編號時不需要再訪問編號字段所在的表,因此效率非常高,
  4. '               表中數(shù)據(jù)量越大,效果越明顯。并且在多用戶環(huán)境下,也不會出現(xiàn)多個用戶基于一個表同時錄入時,會出現(xiàn)的編號重復(fù)問
  5. '               題。適用于各種單據(jù)的編號及流水碼等,具體請參考使用示例。
  6. '-輸入?yún)?shù):    TableName       必需的,表名稱或查詢名稱。
  7. '               FieldName       必需的,自動編號字段名。
  8. '               Digit           必需的,不包含前綴的序號位數(shù)。
  9. '               Prefixal        可選的,編號前綴字符串,除了單據(jù)類型的描述字符,還可以把其它信息要素如部門ID等加入到此參數(shù)中。
  10. '               DateFormat      可選的,編號中的日期部分格式,具體使用請參考Format函數(shù)中關(guān)于日期的數(shù)的部分說明。
  11. '-其它說明:    必需要有一個編號維護(hù)表配合使用,表名稱:USysSN 字段:TableName|FieldName|LastID ,3個字段均為文本型,大小60。
  12. '-使用注意:
  13. '-返回參數(shù):    返回生成的編號,出錯時返回空字符串("")。
  14. '-兼 容 性:
  15. '-使用示例:    =GetNewID("Orders","OrderID",5,"XS","yymmdd")     返回示例:XS01042500004
  16. '               =GetNewID("Orders","OrderID",5,"XS","-yyyymmdd-") 返回示例:XS-20100425-00004
  17. '               =GetNewID("Orders","OrderID",5,"XS")              返回示例:XS00004
  18. '               =GetNewID("Orders","OrderID",5,"XS","-")          返回示例:XS-00004
  19. '               =GetNewID("Orders","OrderID",5)                   返回示例:00004
  20. '               =GetNewID("Orders","OrderID",5,"【售】")          返回示例:【售】00004
  21. '-相關(guān)調(diào)用:
  22. '-作    者:    紅塵如煙
  23. '-創(chuàng)建日期:    2011-1-25
  24. '=============================================================================================================================
  25. Function GetNewID(TableName As String, FieldName As String, Digit As Integer, _
  26.                     Optional Prefixal As String, Optional DateFormat As String) As String
  27.     On Error GoTo Err_GetNewID
  28.     Dim strDate     As String
  29.     Dim strLastID   As String
  30.     Dim strSN       As String
  31.     Dim strWhere    As String
  32.    
  33.     If DateFormat <> "" Then strDate = Format$(Date, DateFormat)
  34.     strSN = String$(Digit, "0")
  35.     strWhere = "TableName='" & TableName & "' AND FieldName='" & FieldName & "'"
  36.     strLastID = Nz(DLookup("LastID", "USysSN", strWhere))
  37.    
  38.     If strLastID = "" Then
  39.         strLastID = Nz(DMax(FieldName, TableName), strSN)
  40.         CurrentDb.Execute "DELETE FROM USysSN WHERE " & strWhere
  41.         CurrentDb.Execute "INSERT INTO USysSN(TableName,FieldName) " & _
  42.                           "VALUES('" & TableName & "','" & FieldName & "')"
  43.     End If
  44.    
  45.     strLastID = Prefixal & strDate & Format$(Val(Right$(strLastID, Digit)) + 1, strSN)
  46.     CurrentDb.Execute "UPDATE USysSN SET LastID='" & strLastID & "' WHERE " & strWhere
  47.     GetNewID = strLastID
  48.    
  49. Exit_GetNewID:
  50.     Exit Function
  51.    
  52. Err_GetNewID:
  53.     GetNewID = ""
  54.     MsgBox Err.Description, vbCritical, "Error #" & Err
  55.     Resume Exit_GetNewID
  56. End Function
復(fù)制代碼


本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享分享 分享淘帖 訂閱訂閱

點擊這里給我發(fā)消息

2#
發(fā)表于 2011-1-28 15:36:55 | 只看該作者
終于坐個沙發(fā),思路不錯!
3#
發(fā)表于 2011-1-28 21:36:25 | 只看該作者
學(xué)習(xí)了,謝謝...
4#
發(fā)表于 2011-1-28 22:57:36 | 只看該作者
一直都這樣處理
5#
發(fā)表于 2011-1-29 08:36:17 | 只看該作者
下載學(xué)習(xí),謝謝分享!
6#
發(fā)表于 2011-1-29 08:41:41 | 只看該作者
本帖最后由 ycxchen 于 2011-1-29 08:42 編輯

此函數(shù)是“高效率的文本型自動編號函數(shù)”,請問,數(shù)字型的不行?
7#
 樓主| 發(fā)表于 2011-1-29 11:10:02 | 只看該作者
andymark 發(fā)表于 2011-1-28 22:57
一直都這樣處理

andymark說的不錯,這個處理方法其實不是什么新鮮的東西,很多管理軟件中都是這樣處理的,只不過基本上都是基于SQL Server等數(shù)據(jù)庫的,在Access中的應(yīng)用,至少我在網(wǎng)上沒看到過,所以做了這個示例給大家參考一下。
8#
 樓主| 發(fā)表于 2011-1-29 11:11:21 | 只看該作者
ycxchen 發(fā)表于 2011-1-29 08:41
此函數(shù)是“高效率的文本型自動編號函數(shù)”,請問,數(shù)字型的不行?

這里的函數(shù)只支持文本型的編號,不支持?jǐn)?shù)字型,其實數(shù)字型的更好處理,另外一般來說如果是數(shù)字型的話,直接用“自動編號”數(shù)據(jù)類型的字段就行了,沒什么必要再去自己寫代碼處理。

點擊這里給我發(fā)消息

9#
發(fā)表于 2011-1-30 12:01:22 | 只看該作者
好貼。我也是使用這種方法。也是加了日期和前綴。不過,我還應(yīng)用戶需要加了個后綴。另外增加了一個順序有多少位 及總長度多少位的控制。
看來,做到最后,大家都想到一塊去了。
10#
發(fā)表于 2013-5-22 16:38:50 | 只看該作者
下載學(xué)習(xí),謝謝分享!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 10:30 , Processed in 0.116757 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表