Текущий архив: 2003.01.27;
Скачать: CL | DM;
Вниз
TDataSet Найти похожие ветки
← →
Taiga (2003-01-09 13:04) [0]Ув. Господа! Столкнулся с проблемой: Мне нужно выяснить кол-во записей в таблице (таблица содержит ~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;
Тот же результат.
На маленькой таблице все работает отлично.
Вопрос: Кто-нибудь сталкивался с такой проблемой, и как еее решать?
← →
FROM_X (2003-01-09 13:07) [1]Dataset.RowCount пробовал?
← →
Taiga (2003-01-09 13:10) [2]А у TDataSet разве есть RowCount?
← →
FROM_X (2003-01-09 13:10) [3]Ага, проверь
← →
FROM_X (2003-01-09 13:11) [4]RecordCount
← →
Taiga (2003-01-09 13:11) [5]Проверил. Нету :(
← →
FROM_X (2003-01-09 13:12) [6]RecordCount
← →
Taiga (2003-01-09 13:15) [7]Пробовал:
DBGrid1.DataSource.Dataset.Fisrt;
DBGrid1.DataSource.Dataset.Last;
RowCount:= DBGrid1.DataSource.Dataset.RecordCount;
Возвращаемое значение гораздо меньше чем отображается в гриде.
Тут видимо некий баг борланда при работе с большими таблицами
← →
Taiga (2003-01-09 13:16) [8]Пробовал также обойти в цикле используя DataSet.Next,
пока не наступит Eof. Same result :(
← →
FROM_X (2003-01-09 13:17) [9]Кстати, а зачем ты делаешь
DBGrid1.DataSource.Dataset.Fisrt;
DBGrid1.DataSource.Dataset.Last;
?
← →
Taiga (2003-01-09 13:20) [10]Содрал с семпла на форуме.
Вообще делфи и базы - не моя специализация.
Заранее предупреждаю: вы имеете дело с чайником в БД и Делфе :)
← →
Verg (2003-01-09 13:23) [11]DataSet не Filtered случайно?
← →
Taiga (2003-01-09 13:23) [12]Убрал
Fisrt, Last, игры с закладками, и.т.д
Оставил только
Dataset.RecordCount - Тот же результат
← →
FROM_X (2003-01-09 13:25) [13]Ну так вот, если ты не фильтруешь данные в компоненте DataSet
т.е. Filtered:=true (по моему) то
с помошью свойства объекта-RowCount:=DBGrid1.DataSource.Dataset.RecordCount;
ты можешь узнать количество записей.
попробуй.
Кстати а как ты примерно узнал о колличестве записей?
← →
Taiga (2003-01-09 13:25) [14]А как проверить филтеред ли он?
By the way: RecordCount возвращает значение меньшее чем кол-во строк в гриде. Фильтр влиял бы и на содержимое грида
← →
Verg (2003-01-09 13:26) [15]Были какие-то глюки с RecordCount на фильтрованых DS.
Больше никогда не замечал. Работал и таблицами в несколько сот тысяч записей...
← →
REA (2003-01-09 13:28) [16]Да скорее всего таблица битая. И такое бывает. Кстати на макс. число записей влияет версия файла парадокса. А узнать число можно SQL запросом.
← →
Taiga (2003-01-09 13:28) [17]Я написал скрипт в WinRunner который проверил количество записей.
Записей действительно 20000
← →
FROM_X (2003-01-09 13:29) [18]Проверить фильтровано или нет опять же с b:=Filtered ?
Хе и снова
ты говоришь что "Фильтр влиял бы и на содержимое грида"
это как?, ты 20000 записей вручную считал?
← →
Verg (2003-01-09 13:30) [19]Дело еще и в том, что сам DBGrid активно использует RecordCount.
> А как проверить филтеред ли он?
← →
FROM_X (2003-01-09 13:32) [20]if DataSet.Filtered then
← →
Verg (2003-01-09 13:34) [21]
var RowCount : byte; Нет?
← →
FROM_X (2003-01-09 13:35) [22]ставь LongInt не ошибёшься
← →
Taiga (2003-01-09 13:37) [23]>>>Проверить фильтровано или нет опять же с b:=Filtered ?
>>>Хе и снова
>>>ты говоришь что "Фильтр влиял бы и на содержимое грида"
>>>это как?, ты 20000 записей вручную считал?
Я использовал WinRunner: написал скрипт который проходи по гриду и берет поле с порядковым номером.
Для справки: WinRunner это такой продвинутый сенситивный макрорекордер с внутренним языком похожим на С.
Считать 2000- записей руками я еще морально не готов :))))
Щас проверю Filtered
← →
Taiga (2003-01-09 13:40) [24]Проверил. Не Filtered
← →
Sergey Masloff (2003-01-09 13:41) [25]Не проще горожения огорода было сделать select count(*) from?
← →
FROM_X (2003-01-09 13:42) [26]Ну ребята.
Это же очень просто. Раз 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;
← →
Taiga (2003-01-09 13:42) [27]>>>var RowCount : byte; Нет?
RowCount у меня Integer.
← →
Taiga (2003-01-09 13:45) [28]Ну ребята.
Это же очень просто. Раз 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) сейчас попробую
← →
Vox (2003-01-09 16:30) [29]Народ, а разве FetchAll перед считыванием RecordCount"а вызывать не надо?
← →
Мышь (2003-01-09 21:53) [30]В RecordCount совершенно не обязательно содержится количество записей в таблице БД, если речь идет об этом. Однако, можно посчитать количество через
First;
while not EOF do
begin
Inc(Count);
Next;
end;
Только это калабашно и очень долго. Лучше SQL-запросом. А то, что находится в RecordCount довольно круто зависит от того, что в BufferCount (RecordCount <= BufferCount). BufferCount устанавливается стандартными визуальными компонентами типа TDBGrid, или самостоятельно.
← →
Мышь (2003-01-09 22:01) [31]То есть, если есть DBGrid, то RecordCount обычно равен количеству записей, которые он ОДНОВРЕМЕННО отображает на экране, то есть которые видны пользователю в каждый момент времени. Это как раз из-за того, что он ставит BufferCount на столько записей сколько может отобразить.
Страницы: 1 вся ветка
Текущий архив: 2003.01.27;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.008 c