Создать номер квитанции в этом диапазоне - PullRequest
1 голос
/ 21 декабря 2009

Как мне создать уникальный номер квитанции в следующем диапазоне: GA00000-GZ99999? Мне запрещено использовать буквы «I» и «O», поэтому GI00000-GI99999 и GO00000-GO99999 будут исключены.

В идеале я хотел бы создать это в T-SQL, но также могу сделать это в VB.Net. Этот номер будет храниться в SQL, и я могу получить к нему доступ до генерации следующего. Они не должны быть последовательными.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 21 декабря 2009

Создайте array всех символов, которые разрешены в качестве первой цифры.

Для любого числового идентификатора квитанции n код квитанции будет G + array[n/1000000] + n % 1000000.

1 голос
/ 21 декабря 2009

Я решил сделать это следующим образом:

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

Спасибо всем за вклад. Стив.

1 голос
/ 21 декабря 2009

Вот версия 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
1 голос
/ 21 декабря 2009

сохранить указатель суффикса. когда ваш индекс превысит 99999, увеличьте его. Проверьте ваши особые случаи и истощение (например, Z).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...