@Werewolfe
Как сделать нумерацию документов с нуля каждый год.
Сейчас в голове созрела идея, при добавлении записи в таблицу делать выборку максимального значения по колонке YI (Year index) на текущий год и затем увеличивать его.
Сейчас в голове созрела идея, при добавлении записи в таблицу делать выборку максимального значения по колонке YI (Year index) на текущий год и затем увеличивать его.
PK | YI | YR |
----|----|----- |
1 | 1 | 2023 |
----|----|------|
2 | 1 | 2024 |
Решения вопроса 1
@Shavadrius
Знакомая проблема: пользователи хотят видеть красиво пронумерованные документы.
За годы работы так и не сформировал единого подхода к преобразованию «непонятного» ID в «красивые циферки».
Есть такие реализации, может что подойдет:
1. Считаем порядок по счетчику, который сбрасываем в начале года. Легко реализуется. Минусы: при удалении элементов будут «дыры» в последовательности, что не нравится пользователям.
2. Считаем порядок динамически по дате добавления/утверждения записи. Легко реализуется. Минусы: при редактировании даты, добавлении документов «задним числом» нумерация поедет, что тоже не нравится пользователям.
3. Рассчитывать следующий номер документа исходя из номера последнего сохраненного (N+1). Обычно работает в паре с возможностью изменения номера руками (администратором ИС, например) — сбрасываем ответственность за нумерацию на пользователей. Полно подводных камней: от необходимости реализовать «сместить все на единичку с такого-то документа» до «нумерация поехала, исправьте».
За годы работы так и не сформировал единого подхода к преобразованию «непонятного» ID в «красивые циферки».
Есть такие реализации, может что подойдет:
1. Считаем порядок по счетчику, который сбрасываем в начале года. Легко реализуется. Минусы: при удалении элементов будут «дыры» в последовательности, что не нравится пользователям.
2. Считаем порядок динамически по дате добавления/утверждения записи. Легко реализуется. Минусы: при редактировании даты, добавлении документов «задним числом» нумерация поедет, что тоже не нравится пользователям.
3. Рассчитывать следующий номер документа исходя из номера последнего сохраненного (N+1). Обычно работает в паре с возможностью изменения номера руками (администратором ИС, например) — сбрасываем ответственность за нумерацию на пользователей. Полно подводных камней: от необходимости реализовать «сместить все на единичку с такого-то документа» до «нумерация поехала, исправьте».
Если запретить манипуляции с датами и удалением документов, то сбрасываемый счетчик очень хорошо себя показывает. Но это практически нереально — без манипуляций обойтись…
Ответы на вопрос 3
@nApoBo3
Зависит от требований. Можно, как вариант, на каждый год создавать свою sequence с именем содержащим год. Создание этой sequence впихнуть в триггер на таблицу с документами,
CREATE SEQUENCE IF NOT EXISTS, и дальше брать из нее значение.
CREATE SEQUENCE IF NOT EXISTS, и дальше брать из нее значение.
@maksam07
https://stackoverflow.com/a/49046542
Здесь немного другая тема, но возможно можно модифицировать: https://stackoverflow.com/questions/57891784/custo…
@shurshur
Самое простое решение такое. Делаем sequence, из которого при вставке заполняем нужный номер явным вызовом nextval или дефолтным значением/триггером. И каждый год 1 января сбрасываем sequence в 0. Зачем слишком усложнять-то?
