Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.012 c
8-86985
daos
2002-10-09 13:20
2003.01.27
ПОМОГИТЕ ПОЖАЛУЙСТА!!! Экран >> видео.


1-86808
zolotov
2003-01-18 18:04
2003.01.27
Formula One


1-86905
Alex Shulg
2003-01-16 13:21
2003.01.27
Сервис WinNT


1-86936
anod
2003-01-16 21:42
2003.01.27
Как мне реализовать


1-86771
SSS
2003-01-17 18:17
2003.01.27
Raznije Windows