2009-12-21 38 views
1

如何生成以下範圍內的唯一收據編號: GA00000-GZ99999?我不允許使用'I'和'O'字母,因此GI00000-GI99999 & GO00000-GO99999將被排除。在此範圍內生成收據編號

理想情況下,我想在T-SQL中創建它,但也可以在VB.Net中創建它。這個號碼將存儲在SQL中,我可以在生成下一個號碼之前訪問它。他們不必是連續的。

謝謝。

回答

1

我決定做如下所示:

CREATE FUNCTION [dbo].[fn_generateReceiptNumber]() 
RETURNS NCHAR(7) 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @result NCHAR(7); 
    DECLARE @prefix NCHAR(1); 
    DECLARE @suffix INT; 
    DECLARE @currentMax NCHAR(7); 

    SELECT @currentMax = MAX(ISNULL(fp.CustomReceiptNo, 'GA00001')) FROM dbo.FinPayment fp; 

    SELECT @prefix = SUBSTRING(@currentMax,2,1); 
    SELECT @suffix = CAST(SUBSTRING(@currentMax,3,7) AS INT); 

    IF((@suffix + 1) > 99999) 
    BEGIN 
     SELECT @suffix = 0; 
    END 
    ELSE 
    BEGIN 
     SELECT @suffix = @suffix + 1; 
    END 

    IF(@suffix = 0) 
    BEGIN 
     IF(@prefix = 'Z') 
     BEGIN 
      RETURN -1; 
     END 
     ELSE 
     BEGIN 
      IF(NCHAR(UNICODE(@prefix)+1) IN ('I', 'O')) 
      BEGIN 
       SELECT @prefix = NCHAR(UNICODE(@prefix)+2); 
      END 
      ELSE 
      BEGIN 
       SELECT @prefix = NCHAR(UNICODE(@prefix)+1); 
      END 
     END 
    END 

    -- Return the result of the function 
    SELECT @result = NCHAR(71) + @prefix + CAST(RIGHT('00000' + RTRIM(@suffix), 5) AS NCHAR(5)); 
    RETURN @result; 

END 
GO 

謝謝大家的投入。 Steve。

1

保留一個後綴指針。當你的索引換行99999時,增加它。檢查你的特殊情況和疲憊(例如Z)。

2

創建一個允許作爲第一個數字的所有字符的array

對於任何數字收據編號n收據編號將爲G + array[n/1000000] + n % 1000000

1

下面是一個VB.NET版本,獲取下一個序號,給定前一個號碼。我想我涵蓋了所有的情況。

Private Const FirstReceiptNumber As String = "GA00000" 

Public Function GenerateReceiptNumber(ByVal lastNumber As String) As String 

    If lastNumber.Length <> 7 Then 
     Throw New ArgumentException("Incorrect length", "lastNumber") 
    End If 

    If lastNumber.StartsWith("G") = False Then 
     Throw New ArgumentException("Incorrect start character", "lastNumber") 
    End If 

    Dim letterPortion As Char = lastNumber.Chars(1) 

    If letterPortion < "A"c Or letterPortion > "Z"c Then 
     Throw New ArgumentException("Non-letter second character", "lastNumber") 
    End If 

    If letterPortion = "I"c Or letterPortion = "O"c Then 
     Throw New ArgumentException("Invalid second character", "lastNumber") 
    End If 

    Dim numericPortionString As String = lastNumber.Substring(2) 
    Dim numericPortion As Integer 

    If Integer.TryParse(numericPortionString, numericPortion) = False Then 
     Throw New ArgumentException("Invalid numeric portion", "lastNumber") 
    End If 

    If numericPortion = 99999 Then 
     If letterPortion = "Z"c Then 
      Throw New ArgumentException("No more receipt numbers possible", "lastNumber") 
     End If 

     numericPortion = 0 
     letterPortion = letterPortion + Chr(1) 

     If letterPortion = "I"c Or letterPortion = "O"c Then 
      letterPortion = letterPortion + Chr(1) 
     End If 
    Else 
     numericPortion = numericPortion + 1 
    End If 

    Return String.Format("G{0}{1:00000}", letterPortion, numericPortion) 

End Function