Moosa Arbeed Ответов: 4

Как сделать автоматическое увеличение числа на основе года


Я создаю простое приложение C# Windows Forms, где должен быть пользовательский номер автоматического приращения, он будет использоваться в качестве серийного номера для каждого приложения.

Как я могу сделать этот пользовательский номер сброшенным в зависимости от года ?

Пример:
2019
серийный номер: 1/2019
серийный номер: 2/2019
серийный номер: 3/2019
серийный номер: 4/2019
.
.
.
серийный номер: 200/2019 "предположим, что это 31 декабря 2019 года"

2020
серийный номер: 1/2020 "предположим, что это 1 января 2020 года"
серийный номер: 2/2020
серийный номер: 3/2020
серийный номер: 4/2020
серийный номер: 5/2020
.
.
.

Что я уже пробовал:

Я перепробовал много вещей, код выглядит грязным и непонятным, поэтому я ничего не поделился, просто чтобы сохранить вопрос аккуратным, конечно, он будет храниться в базе данных, я буду держать столбец auto increment ID как есть и использовать его для поиска, сортировки и т. д. И я создал отдельный столбец для этого пользовательского серийного номера, проблема в том, как заставить программное обеспечение знать, что мы вошли в 2020 год, поэтому сбросьте серийный номер и добавьте значение года после косой черты.

Richard MacCutchan

Ваше приложение должно будет принять это решение во время выполнения.

4 Ответов

Рейтинг:
12

Moosa Arbeed

Я и сам это понял.


public class SerialNumber
{
    private static readonly MyDbContext DbContext = new MyDbContext();

    public static string SrNo()
    {
        var sn = DbContext.PrimaryForms.ToList().Last().FormDescription;

        var array = sn.Split('/');

        if (int.Parse(array[0]) == DateTime.Today.Year)
        {
            return array[0] + "/" + (int.Parse(array[1]) + 1);
        }

        return (int.Parse(array[0]) + 1) + "/1";
    }
}


если код не ясен, попросите меня объяснить, спасибо.


Richard Deeming

Этот код имеет довольно много проблем.

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

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

То .Last вызов вызовет исключение, если не будет возвращено никаких элементов.

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

Вы предполагаете, что всегда будет по крайней мере один пункт в каждом году. Если в прошлом году товаров не было, то первый товар этого года будет иметь серийный номер, начинающийся с 2018 года, а не с 2019 года.

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

Member 14649324

как вы это делаете в vb.net плз не могли бы вы сказать мне что я новичок в этом деле vb.net

Рейтинг:
0

srko

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

DECLARE	@y int
set @y = DateName(yy,getdate())
select cast(ID as varchar(10)) +'/' + cast(@y as varchar(10)) from myTable



Примечание: ниже кода находится вторичное решение с уровня кода
class Program
    {
        static void Main(string[] args)
        {
            int[] serialNumbers = new int[] { 1, 2, 3, 4, 5 };//take your table id's
            foreach (var v in serialNumbers)
            {
                Console.WriteLine("serial number: " + v + " / " + DateTime.Today.Year.ToString());
            }
        }
    }


Выход:-
serial number: 1 / 2019
serial number: 2 / 2019
serial number: 3 / 2019
serial number: 4 / 2019
serial number: 5 / 2019


Moosa Arbeed

Я предпочитаю делать это в коде, я использую C#, я оставляю SQL в качестве второго варианта.

srko

Добавлено новое решение в нижней части, работает абсолютно нормально :)
Надеюсь, что это, безусловно, поможет :)

CHill60

Гораздо лучше использовать ссылку "улучшить решение" и добавить дополнительные заметки к существующему решению. Гораздо менее запутанным для людей - в конце концов, какое решение должно быть правильным?

srko

Оба решения верны, одно решение поможет со стороны БД, а другое-с вашего уровня кода.

CHill60

Тем больше причин обновить исходное решение и объяснить это. Размещение нескольких решений вопроса может быть воспринято как охота за точками репа и может привести к понижению голоса

srko

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

CHill60

Некоторые из них, некоторые менее благосклонны, но добро пожаловать в QA! Спасибо за обновление решения - теперь оно выглядит более полным

srko

Изменил решение, как уже упоминалось, спасибо.

Рейтинг:
0

MadMyche

Способ, которым я это делаю, - это через Sql Server; и как я это делаю, используя DBCC CHECKIDENT(), который может быть использован для сброса ИДЕНТИЧНОСТЬ колонка.
Где это отличается от того, что вы хотите сделать, так это то, что год, который у меня есть, добавляется к номеру клиента; например, 20190043, 20190044.. и когда наступит Новый год, я сброшу его на 20200001, 20200002 и т. д


Moosa Arbeed

Я предпочитаю делать это в коде, я использую C#
кроме того, я не хочу вручную сбрасывать его каждый год

MadMyche

Мой автоматический; я использую SQL Agent и запускаю его в 01/01 00:00.... и хранимая процедура для создания учетной записи проверяет правильный "префикс"

Рейтинг:
0

Member 13566383

int serialNumber = 23;   // Or whatever number you have got
int year = DateTime.Today.Year;
string outputString = "serial number: " + serialNumber.ToString() + " / " + year.ToString();