![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TDataSet [D6]
Taiga © (2003-01-09 13:04:00)Ув. Господа! Столкнулся с проблемой: Мне нужно выяснить кол-во записей в таблице (таблица содержит ~20000 записей)
Я использовал код:
bookmark := DBGrid1.DataSource.Dataset.GetBookmark;
DBGrid1.DataSource.Dataset.DisableControls;
DBGrid1.DataSource.Dataset.First;
RowCount:= 0;
RowCount:= DBGrid1.DataSource.Dataset.MoveBy(MAXROWS));
DBGrid1.DataSource.Dataset.EnableControls;
DBGrid1.DataSource.Dataset.GotoBookmark( bookmark );
DBGrid1.DataSource.Dataset.FreeBookmark( bookmark );
В результате RowCount содержит значение гораздо меньше чем отображается в гриде.
Еще пробовал
DBGrid1.DataSource.Dataset.Fisrt;
DBGrid1.DataSource.Dataset.Last;
RowCount:= DBGrid1.DataSource.Dataset.RecordCount;
Тот же результат.
На маленькой таблице все работает отлично.
Вопрос: Кто-нибудь сталкивался с такой проблемой, и как еее решать?
Мышь (2003-01-09 22:01:00) [1]То есть, если есть DBGrid, то RecordCount обычно равен количеству записей, которые он ОДНОВРЕМЕННО отображает на экране, то есть которые видны пользователю в каждый момент времени. Это как раз из-за того, что он ставит BufferCount на столько записей сколько может отобразить.
Мышь (2003-01-09 21:53:00) [2]В RecordCount совершенно не обязательно содержится количество записей в таблице БД, если речь идет об этом. Однако, можно посчитать количество через
First;
while not EOF do
begin
Inc(Count);
Next;
end;
Только это калабашно и очень долго. Лучше SQL-запросом. А то, что находится в RecordCount довольно круто зависит от того, что в BufferCount (RecordCount <= BufferCount). BufferCount устанавливается стандартными визуальными компонентами типа TDBGrid, или самостоятельно.
Vox (2003-01-09 16:30:00) [3]Народ, а разве FetchAll перед считыванием RecordCount"а вызывать не надо?
Taiga (2003-01-09 13:45:00) [4]Ну ребята.
Это же очень просто. Раз 100 делаю каждый день.
1) select count(*) from table_name
- количество записей с помощью SQL
2) Filtered:=false;
i:=dataset.recordcount; /*(i:integer) */
3)
i:=0;
dataset.first;
while not(dataset.eof) do
begin
i:=i+1;
dataset.next;
end;
2) и 3) пробовал.
1) сейчас попробую
Taiga (2003-01-09 13:42:00) [5]>>>var RowCount : byte; Нет?
RowCount у меня Integer.
FROM_X (2003-01-09 13:42:00) [6]Ну ребята.
Это же очень просто. Раз 100 делаю каждый день.
1) select count(*) from table_name
- количество записей с помощью SQL
2) Filtered:=false;
i:=dataset.recordcount; /*(i:integer) */
3)
i:=0;
dataset.first;
while not(dataset.eof) do
begin
i:=i+1;
dataset.next;
end;
Sergey Masloff (2003-01-09 13:41:00) [7]Не проще горожения огорода было сделать select count(*) from?
Taiga (2003-01-09 13:40:00) [8]Проверил. Не Filtered
Taiga (2003-01-09 13:37:00) [9]>>>Проверить фильтровано или нет опять же с b:=Filtered ?
>>>Хе и снова
>>>ты говоришь что "Фильтр влиял бы и на содержимое грида"
>>>это как?, ты 20000 записей вручную считал?
Я использовал WinRunner: написал скрипт который проходи по гриду и берет поле с порядковым номером.
Для справки: WinRunner это такой продвинутый сенситивный макрорекордер с внутренним языком похожим на С.
Считать 2000- записей руками я еще морально не готов :))))
Щас проверю Filtered
FROM_X (2003-01-09 13:35:00) [10]ставь LongInt не ошибёшься
Verg (2003-01-09 13:34:00) [11]
var RowCount : byte; Нет?
FROM_X (2003-01-09 13:32:00) [12]if DataSet.Filtered then
Verg (2003-01-09 13:30:00) [13]Дело еще и в том, что сам DBGrid активно использует RecordCount.
> А как проверить филтеред ли он?
FROM_X (2003-01-09 13:29:00) [14]Проверить фильтровано или нет опять же с b:=Filtered ?
Хе и снова
ты говоришь что "Фильтр влиял бы и на содержимое грида"
это как?, ты 20000 записей вручную считал?
REA (2003-01-09 13:28:00) [15]Да скорее всего таблица битая. И такое бывает. Кстати на макс. число записей влияет версия файла парадокса. А узнать число можно SQL запросом.
Taiga (2003-01-09 13:28:00) [16]Я написал скрипт в WinRunner который проверил количество записей.
Записей действительно 20000
Verg (2003-01-09 13:26:00) [17]Были какие-то глюки с RecordCount на фильтрованых DS.
Больше никогда не замечал. Работал и таблицами в несколько сот тысяч записей...
Taiga (2003-01-09 13:25:00) [18]А как проверить филтеред ли он?
By the way: RecordCount возвращает значение меньшее чем кол-во строк в гриде. Фильтр влиял бы и на содержимое грида
FROM_X (2003-01-09 13:25:00) [19]Ну так вот, если ты не фильтруешь данные в компоненте DataSet
т.е. Filtered:=true (по моему) то
с помошью свойства объекта-RowCount:=DBGrid1.DataSource.Dataset.RecordCount;
ты можешь узнать количество записей.
попробуй.
Кстати а как ты примерно узнал о колличестве записей?
Taiga (2003-01-09 13:23:00) [20]Убрал
Fisrt, Last, игры с закладками, и.т.д
Оставил только
Dataset.RecordCount - Тот же результат