Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Номер контракта автоматически на PHP Mysql
Форумы портала PHP.SU » » Вопросы новичков » Номер контракта автоматически на PHP Mysql

Страниц (1): [1]
 

1. coolxela - 12 Апреля, 2017 - 17:05:55 - перейти к сообщению
Здравствуйте, дорогие друзья. Вообщем очередной вопрос. В фирме номера контрактов вставляется следующем образом
например 01/04-17. Здесь "01" это порядковый номер контракта "04" месяц а нашем случае апрель а 17 как вы уже догадались это в нашем случае 2017 год. И самое интересное порядковый номер каждый месяц начинаться должен с нуля. И все это надо организовать средствами PHP. Как реализовать последние два показателя номера контракта уже ясно просто буду брать из месяца и года текущего а вот насчет первого показателя проблемы. Как или из чего генерировать порядковые числа и чтоб они сохранялись в базе по порядке и в начале каждого месяца нулились и начинали с единицы. Подскажите пожалуйста как реализовать ? Подайте так сказать идею ) Спасибо
Хотел сделать из базы и на value инпута вывести текущий меясц и год в конце но каждый раз он перебирает все записи и в поле ввода показывает 16 записей каждый раз
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+:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE num_orders (
  2.     dm date NOT NULL CHECK(extract('day' FROM dm)=1) PRIMARY KEY,
  3.     num_order int NOT NULL DEFAULT 1
  4. );
  5. WITH gn AS (
  6. 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
  7. )
  8. INSERT INTO targettable (text_doc_num, ...) VALUES (concat((SELECT num_order FROM gn), to_char(date 'now', '/MM-YY')), ...);

Как видно, достаточно одного запроса.
4. coolxela - 14 Апреля, 2017 - 16:45:43 - перейти к сообщению
Мелкий пишет:
Туманная голова предлагает следующее:
заводите вспомогательную табличку: company_id, month (date check day(date)=1), num_order

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

Для postgresql 9.5+:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE num_orders (
  2.     dm date NOT NULL CHECK(extract('day' FROM dm)=1) PRIMARY KEY,
  3.     num_order int NOT NULL DEFAULT 1
  4. );
  5. WITH gn AS (
  6. 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
  7. )
  8. INSERT INTO targettable (text_doc_num, ...) VALUES (concat((SELECT num_order FROM gn), to_char(date 'now', '/MM-YY')), ...);

Как видно, достаточно одного запроса.


Спасибо Вам большое. Так и сделал создал отдельную табличку и при добавлении формы сначала в одну потом остальные поля в другую табличку пихаю )

 

Powered by ExBB FM 1.0 RC1