Номера документов для каждой фирмы свой.

Бизон

Номера документов для каждой фирмы свой.Вопрос дублируется из ветки InterBase, Firebird, Yaffil.Задача такого плана. База данных, FireBird в ней будут хранится различные документов, например расходная накладная, фирм несколько. У каждой фирмы должен быть свой порядок нумерации, с каким либо префиксом. Очевидное и простое решение генератор, для каждой фирмы и каждого типа документов свой. Их конечно будет много, но проблема не этом. Как быть если добавилась фирма, редактировать метаданные и добавлять генераторы? Или есть другое решение. Заранее спасибо.
18 ответов

Бизон

я задавал уже аналогичный вопрос, мне тогда посоветовали завести вместо последовательностей (в Firebird генераторов) таблицу с колонками ИМЯ_СЧЕТЧИКА/НОМЕР. Тогда при добавлении новой фирмы добавлятся еще одна запись в таблицу.


Бизон

Конечно есть, близкое к предложению Кроик, добавить поле Префикс в справочник фирм и больше ничего изменять не надо, кроме генератора конечно. А у тебя почему то генераторЫ, а нужен всего один генератор. Но вообще то нужно два префикса, один для фирмы, а другой для типа документов. Разбивать на три поля видимо не стоит, это только усложнит работу--http://www.podgoretsky.com


Бизон

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


Бизон

Бизон> В том и прикол. Нумерация должен быть независимая,Бизон> как по фирме, так и по типу документа.Нумерация чего - IDшников?


Бизон

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


Бизон

Нет номеров документов. Типа расходные накладные своя нумерация, чеки своя, приходные своя. У каждой фирмы своя нумерация документов.ID - одельно, они как раз норамльно генерятся генераторами для каждой таблицы.Например таблица чековID - уникален в таблице, генераторNOMER - может быть не уникален, уникален только в разрезе фирмы.т.е. номер и фирма - сотавной уникальный ключ.


Бизон

Бизон> Нет номеров документов.По старинке, блокировкой. Ищи, обсуждалось много раз.И генератор тут в общем-то не нужен, хотя применим.


Бизон

Подкинете направление поиска - блокировкой чего? На просто блокировка много слишком находится.


Бизон

Можно номер хранить просто в отдельном поле таблицы бд или заюзать еще один генератор на конкретную фирму и тип документа свой и им вести номера документов


Бизон

Бизон> Подкинете направление поиска - блокировкой чего?Блокировкой чего-нибудь (не так уж важно чего - флага, записитаблицы и т.д.) от параллельного добавления/редактирования.


Бизон

Как вариант при старте прога проверяет наличие генератора по след. имени FFFDDYYYY, где FFF префикс фирмы, DD префикс вида документа YYYY номер года, если его нет, то создает новый генератор. При получении номера документа формируется имя генератора и выполняется запрос на его инкремент. Это кратко, но думаю ход мысли понятен. У меня таким образом организовано получение номеров документов в одной программе, только без разделения по фирмам. Первая стартанувшая прога в новом году создает необходимые генераторы.


Бизон

Соблазнительно.


Бизон

Как вариант, саздавать тригер один раз на клиенте во время добавления новой фирмы. Через тригер не получтися, к сожалению, на Firebird 1.5 приведенный код не работает :(
CREATE OR ALTER trigger firms_ai0 for firms
active after insert position <b>0</b>
AS
declare variable pref varchar (<b>20</b>);
begin
 pref = 'GEN_'||new.name;
 CREATE GENERATOR :pref;
 SET GENERATOR :pref TO <b>0</b>;
end


Бизон

Set Generator в триггерах - это круто.


Бизон

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


Бизон

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


Бизон

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


Бизон

Из своего опыта работы с подоными задачами могу сказать, что вариант с отдельными генераторами, имена которых формируются по определённому правилу, для FireBird будет наиболее предпочтителен в многопользовательской среде.Господа, вы не забывайте, что FireBird - версионник, поэтому все остальные варианты со служебными таблицами или комбинациями таблиц и малым числом генераторов потребуют очень аккуратного программирования, грамотного управления транзакциями и т.п. Придётся городить несколько подключений с разными типами транзацкций и т.п.А вот генераторы в FireBird работают независимо от транзакций, что гарантирует уникальность их значений для всех пользователей.Опять же, сколько там типов документов? 5, 6, 10? И сколько фирм? Ну будет там даже 100 генераторов, и что? Зато общая логика программы заметно упростится.Так что я бы сделал так, как предложил savolv.