Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TDataSet [D6]


Страницы:   1 2

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 - Тот же результат


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо