Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для Paskal1
9 / 9 / 4
Регистрация: 22.10.2010
Сообщений: 95

Скорость заполнения из dbgid в stringgrid

07.12.2012, 00:40. Показов 2692. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Очень срочно нужна помощь.
Писал софт под учет товара + продажа, тестировал прогу на своей бд до 30 позиций. Все работало как нужно но
дали мне почти 7000 позиций и на 11 столбиков. Тут я и
Ближе к теме: загружаю из dbgid в stringgrid все позиции и [B] жду жду ....
Результат открывается но проходит много времени.
Вопрос как можно быстрей выгрузить данные из dbgid в stringgrid
Знаю что подход неправильный но переделывать очень много а времени как всегда нет. (
Мой код:
Delphi
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
procedure TForm3.N7Click(Sender: TObject);
var
i200, j200:Integer;
begin
      ADOQuery3.Active:=False;
      AdoQuery3.SQL.Clear;
      ADOQuery3.SQL.Text:='SELECT COUNT (*) FROM Products;';
      ADOQuery3.Active:=true;
 
 
      if not ADOQuery3.Eof then
         begin
           if not ADOQuery3.FieldByName('Expr1000').IsNull then
           begin
             dbCountInt23:=ADOQuery3.fieldbyname('Expr1000').AsInteger;
           end
           else
           begin
           ShowMessage('Ошибка! При выборке данных 00EX0CN');
           end;
         end;
         ADOQuery3.Close;
         StringGrid2.RowCount:=2;
         StringGrid2.RowCount:=dbCountInt23 +1;
 
  AdoQuery3.Close;
  AdoQuery3.SQL.Clear;
  AdoQuery3.SQL.Add('SELECT Products.Kod, Products.Articul, Products.Positions, Products.Cols, Products.Warehouse, Products.PresentPrice, Products.Comment FROM Products;');
  ADOQuery3.Open;
 
 
  j200 := 1;
 DBGrid1.DataSource.DataSet.First;
  while not DBGrid1.DataSource.DataSet.Eof do
  begin
    for i200 := 0 to DBGrid1.Columns.Count -1 do
    begin
     StringGrid2.Cells[0,0]:='КОД';
     StringGrid2.Cells[1,0]:='АРТИКЛ';
     StringGrid2.Cells[2,0]:='НАИМЕНОВАНИЕ ПОЗИЦИИ';
     StringGrid2.Cells[3,0]:='КОЛИЧЕСТВО';
     StringGrid2.Cells[4,0]:='СКЛАД';
     StringGrid2.Cells[5,0]:='ЦЕНА';
     StringGrid2.Cells[6,0]:='КОМЕНТАРИЙ';
     StringGrid2.Cells[i200, j200] := DBGrid1.DataSource.DataSet.Fields[i200].AsString;
     //------------------------------------->
    Form3.Repaint;
    StringGrid2.Repaint;
    end;
    Inc(j200);
    DBGrid1.DataSource.DataSet.Next;
   end;
   end;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.12.2012, 00:40
Ответы с готовыми решениями:

Поиск по dbgid
Подскажите почему не ищет? никакую ошибку не выдает procedure TForm1.Edit11Change(Sender: TObject); begin ADOQuery1.Active:=false; ...

Delphi 7 Stringgrid Нужно сделать цикл для заполнения Stringgrid данными из другого Stringgrid
Нужно чтобы из Stringgrid1 данные переносились в Stringgrid2 Но ТОЛЬКО ПО УСЛОВИЮ Таблицы Stringgrid2 На рис всё показано. За работающий...

Ошибка заполнения StringGrid
Здраствуйте, не могу понять почему программа не хочет заполнять массив рандомом( {61. Описать процедуру Gauss(A,M,N,i1,i2,X),...

14
 Аватар для albor
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
07.12.2012, 01:18
Уберите Repaint из цикла.

Да и вообще зачем еще Dbgrid дергать.

Delphi
1
2
3
4
5
6
7
ADOQuery3.Open;
j200 := 1;
ADOQuery3.First;
while not ADOQuery3.Eof do
begin
...
ADOQuery3.Next;
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
07.12.2012, 01:19
Можно оптимизировать так:
- вынести за пределы цикла присвоение заголовочных ячеек (зачем 70 тыс раз делать одно и то же присвоение?)
- во внутреннем цикле сформировать строку из значений полей, разделенных символом (в примере это символ "|")
и присвоить всем ячейкам одной строки стринггрида сразу всю строку
- Repair ни формы, ни стриггрида не требуется. А это тоже ведь секунды накапливаются.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  S : string;
begin
  ...
  StringGrid2.Cells[0,0]:='КОД';
  StringGrid2.Cells[1,0]:='АРТИКЛ';
  StringGrid2.Cells[2,0]:='НАИМЕНОВАНИЕ ПОЗИЦИИ';
  StringGrid2.Cells[3,0]:='КОЛИЧЕСТВО';
  StringGrid2.Cells[4,0]:='СКЛАД';
  StringGrid2.Cells[5,0]:='ЦЕНА';
  StringGrid2.Cells[6,0]:='КОМЕНТАРИЙ';
 
  j200 := 1;
  DBGrid1.DataSource.DataSet.First;  
  while not DBGrid1.DataSource.DataSet.Eof do begin
    S := '';
    for i200 := 0 to DBGrid1.Columns.Count -1 do
      S := S + DBGrid1.DataSource.DataSet.Fields[i200].AsString + '|';
 
    StringGrid2.Rows[j200].Delimiter := '|';
    StringGrid2.Rows[j200].DelimitedText := S;
    Inc(j200);
    DBGrid1.DataSource.DataSet.Next;
  end;
...
Что-то в этом роде. Пытал на 1000 записях (правда, полей было только 6). Вроде быстрее работает.
0
 Аватар для Paskal1
9 / 9 / 4
Регистрация: 22.10.2010
Сообщений: 95
07.12.2012, 02:35  [ТС]
Цитата Сообщение от albor Посмотреть сообщение
Уберите Repaint из цикла.

Да и вообще зачем еще Dbgrid дергать.

Delphi
1
2
3
4
5
6
7
ADOQuery3.Open;
j200 := 1;
ADOQuery3.First;
while not ADOQuery3.Eof do
begin
...
ADOQuery3.Next;
Не понял про Dbgrid. Я из него данные беру, если я правильно вас понимаю вы предлагаете делать 7000 запросов и отдельно его выгружать? Прошу прощения может я глупости пишу я с БД новичок.

Добавлено через 3 минуты
0
 Аватар для Paskal1
9 / 9 / 4
Регистрация: 22.10.2010
Сообщений: 95
07.12.2012, 02:49  [ТС]
Цитата Сообщение от Скандербег Посмотреть сообщение
Можно оптимизировать так:
- вынести за пределы цикла присвоение заголовочных ячеек (зачем 70 тыс раз делать одно и то же присвоение?)
- во внутреннем цикле сформировать строку из значений полей, разделенных символом (в примере это символ "|")
и присвоить всем ячейкам одной строки стринггрида сразу всю строку
- Repair ни формы, ни стриггрида не требуется. А это тоже ведь секунды накапливаются.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  S : string;
begin
  ...
  StringGrid2.Cells[0,0]:='КОД';
  StringGrid2.Cells[1,0]:='АРТИКЛ';
  StringGrid2.Cells[2,0]:='НАИМЕНОВАНИЕ ПОЗИЦИИ';
  StringGrid2.Cells[3,0]:='КОЛИЧЕСТВО';
  StringGrid2.Cells[4,0]:='СКЛАД';
  StringGrid2.Cells[5,0]:='ЦЕНА';
  StringGrid2.Cells[6,0]:='КОМЕНТАРИЙ';
 
  j200 := 1;
  DBGrid1.DataSource.DataSet.First;  
  while not DBGrid1.DataSource.DataSet.Eof do begin
    S := '';
    for i200 := 0 to DBGrid1.Columns.Count -1 do
      S := S + DBGrid1.DataSource.DataSet.Fields[i200].AsString + '|';
 
    StringGrid2.Rows[j200].Delimiter := '|';
    StringGrid2.Rows[j200].DelimitedText := S;
    Inc(j200);
    DBGrid1.DataSource.DataSet.Next;
  end;
...
Что-то в этом роде. Пытал на 1000 записях (правда, полей было только 6). Вроде быстрее работает.
Попробовал изменений нет ( хотя вариант мне понравился
Eсть мысль но может быть бредовая:->
Я думаю схитрить а если сделать копию скрытого стринггрида и заранее загрузить туда позиции а потом может через какую то функцию передать всем масивом может знаете способ или функцию strgida
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
07.12.2012, 11:26
Предложенный способ загрузки стринггрида построчно можно модифицировать и загружать столбцами.
Вот и будет это "передать всем массивом", только массивов будет не один, а по количеству колонок в стринггрид.
Но "заряжать" эти несколько массивов нужно сразу по мере продвижения по выборке в датасете.
Есть подозрение, что скорость заполнения во многом определяет внешний цикл перемещения по выборке и, тогда, как ни хитри, а уменьшить время не получится.
"копия скрытого стринггрида" ничем не поможет, а способ присвоения построчно или по столбцам единственный "скоростной".

Добавлено через 2 часа 11 минут
Специально смоделировал ситуацию. Нашел таблицу с 25,5 тыс записей и 6 колонками (правда, в Firebird).
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.Button1Click(Sender: TObject);
var
  S : string;
  C, R, T : Integer;
begin
  T := GetTickCount;
  IBDatabase1.Open;
  Query.Open;
  R := 1;
  while not Query.Eof do begin
    S := IntToStr(R)+'|';
    for C := 0 to 5 do
      SG.Cells[C, R] := Query.Fields[C].AsString;
    Query.Next;
    Inc(R);
  end;
    //вывод времени затраченное на всю операцию (~800 мсек)
  Label1.Caption := IntToStr(GetTickCount - T); 
  IBDatabase1.Close;
end;
Вместе с открытием соединения с БД и открытием датасета заполнение стрингрида продолжается меньше секунды.
Автору темы мешают либо темная материя, либо древняя техника, либо буфер драйвера СУБД, в котором
хранится выборка (ведь так никто и не знает что за БД использует автор).
Если что-то другое, то без проекта и базы разобраться не получится.
0
 Аватар для Paskal1
9 / 9 / 4
Регистрация: 22.10.2010
Сообщений: 95
07.12.2012, 13:25  [ТС]
RE
Автору темы мешают либо темная материя, либо древняя техника, либо буфер драйвера СУБД, в котором
хранится выборка (ведь так никто и не знает что за БД использует автор).
Если что-то другое, то без проекта и базы разобраться не получится.
Да правда про бд я и не слова( бд в Access (*.mdb),
Техника Ноутбук Acer Aspire 5315 и HP Compaq(cq57)
Вот что у меня в АDOConnection.ConnectionString
Code
1
Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=E:\Нагорному\Программма\Base\Nsa.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
0
 Аватар для albor
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
07.12.2012, 14:06
Цитата Сообщение от Paskal1 Посмотреть сообщение
RE

Да правда про бд я и не слова( бд в Access (*.mdb),
Техника Ноутбук Acer Aspire 5315 и HP Compaq(cq57)
Вот что у меня в АDOConnection.ConnectionString...
И все таки, очень хотелось бы узнать зачем все это нужно?
Какие дополнительные преимущества получает пользователь просматривая данные в Стринггриде, а не в обычном DBGride? А то как то все это напоминает чесание левой ногой правого уха.
0
 Аватар для Paskal1
9 / 9 / 4
Регистрация: 22.10.2010
Сообщений: 95
07.12.2012, 14:13  [ТС]
Начал проектирование программы с работой с бд в первые и поставил на форму stgrid написал обработчики а теперь много переписывать если ставить на bdgrid. Преимуществ не каких пользователь выберет нужную строку она добавляется в список покупок там все считается. Дело в том что много ссылок идет на этот Stgrid место переменных как бы.
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
07.12.2012, 14:15
Забубенил в таблицу Аксесс 17800 записей (6 колонок)
Заполнение стрингрида заняло ~3,3 сек.

Да, аксесс, конечно, послабее, но и в этом случае не приходится долго ждать.
Остается грешить на технику.
0
 Аватар для Paskal1
9 / 9 / 4
Регистрация: 22.10.2010
Сообщений: 95
07.12.2012, 14:21  [ТС]
Цитата Сообщение от Скандербег Посмотреть сообщение
Забубенил в таблицу Аксесс 17800 записей (6 колонок)
Заполнение стрингрида заняло ~3,3 сек.

Да, аксесс, конечно, послабее, но и в этом случае не приходится долго ждать.
Остается грешить на технику.
Не хило! а это каким способом ? через Delimiter или Query.

А как же тут техника не думал что мой нот уж такой старый
У меня под рукой есть HP он по мощней будет только он на 7ке.

и если можно примерчик как вы это выполняли.
зар.спс
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
07.12.2012, 14:21
По-взрослому, надо все же переписывать. Стринггрид не та лошадка, на которую можно ставить в длительных забегах (скажем так, т.е., если предполагается работа с большими массивами данных в БД).

Но и в этом случае можно что-то сделать. Никогда пользователь не будет интересоваться 7000 записями одновременно.
Отсюда вывод: фильтруем выборку по какому-либо сценарию (автору виднее, какая группа записей может пользователя интересовать одновременно).
0
 Аватар для Paskal1
9 / 9 / 4
Регистрация: 22.10.2010
Сообщений: 95
07.12.2012, 14:26  [ТС]
Я об этом думал так оно наверно и будет.
А впредь будет мне урок что нужно использовать dbgrid
А то поленился почитать про компонент и вот итог.
Ну думаю тема закрыта. Дальше сам.
ВСЕМ БОЛЬШОЕ ОГРОМНОЕ СПАСИБО ЧТО ОТРЕАГИРОВАЛИ https://www.cyberforum.ru РУЛИТ
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
07.12.2012, 14:27
Так ведь, примерчик то все тот же самый, только доступ через ADO.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.Button2Click(Sender: TObject);
var
  S : string;
  C, R, T : Integer;
begin
  T := GetTickCount;
  ADOConnection1.Open;
  ADOQuery1.Open;
  R := 1;
  while not ADOQuery1.Eof do begin
    S := '';
    for C := 0 to 5 do
      SG.Cells[C, R] := ADOQuery1.Fields[C].AsString;
 
    ADOQuery1.Next;
    Inc(R);
  end;
  Label1.Caption := IntToStr(GetTickCount - T);
  ADOQuery1.Close;
  ADOConnection1.Close;
end;
Есть ли в таблице вашей БД ключевое поле? Оно, как правило, индексируется СУБД для быстрого доступа. Но про Аксесс мало чего могу сказать. Когда импортировал данные в таблицу аксесса, то тот спросил насчет индексов (это не о ключевом поле по-моему речь то шла). Я ему, мол, да, конечно, нужны.
Но судя по всему индексы эти как мертвому припарка (хотя, в других СУБД индексирование полей дает существенный выигрыш в выборке данных).
0
731 / 407 / 95
Регистрация: 19.12.2010
Сообщений: 756
07.12.2012, 14:29
Данные выбираются из таблицы, а не из dbgrid. Для выгрузки(отбора) данных используются запросы. отобранные данные показываются пользователю с использованием QReport,FastReport,RaveReport,Excel,Word ,HTML.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2012, 14:29
Помогаю со студенческими работами здесь

Подскажите код для заполнения stringgrid
Мне нужно заполнить Stringgrid в столбик содержимым edita а потом столбцы поменять местами подскажите пожалуйста как это сделать? ...

От чего зависит скорость заполнения таблицы Excel?
E меня такой ВОПРОС: У меня есть приложение на VB6 в котором заполняется несколько Ехселевских листов, при этом если этот код...

Как увеличить скорость заполнения ячеек MSFlexGrid?
Заметил я, что скорость заполнения разная, в зависимости от ситуации. Что у меня есть: простая форма, STab на форме, MSFlexGrid на STab....

Просьба помочь с условием заполнения ячеек в StringGrid
Здравствуйте, уважаемые форумчане. Формируется массив из 10 целых чисел путем ввода с клавиатуры. Числа заносятся в ячейки компонента...

Применить текущий алгоритм заполнения StringGrid с произвольной ячейки
здравствуйте,возникла следующая проблема: при заполнении StringGrid числами по порядку 0..k(k вводится пользователем) for (i = 0;...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru