Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
 Аватар для SenkoL
1 / 1 / 1
Регистрация: 04.05.2013
Сообщений: 47

Создание номеров очереди в БД My SQL

28.06.2016, 17:00. Показов 640. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, коллеги!

Ситуация такова:
требуется вводить заявки от организаций и записывать их в базу, в базе есть 4 поля
1) id - идентификатор;
2) year - год заявки;
3) id_org - код организации;
4) queue_num - номер очереди.

По полям year и id_org создан уникальный индекс, то есть номер очереди уникален для организаций в пределах одного календарного года.
В чем возникла проблема:
- определение алгоритма генерации номера очереди, ведь он должен начинаться с 1 заново каждый год и при этом с автоинкрементом в пределах одного года.
Пример:
ввожу данные год 2016, 5 организация, при записи смотрим в транзакции максимальный прошлый и увеличиваем его на единицу (предположим номер очереди присвоен 10). Далее ввожу 2016 год, 6 организация, номер очереди присвоен 11.
Тут принесли бумагу на 2017 год, на 5 организацию и вот на нее должен быть присвоен номер очереди НЕ 12, а на единицу больше номера очереди для 2017 года.
Все это дело в многопользовательском режиме.
Добился того, что со сменой года начинает присваивать номер заново, но с 1, а не с максимального существующего для конкретного года.
Может кто подкорректирует мои мысли и подскажет куда копать.
Работаю через dbExpress, СУБД - MySQL.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
DataMod->SQLConnect->StartTransaction(transact);
    DataMod->SQLApp->Close();
    DataMod->CDSApp->Close();
    DataMod->SQLApp->SQL->Text =
        "INSERT INTO `application` (`app_request_date`,`org_id`,`app_req_count`,"
        "`app_allot_count`,`app_additional`,`app_year`,`date_enter`) VALUES("
        "'"+dateTPDateGetApp+"',"
        "'"+dBLComBoxOrg+"',"
        "'"+eAmountApp+"',"
        "'"+eNumberApp+"',"
        "'"+eAdditionalApp+"',"
        "'"+comBoxYearApp+"',"
        "'"+FormatDateTime("yyyy-mm-dd hh:nn:ss",Now())+"')";
 
    try{
        DataMod->SQLApp->ExecSQL();
    }catch(Exception &e){
        DataMod->SQLConnect->Rollback(transact);
        MessageBox(0,e.Message.c_str(),L"Ошибка сохранения",MB_OK | MB_ICONSTOP);
        return;
    }
 
    DataMod->SQLApp->Close();
    DataMod->CDSApp->Close();
    DataMod->SQLApp->SQL->Text = "SELECT LAST_INSERT_ID() as `last_id`";
    DataMod->SQLApp->Open();
    DataMod->CDSApp->Open();
    lastId = DataMod->DSApp->DataSet->FieldByName("last_id")->AsAnsiString;
 
    //save queue number of org
    DataMod->SQLQueueOrg->Close();
    DataMod->SQLQueueOrg->SQL->Text =
        "INSERT INTO `queue_org` (`year_q`,`org_id`,`queue_num`) "
        "VALUES('"+comBoxYearApp+"','"+dBLComBoxOrg+"','0');";
    try{
        DataMod->SQLQueueOrg->ExecSQL();
    }catch(Exception &e){
        DataMod->SQLConnect->Rollback(transact);
        MessageBox(0,e.Message.c_str(),L"Ошибка сохранения",MB_OK | MB_ICONSTOP);
        return;
    }
 
    //get last insert id for queue
    DataMod->SQLQueueOrg->Close();
    DataMod->CDSQueueOrg->Close();
    DataMod->SQLQueueOrg->SQL->Text = "SELECT LAST_INSERT_ID() as `last_id`";
    DataMod->SQLQueueOrg->Open();
    DataMod->CDSQueueOrg->Open();
    lastIdQueue = DataMod->DSQueueOrg->DataSet->FieldByName("last_id")->AsAnsiString;
 
    //get max queue number from last record
    DataMod->SQLQueueOrg->Close();
    DataMod->CDSQueueOrg->Close();
    DataMod->SQLQueueOrg->SQL->Text =
        "SELECT `queue_num` FROM `queue_org` "
        "WHERE `queue_org_id` = '"+IntToStr(StrToInt(lastIdQueue)-1)+"' AND "
        "`year_q` = '"+comBoxYearApp+"'";
    DataMod->SQLQueueOrg->Open();
    DataMod->CDSQueueOrg->Open();
    queueNum = DataMod->DSQueueOrg->DataSet->FieldByName("queue_num")->AsAnsiString;
 
    //update queue number of org
    DataMod->SQLQueueOrg->Close();
    if(!queueNum.IsEmpty()){
        DataMod->SQLQueueOrg->SQL->Text =
        "UPDATE `queue_org` "
        "SET `queue_num` = '"+IntToStr(StrToInt(queueNum)+1)+"' "
        "WHERE `queue_org_id` = '"+lastIdQueue+"'";
    }else{
        DataMod->SQLQueueOrg->SQL->Text =
        "UPDATE `queue_org` "
        "SET `queue_num` = '1' "
        "WHERE `queue_org_id` = '"+lastIdQueue+"'";
    }
 
    try{
        DataMod->SQLQueueOrg->ExecSQL();
    }catch(Exception &e){
        DataMod->SQLConnect->Rollback(transact);
        MessageBox(0,e.Message.c_str(),L"Ошибка сохранения",MB_OK | MB_ICONSTOP);
        return;
    }
 
    //Set identifier the current application
    this->app_id = lastId;
    DataMod->SQLConnect->Commit(transact);
Добавлено через 42 минуты
Изменил
C++
1
2
3
4
DataMod->SQLQueueOrg->SQL->Text =
        "SELECT `queue_num` FROM `queue_org` "
        "WHERE `queue_org_id` = '"+IntToStr(StrToInt(lastIdQueue)-1)+"' AND "
        "`year_q` = '"+comBoxYearApp+"'";
на
C++
1
2
3
4
DataMod->SQLQueueOrg->SQL->Text =
        "SELECT MAX(`queue_num`) as `max_q` FROM `queue_org` "
        "WHERE `queue_org_id` < '"+lastIdQueue+"' AND "
        "`year_q` = '"+comBoxYearApp+"'";
ВСе работает правильно, но остается вопрос в многопользовательском режиме...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.06.2016, 17:00
Ответы с готовыми решениями:

Создание очереди и удаление элемента очереди по усмотрению пользователя
Вот код он создает очередь и должен удалить элемент очереди по усмотрению пользователя проблема заключается в том что при попытки удалить...

Найти сумму чётных номеров элементов очереди
Заполнить очередь 9 случайными вещественными числами из интервала . Найти сумму чётных номеров элементов очереди. Результат поместить в...

Очереди сообщение (создание очереди из N сообщений)
Нужна помощь в создании очереди из n сообщений как создать простую очередь я знаю но как указать конкретное возможное количество...

1
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
29.06.2016, 03:22
Получать значение в триггере или в процедуре, из которой будешь осуществлять на запись в таблицу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.06.2016, 03:22
Помогаю со студенческими работами здесь

Реализация стека/очереди для выдачи номеров пар скобок в тексте
Пункт а я решил: добавляем номер символа в стек, если встретился символ &quot;(&quot;, когда встречаем &quot;)&quot;, то печатаем элемент стека...

написание запроса на выведение номеров в sql
Нужен совет профессионалов. Пытаюсь помочь своей знакомой) Сам я sql знаю, но не я профи, а изучать мне интересно. Даны 2 таблицы: с...

SQL. В таблицу найти интервалы идентификаторов отсутствующих номеров
Здравствуйте, столкнулся вот с таким заданием: В таблицу найти интервалы идентификаторов отсутствующих номеров. Пример: id --- 1 |...

SQL-запрос для вывода всех табельных номеров сотрудников
Здравствуйте! Вот есть такая небольшая задача, связанная с SQL. В БД есть две таблицы: Table A и Table B. Напиcать SQL-запрос для...

Создание очереди
Создать две очереди из случайных чисел. В первой найти максимальный элемент и за ним вставить элементы второй очереди.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru