Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 13.09.2012
Сообщений: 46

progress bar SQL-запроса

23.02.2014, 14:33. Показов 2523. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день!
У меня есть на форме dbgrid, который отображает информацию на основе SQL запроса (Query). Но, к сожалению, он выполняется не мгновенно (2-3 сек). Поэтому возникает необходимость отображения процесса выполнения загрузки.
Читал форум, гуглил в интернете, нашел несколько решений, но реализовать их у меня не получилось:
1) Показывать бесконечную анимацию в модальном диалоге.
2) Использовать потоки.

1 "решение".

Unit3.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
__fastcall Status::Status(bool CreateSuspended)
    : TThread(CreateSuspended)
{
}
 
void __fastcall Status::Work()
{
    Form1->Timer1->Enabled=True;
    Form1->ProgressBar1->StepIt();
    if (Form1->ProgressBar1->Position==400)
       Form1->Timer1->Enabled=False;
 
 
}
//---------------------------------------------------------------------------
void __fastcall Status::Execute()
{
    Synchronize(&Work);
    //---- Place thread code here ----
}
Unit1.cpp
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 
 Status *Bar = new Status(true);
 Bar->Work();
 Query->Open();
 
}
Запускается прогресс бар после выполнения запроса.


2 "решение".
C++
1
2
3
4
5
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Form2->ShowModal();
 Query->Open();
}
Открывается форма, а главная блокируется.

PS
Работаю в XE5.
PPS
В c++ не очень хорошо разбираюсь, прошу сильно камнями не бить.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2014, 14:33
Ответы с готовыми решениями:

Можно ли переделать Progress bar в Track bar?
Можно ли переделать Progress bar в Track bar? От прогресбара нужно всего лишь, что бы можно было перемещать внутри его (заливку) ползунок.

Progress Bar и Timer для добавления текста в Memo
Всем привет. Поясните пожалуйста: Есть прогресс бар, который активируется после нажатия кнопки. После чего, в Мемо появляется нужный мне...

как изменить цвет кнопки,или указать position в progress bar
Я полный чайник в с++ подскажите как изменить цвет кнопки,или указать position в progress bar ну или есчё чёньть там

9
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
23.02.2014, 15:51
В ExecuteOptions своей Query выставь eoAsyncFetch, и по OnFetchProgress изменяй позицию ProgressBar-а:

C++
1
2
3
4
5
6
7
void __fastcall TForm1::QryFetchProgress(TCustomADODataSet *DataSet,
    int Progress, int MaxProgress, TEventStatus &EventStatus)
{
    ProgressBar1->Max = MaxProgress;
    ProgressBar1->Position = Progress;
    Application->ProcessMessages();
}
, доп. потоки не нужны...
1
0 / 0 / 0
Регистрация: 13.09.2012
Сообщений: 46
23.02.2014, 16:41  [ТС]
UI, сделал, но все равно во время выполнения запроса ProgressBar не заполняется. Он заполняется сразу по завершению.

Добавлено через 12 минут
Результат запроса - 317 строк.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
23.02.2014, 16:52
У меня результат запроса 1400 строк, и нормально показывает ProgressBar.
0
0 / 0 / 0
Регистрация: 13.09.2012
Сообщений: 46
23.02.2014, 17:06  [ТС]
UI, а у тебя присвоен SQL запрос программно или через инспектор? И может ли влиять на это сложность запроса
sql
SQL
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
SELECT 
cs.LOCATION_ID
, cs.CUSTOMER_ID
, cs.BILL_CUST_ID
, cd.CUST_SHRT_NM AS 'Customer_Name'
, payer_name.CUST_SHRT_NM AS 'Payer_Name'
, cs.EXT_GOVT_DS AS 'Customer_INN'
, payer_inn.EXT_GOVT_DS AS 'Payer_INN'
, sdbPSD.dbo.f_String_Similarity(addr.ADDRESS_TX, payer_addr.ADDRESS_TX, 3) AS 'Legal_Address_Similarity'
 
, addr.ADDRESS_TX AS 'Customer_LEGAL'
, ship.ADDRESS_TX AS 'Customer_SHIP'
 
, payer_addr.ADDRESS_TX AS 'Payer_LEGAL'
, payer_ship.ADDRESS_TX AS 'Payer_SHIP'
 
FROM sdbPSD.dbo.vCUST_DYN_Active cd
JOIN sdbPSD.dbo.CUST_STA cs ON cd.LOCATION_ID = cs.LOCATION_ID
                            AND cd.CUSTOMER_ID = cs.CUSTOMER_ID
                            AND isnull(NULLIF(cs.BILL_CUST_ID, '0'), cs.CUSTOMER_ID) <> cs.CUSTOMER_ID
JOIN sdbPSD.dbo.CUSTADDR_Consolidated addr ON addr.LOCATION_ID = cd.LOCATION_ID
                                            AND addr.CUSTOMER_ID = cd.CUSTOMER_ID
                                            AND addr.ADDR_TYPE = 'ADDRESS'
JOIN sdbPSD.dbo.CUSTADDR_Consolidated ship ON ship.LOCATION_ID = cd.LOCATION_ID
                                            AND ship.CUSTOMER_ID = cd.CUSTOMER_ID
                                            AND ship.ADDR_TYPE = 'SHIPADDR'
                                            
 
JOIN sdbPSD.dbo.CUSTADDR_Consolidated payer_addr ON payer_addr.LOCATION_ID = cs.LOCATION_ID
                                            AND payer_addr.CUSTOMER_ID = cs.BILL_CUST_ID
                                            AND payer_addr.ADDR_TYPE = 'ADDRESS'
JOIN sdbPSD.dbo.CUSTADDR_Consolidated payer_ship ON payer_ship.LOCATION_ID = cs.LOCATION_ID
                                            AND payer_ship.CUSTOMER_ID = cs.BILL_CUST_ID
                                            AND payer_ship.ADDR_TYPE = 'SHIPADDR'
                                            
JOIN sdbPSD.dbo.CUST_STA payer_inn ON payer_inn.location_id = payer_addr.LOCATION_ID
                                    AND payer_inn.CUSTOMER_ID = payer_addr.CUSTOMER_ID
JOIN sdbPSD.dbo.CUST_DYN payer_name ON payer_name.location_id = payer_addr.LOCATION_ID
                                    AND payer_name.CUSTOMER_ID = payer_addr.CUSTOMER_ID
LEFT JOIN sdbPSD.dbo.vKPP AS cust_kpp ON cust_kpp.LOCATION_ID = cd.LOCATION_ID
                                    AND cust_kpp.CUSTOMER_ID = cd.CUSTOMER_ID
LEFT JOIN sdbPSD.dbo.vKPP AS payer_kpp ON payer_kpp.LOCATION_ID = payer_addr.LOCATION_ID
                                    AND payer_kpp.CUSTOMER_ID = payer_addr.CUSTOMER_ID
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
23.02.2014, 17:40
Запрос присвоен программно. Неважно, какая сложность, у меня тоже запрос не из самых простых, OnFetchProgress все равно должен работать, если в ExecuteOptions выставлены eoAsyncFetch или eoAsyncFetchNonBlocking. Опять же, надо смотреть чему равен CacheSize, потому что
The dataset first fetches the number of records specified by the CacheSize property synchronously, then fetches any remaining rows asynchronously.
, если у тебя там большое значение, то операция будет выполнена синхронно, разумеется, тогда не будет изменений прогрессбара...
0
0 / 0 / 0
Регистрация: 13.09.2012
Сообщений: 46
23.02.2014, 18:17  [ТС]
UI, хмм, было 100, поставил 1. Ничего не поменялось.
0
40 / 25 / 7
Регистрация: 04.10.2012
Сообщений: 127
01.03.2014, 16:49
UI
Цитата Сообщение от UI Посмотреть сообщение
В ExecuteOptions своей Query выставь eoAsyncFetch, и по OnFetchProgress изменяй позицию ProgressBar-а:
Спасибо, получилось.
Но это справедливо для SQL-запросов типа "select *", которые открываются методом ADOQuery->Open().
А что делать с SQL-запросами типа "exec *", которые открываются методом ADOQuery->ExecSQL()?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
01.03.2014, 19:13
Цитата Сообщение от Dam33 Посмотреть сообщение
А что делать с SQL-запросами типа "exec *", которые открываются методом ADOQuery->ExecSQL()?
Насколько я знаю, к таким запросам прогресс-бары не привязываются... Уже встречались обсуждения по этому вопросу.
0
40 / 25 / 7
Регистрация: 04.10.2012
Сообщений: 127
01.03.2014, 20:29
UI
А возможно ли в SQL-запросе типа "select * from dbo.ViewResult" (где dbo.ViewResult - представление MS SQL), выводить состояние Progress аналогично SQL-запросу типа "select * from dbo.Table" (где dbo.Table - таблица MS SQL)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.03.2014, 20:29
Помогаю со студенческими работами здесь

Создание SQL запроса
При создании запроса, если делаю так: const char *sql = {&quot;SELECT Number FROM Company WHERE Name = 'Roga i Kopyta';&quot;}; ... ...

Запись SQL запроса в переменную
int query2; ADOQuery2-&gt;SQL-&gt;Clear(); ADOQuery2-&gt;SQL-&gt;Add(&quot;Select IdName From Table2 where Name='&quot;+DBLookupComboBox1-&gt;KeyValue+&quot;'&quot;); ...

Вывод SQL запроса в MEMO
Возможно ли вывести таким образом результат запроса в MEMО? Memo1-&gt;Lines-&gt;Add(&quot; DM-&gt;Q-&gt;SQL-&gt;Add(&quot;SELECT FROM WHERE ...

Сортировка в dataset без SQL запроса
есть таблица, принимающая DataSource, через который нужно добраться к датасету(что не проблема) и отсортировать записи. так вот вопрос:...

Ошибка при создании запроса SQL
Создаю простейщий запрос и вылетает ошибка: Ядро базы данных Microsoft Jet не может найти входную таблицу или запрос Имя.select * from Имя ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru