2012-05-04 36 views
1

我找到了一個獲取下一個4位數字的好方法。 How to find next free unique 4-digit number如何從表格中獲得下4位數字(包含3,4,5和6位數字)

但在我的情況下,我想獲得下一個可用的4或5位數字。 這將根據用戶請求而改變。這些數字不是關鍵的ID列,但它們對於商業目的的標記結構是必不可少的。

目前我使用表adabpter查詢。但是,我將如何寫一個查詢。 我想我可以通過所有的值做一個長的迭代循環,直到我看到一個4位數。

但我想要更有效率的想法。

Function GetNextAvailableNumber(NumofDigits) as Long 
'SQL Code Here ---- 
'Query Number Table 

Return Long 


End Function 

這裏是我當前的SQL:

'This Queries my View 
SELECT MIN([Number]) AS Expr1 
FROM LineNumbersNotUsed 

'This is my View SQL 
SELECT Numbers.Number 
FROM Numbers 
WHERE (((Exists (Select * From LineList Where LineList.LineNum = Numbers.Number))=False)) 
ORDER BY Numbers.Number; 

數字是所有可用的人數從0到99999的列表,基本上什麼可以使用。

LineList是我最終的主表,我保留了長的和所有相關的其他商業信息。

希望這是有道理的。

天哪,你們對新人非常強硬。 我不小心打了回車鍵,發佈的問題,我立即得到-3票。

給你一個新人休息一下吧!請。

+0

發佈前完成您的文章。 :( –

+1

[Stack Overflow不是您的免費促銷網站™](http://meta.stackexchange.com/a/128560/140505) – Oded

+1

您有問題嗎? – Oded

回答

1

如果我忽略了您的問題中的某些內容,我很抱歉。使用你的設計,這樣的查詢不會返回下一個未使用的4位數字嗎?

SELECT MIN([Number]) AS next_number 
FROM LineNumbersNotUsed 
WHERE 
     [Number] > 999 
    AND [Number] < 10000; 

這種方法不適合多個併發用戶,但您並未指出這對您而言是個問題。

+0

Yah ...這將工作。Thanks。 –

1

您鏈接到的問題解釋說,你需要的是有2個字段的表:

Number  InUse 
0000  No 
0001  No 
0002  Yes 
0003  No 
0005  Yes 

每當大量使用/釋放,該表必須更新設置InUse到是/否。

也許我失去了一些東西,但是從你的解釋,你告訴我們的SQL代碼,看來你只能有一個包含所有數字的單字段的表從0到100000
如果是這樣的情況下, ,我根本沒有看到那張桌子的用處。

如果我是你,如果我正確地理解你的需要,你要的是這樣的:

  1. 首先,創建該表的上面,從0至100000所有正在運行的號碼,以及用於確認該號碼是否被使用的字段。

  2. 初始化的InUse場已採取的LineList表中的所有號碼,是這樣的:

    UPDATE Numbers SET InUse = True 
    WHERE Numbers.Number IN (SELECT LineNum FROM LineList) 
    
  3. 寫一個函數ReserveNumber(NumOfDigits as Integer) As Long找到並預留下一個4位或5位的免費號碼該邏輯序列:

    • 根據NumOfDigits(4或5)得到查詢作爲LowestNumber中的一個的結果:

      SELECT Min(Number) FROM Numbers WHERE Number < 10000 AND NOT InUse 
      SELECT Min(Number) FROM Numbers WHERE Number >= 10000 AND NOT InUse 
      
    • 儲備特定號碼,以確保它不會被再次使用:

      UPDATE Numbers SET InUse = True WHERE Number = @LowestNumber 
      
    • 返回LowestNumber

  4. 每當

備註:上面的邏輯有點天真,因爲它假設沒有兩個用戶會試圖同時獲得最低的數字。然而,這可能會有一天發生。
要消除這種風險,例如,可以將TakenBy列添加到Numbers表中,並將其設置爲當前用戶名。然後,在保留號碼後,再次閱讀以確保TakenBy確實由當前客戶端更新。如果沒有,只是嘗試獲得。
有很多方法可以做到這一點。你也可以嘗試擺弄桌鎖,但無論你的解決方案是什麼,確保你測試它。

+0

這是有幫助的...特別是如果我設計的東西,需要accomadate用戶很多,謝謝。 –