Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.009 c
14-87033
Snake2000
2003-01-10 17:21
2003.01.27
Заработок в Интернет


1-86889
Sergey-ZZZ
2003-01-15 13:20
2003.01.27
Обновление версии EXE файла


1-86735
soware
2003-01-17 12:04
2003.01.27
ComboBox


1-86933
ska
2003-01-10 18:08
2003.01.27
Индикация данных в цикле


7-87148
maxim2
2002-11-14 12:51
2003.01.27
Подскажите у кого стоит WinME, WinNT, Win2000 и WinXP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский