Здравствуйте, дорогие друзья. Вообщем очередной вопрос. В фирме номера контрактов вставляется следующем образом
например 01/04-17. Здесь "01" это порядковый номер контракта "04" месяц а нашем случае апрель а 17 как вы уже догадались это в нашем случае 2017 год. И самое интересное порядковый номер каждый месяц начинаться должен с нуля. И все это надо организовать средствами PHP. Как реализовать последние два показателя номера контракта уже ясно просто буду брать из месяца и года текущего а вот насчет первого показателя проблемы. Как или из чего генерировать порядковые числа и чтоб они сохранялись в базе по порядке и в начале каждого месяца нулились и начинали с единицы. Подскажите пожалуйста как реализовать ? Подайте так сказать идею ) Спасибо
Хотел сделать из базы и на value инпута вывести текущий меясц и год в конце но каждый раз он перебирает все записи и в поле ввода показывает 16 записей каждый раз
1. coolxela - 12 Апреля, 2017 - 17:05:55 - перейти к сообщению
2. haveFun - 12 Апреля, 2017 - 19:04:39 - перейти к сообщению
как данные в бд хранятся? у поядкового номера контракта отдельный столбец, или вся каша в одном поле?
3. Мелкий - 12 Апреля, 2017 - 21:08:18 - перейти к сообщению
Туманная голова предлагает следующее:
заводите вспомогательную табличку: company_id, month (date check day(date)=1), num_order
При присвоение нового номера договора сначала в транзакции инкрементите num_order, затем полученное значение пишете куда требуется. Инкремент первым в транзакции будет гарантировать сериализацию конкурентных генераций номера.
Для postgresql 9.5+:
заводите вспомогательную табличку: company_id, month (date check day(date)=1), num_order
При присвоение нового номера договора сначала в транзакции инкрементите num_order, затем полученное значение пишете куда требуется. Инкремент первым в транзакции будет гарантировать сериализацию конкурентных генераций номера.
Для postgresql 9.5+:
CODE (SQL):
скопировать код в буфер обмена
скопировать код в буфер обмена
- CREATE TABLE num_orders (
- dm date NOT NULL CHECK(extract('day' FROM dm)=1) PRIMARY KEY,
- num_order int NOT NULL DEFAULT 1
- );
- WITH gn AS (
- INSERT INTO num_orders (dm) VALUES (date_trunc('month', date 'now')) ON conflict(dm) do UPDATE SET num_order = num_orders.num_order + 1 returning num_order
- )
- INSERT INTO targettable (text_doc_num, ...) VALUES (concat((SELECT num_order FROM gn), to_char(date 'now', '/MM-YY')), ...);
Как видно, достаточно одного запроса.