Какой лучший способ создать уникальный номер, который должен следовать определенным правилам? - PullRequest
0 голосов
/ 22 ноября 2008

Краткая справка: в Германии (как минимум) номера счетов должны соответствовать определенным правилам:

  1. Требуется заказать
  2. Они должны быть непрерывными (может не иметь пробелов)

В течение нескольких месяцев им разрешено содержать символы. Некоторые клиенты хотят использовать эту возможность, а клиенты не знают об этом или боятся, и они настаивают на использовании номеров счетов, состоящих только из цифр.

Кроме того, клиенты не хотят начинать их с нуля.

Могу ли я придумать много способов для генерации такого числа, мне интересно: как лучше это сделать?

Ответы [ 4 ]

5 голосов
/ 22 ноября 2008

Чтобы не начинать с 0 - просто начните с 10000. Забудьте о нулевом заполнении.

Вы должны учитывать, когда будет выделено число.

Если вы присваиваете номер при первом открытии счета для редактирования, например, присваивается номер 10014, и пользователь отменяет счет, тогда у вас есть пробел, так как вы должны помнить, что кто-то еще мог уже иметь начал создавать счет с идентификатором 10015, поэтому вы не можете просто откатить номер.

Если вы назначите номер, когда счет был полностью написан и сохранен, вы избежите сценария и избежите пробелов, но вы не будете знать, какой номер счета будет иметь счет до оно сохранено.

Кроме того, вам необходимо убедиться, что он безопасен для потоков, чтобы два пользователя не могли создать один и тот же номер счета.

static object _invoiceNumberLock = new object();
public static string GetInvoiceNumber()
{
    lock(_invoiceNumberLock)
    {
        //Connect to database and get MAX(invoicenumber)+1
        //Increase the invoicenumber in SQL database by one
        //Perhaps also add characters
    }
}

Также подумайте о резервном копировании уникальности, добавив UNIQUE INDEX в столбец invoicenumber в базе данных SQL.

1 голос
/ 22 ноября 2008

Мои две идеи:

  1. (без символов): последовательность, начинающаяся с 1, дополненная слева нулями (или начинающаяся с другого числа и дополненная нулями) - пример: 1000002554
  2. (с символами): последовательность в шестнадцатеричном основании, дополненная нулями (возможно, с префиксом) - пример: AF00CAFE01

Было бы здорово иметь номера счетов в hex :)

0 голосов
/ 22 ноября 2008

Еще несколько идей:

Выберите произвольную последовательность бит, чтобы быть вершиной числа. Это будет работать как «волшебный ключ», чтобы вы могли узнать это число вне контекста. Например, идентификаторы продуктов Newegg начинаются с «N82E», а номера отслеживания ИБП начинаются с «1Z».

Если вы можете согнуть "непрерывное" правило, сделайте последний бит битом четности для проверки ошибок.

0 голосов
/ 22 ноября 2008

Для моих счетов-фактур они всегда состоят из последней цифры года, за которой следует 4-значный номер счета-фактуры, начинающийся с 4096, поэтому вы получите значение, например 85021. Это должно было легко обрабатывать счета (до) 15 клиенты дважды в месяц.

Сейчас это не имеет значения, так как я выставляю только около 6 счетов в год (я работал постоянно, а сейчас выполняю лишь небольшие работы, в основном покидая компанию в инвестиционных целях), но эта схема всегда работала для меня.

Это помешало клиентам почувствовать, что они выполняют работу небольшой компанией (без счета № 1 или даже 80001).

С точки зрения последовательного характера счета-фактуры просто сохранялись в файлах с номером счета-фактуры в имени файла, поэтому было легко создать следующий. База данных не требуется - это зависит от размера вашего магазина.

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