Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.30;
Скачать: CL | DM;

Вниз

Как узнать колличество записей в DBGrid?   Найти похожие ветки 

 
Neket   (2009-07-03 10:59) [0]

Собственно САБЖ...


 
Dennis I. Komarov ©   (2009-07-03 11:11) [1]

Ты не поверишь, но их там нет...


 
Neket   (2009-07-03 11:16) [2]

Я так и знал ))))
Ладно поподробнее задам вопрос.
Выгружаю из БД данные. Они прогружаются в DBGrid из DATASOURSE.
Как узнать колличество строк прогруженных в DBGrid.
Я когда-то давно делал это но непомню как. Помоему вообще нужно в DATASOURSE копать. Но непомню. Парни ну подскажите а то так нехочется пробегать лишний раз весь DATASOURSE и подсчитывать колличество строк.


 
Юрий Зотов ©   (2009-07-03 11:18) [3]

> Neket   (03.07.09 10:59)

Записи содержатся в DataSet"е, а не в Grid"е. В Grid"е они только отображаются, причем не обязательно все сразу.

Какие БД и DataSet используете? От этого зависит ответ.


 
Neket   (2009-07-03 11:21) [4]

Ну DataSet обычный DATASOURSE... а база Access


 
Anatoly Podgoretsky ©   (2009-07-03 11:21) [5]

В dbGrid данных нет, нельзя туда прогрузить. И в DATASOURSE тоже данных нет.


 
Anatoly Podgoretsky ©   (2009-07-03 11:22) [6]

Что такое DataSet обычный?


 
Юрий Зотов ©   (2009-07-03 11:23) [7]

> Neket   (03.07.09 11:21) [4]

DataSet и DataSource - вещи совершенно разные.


 
Neket   (2009-07-03 11:24) [8]

))))) Ну емае )))
Стандартная схема
Query1->DATASOURSE1->DBGRID1

Query1 - Делает запрос в Access-овскую базу.


 
Dennis I. Komarov ©   (2009-07-03 11:27) [9]


> Neket   (03.07.09 11:24) [8]

Скажу по секрету, TQuery и есть (почти) TDataSet


 
Юрий Зотов ©   (2009-07-03 11:30) [10]

> Neket   (03.07.09 11:24) [8]

Тогда самое надежное - сделать еще один запрос:
select count(*) from [дальше те же таблицы и тот же where, что и в Query1]


 
Neket   (2009-07-03 11:31) [11]

Ага всеее спасибо... Узаю Query1.RecordCount


 
Ega23 ©   (2009-07-03 11:31) [12]


> Как узнать колличество записей в DBGrid?


1. Взять количество записей в TDataSet.
2. Взять DBGrid.Height
3. Вычислить DBGrid.RowHeight (не помню как, но можно)
4. Разделить одно на другое. Если разделилось не ровно, то div и потом +1
5. Значение из 3 (или 4) сравнить с количеством записей в TDataSet.
6. Если меньше или равно, то искомое число - в 3 (или 4).
7. Иначе - искомое число равно количеству записей в TDataSet.


 
Ega23 ©   (2009-07-03 11:33) [13]


> Узаю Query1.RecordCount


Это ненадёжное решение. Сдаётся мне, ты используешь BDE. А там далеко не факт, что данные профетчились все до конца.


 
Neket   (2009-07-03 11:33) [14]

Тогда соме оно select count(*) from  * )))


 
Dennis I. Komarov ©   (2009-07-03 11:37) [15]


> Ega23 ©   (03.07.09 11:33) [13]

Он вроде про Access говорил, хотя про ADO ни слова... БЕДЕ и с аксесом работает?


 
Ega23 ©   (2009-07-03 11:37) [16]


> Тогда соме оно select count(*) from  * )))


Это да. Но учти, что пока ты получил count, а потом открыл набор данных, прошло некоторое время. И нет никакой гарантии, что за это время данные остались те же самые. Может кто-то что-то добавил/удалил/изменил за это время. И это "что-то" попадает под твои условия выборки.


 
Dennis I. Komarov ©   (2009-07-03 11:39) [17]


> Neket   (03.07.09 11:33) [14]

Тут тоже не факт, т.к. за время меджу двумя запросами могут иметь место изменения данных в БД


 
Ega23 ©   (2009-07-03 11:39) [18]


> Он вроде про Access говорил, хотя про ADO ни слова... БЕДЕ
> и с аксесом работает?


А почему нет-то? Там драйверок какой-то нужно ставить (не помню какой уже). Я в своё время (очень давно) курсач делал, как раз RxQuery и Access использовал.


 
Ega23 ©   (2009-07-03 11:42) [19]

Вобщем, самый более-менее надёжный способ:
Query.Open; // Открыли НД
Query.Last;  // Получили все данные до конца
ShowMessage(IntToStr(Query.RecordCount));  // Вот теперь одлжно быть всё нормально. Но не факт, возможны нюансы в зависимости от реализации конкретного потомка TDataSet


 
Dennis I. Komarov ©   (2009-07-03 11:44) [20]


> Ega23 ©   (03.07.09 11:39) [18]

Я не знаю, поэтому и спросил ;) А вобще ну его фтопку...

ЗЫ

Сейчас выясниться что все это надо для for i....


 
Ega23 ©   (2009-07-03 11:49) [21]


> Сейчас выясниться что все это надо для for i....


:)))))))))
5 баллов!!!!


 
Neket   (2009-07-03 11:49) [22]


> Dennis I. Komarov ©   (03.07.09 11:44) [20]


)))))))))) А как ты догадался ?
Это мне нужно чтобы как в экселе можно было подравнять все колонки по самой длинной записи в этой колонке )))))


 
Sergey13 ©   (2009-07-03 11:50) [23]

> [19] Ega23 ©   (03.07.09 11:42)
> Вобщем, самый более-менее надёжный способ

А самый, без всяких "более-менее", надежный способ - в цикле подсчитать. 8-)


 
sniknik ©   (2009-07-03 11:55) [24]

> 1. Взять количество записей в TDataSet.
> 2. Взять DBGrid.Height
> 3. Вычислить DBGrid.RowHeight (не помню как, но можно)
> 4. Разделить одно на другое. Если разделилось не ровно, то div и потом +1
> 5. Значение из 3 (или 4) сравнить с количеством записей в TDataSet.
> 6. Если меньше или равно, то искомое число - в 3 (или 4).
> 7. Иначе - искомое число равно количеству записей в TDataSet.
все гораздо проще...

type
 TMyDBGrid = class(TDBGrid);
...
ShowMessage( IntToStr(TMyDBGrid(DBGrid1).RowCount) );


 
sniknik ©   (2009-07-03 11:57) [25]

> Это мне нужно чтобы как в экселе можно было подравнять все колонки по самой длинной записи в этой колонке )))))
а почему тогда вопрос про количество записей, а не полей?


 
Dennis I. Komarov ©   (2009-07-03 12:01) [26]


> Neket   (03.07.09 11:49) [22]

И каким образом оно будет проходить зная количество записей?


 
Neket   (2009-07-03 12:07) [27]

Я как сделаю напишу код...
а так основная мысль - это пробежать по всем ROWS текущей СOLUMN и используя razm:=DBGrid1.Canvas.TextWidth(str); найти максимальное значение потом чтобы более или менее красиво было задаем
DBGrid1.Columns[i].Width:=razm+6; (6-эксперементально подобрана)


 
Neket   (2009-07-03 12:10) [28]

Если есьт другие варианты решения то с удоваольствием выслушаю... Самому интересно


 
Anatoly Podgoretsky ©   (2009-07-03 12:13) [29]

> Dennis I. Komarov  (03.07.2009 11:37:15)  [15]

А мы чего гадать должны, что у него, если он сам молчит как партизан?


 
Dennis I. Komarov ©   (2009-07-03 12:13) [30]

Ну ты напиши код, а потом выслушаешь... :) Будет очень интересно, ибо в [20] я оказался прав


 
Anatoly Podgoretsky ©   (2009-07-03 12:14) [31]

> sniknik  (03.07.2009 11:57:25)  [25]

Потому что FOR


 
Neket   (2009-07-03 12:25) [32]

Вооо вроде как-то так...
Компилируйте ))))

For i:=0 to dbgrid1.FieldCount-1 do
begin
razm:=DBGrid1.Canvas.TextWidth(DBGrid1.Columns[i].FieldName);
For n:=0 to Query1.RecordCount do
str:=Query1.FieldValues[DBGrid1.Columns[i].FieldName];
Razmtp:=DBGrid1.Canvas.TextWidth(str);
if razmtp>=razm then razm:=razmtp;
DBGrid1.Columns[i].Width:=razm+6;


 
Neket   (2009-07-03 12:26) [33]

6-ка для 8-го шришта


 
Neket   (2009-07-03 12:26) [34]

6-ка для 8-го шришта


 
Dennis I. Komarov ©   (2009-07-03 12:26) [35]


> Ega23 ©   (03.07.09 11:49) [21]
>
> > Сейчас выясниться что все это надо для for i....
>
>
> :)))))))))
> 5 баллов!!!!

А это на сколько?


 
Dennis I. Komarov ©   (2009-07-03 12:28) [36]

А если у меня плохо со зрением и я 8-ку не вижу, и для этого у меня все крупнее, как быть?


 
Плохиш ©   (2009-07-03 12:28) [37]


> Neket   (03.07.09 12:07) [27]
>
> Я как сделаю напишу код...

Это, что угадайка "расставь запятые"?

Только сюда глюкокодов не надо, тем более по работе с акцессом через бде.


 
Neket   (2009-07-03 12:28) [38]

Дану вас... Напишите свое виденье на эту проблему. Только умеете балы раставлять


 
Neket   (2009-07-03 12:30) [39]

Удалено модератором


 
Dennis I. Komarov ©   (2009-07-03 12:42) [40]

что бы два раза ее не писать смотрим TDataSet.Eof + F1, даже с примером...
ЗЫ
 Это если тонкие намеки на for никчему не приводят...


 
Neket   (2009-07-03 12:48) [41]

Вот так в итоге получилось так:

with form5 do
begin
For i:=0 to dbgrid1.FieldCount-1 do
begin
razm:=DBGrid1.Canvas.TextWidth(DBGrid1.Columns[i].FieldName);
DataSource1.dataset.DisableControls;
 while not DataSource1.dataset.eof do
 begin
 str:=DataSource1.DataSet.FieldByName(DBGrid1.Columns[i].FieldName).AsString;
 Razmtp:=DBGrid1.Canvas.TextWidth(str);
 if razmtp>=razm then razm:=razmtp;
 DataSource1.dataset.next;
 end;
DataSource1.dataset.First;
DataSource1.dataset.EnableControls;
DBGrid1.Columns[i].Width:=razm+6;
end;
end;


 
Dennis I. Komarov ©   (2009-07-03 12:51) [42]

а с [36] что делать будем?


 
Ega23 ©   (2009-07-03 12:53) [43]


> Вот так в итоге получилось так:


1. with form5 do  - за такое выдернуть ноги. По самые уши.
2. Циклы поменять местами. Вдруг у тебя НД пустой?


 
Dennis I. Komarov ©   (2009-07-03 13:00) [44]


> выдернуть ноги. По самые уши

погоди, не время еще :)


 
Плохиш ©   (2009-07-03 13:01) [45]


> with form5 do
>

дальше читать не стал.


 
Dennis I. Komarov ©   (2009-07-03 13:02) [46]


> Циклы поменять местами. Вдруг у тебя НД пустой?

Ну что ты в самом деле, надо так:
Пусть в DataSet 10000 записей... ;)


 
Neket   (2009-07-03 13:11) [47]

Отвечаю сначало на > with form5 do - Я делаю это все из другой формы. Как тогда правельно?

второе протестированое на 26746 записей и 8 столбцов работает неощутимо по времени.
И я ещё раз говорю если вам мой вариант ненравиться тогда я с удовольствием выслушаю ваш вариант.
P.S.
Вариант с фиксированной длиной столбцов непредлогать так как их число динамическое.


 
Neket   (2009-07-03 13:11) [48]


> Dennis I. Komarov ©   (03.07.09 12:51) [42]


тогда подбирать для другого ширфта значения


 
Dennis I. Komarov ©   (2009-07-03 13:20) [49]


> тогда подбирать для другого ширфта значения

Ну если ты продашь (отдашь и т.п.) некой тете Дусе, не думаешь же что она будет подбирать и тем более компилить заного. А если на одном компе работают разные люди с разными настройками среды? .........


> второе протестированое на 26746 записей и 8 столбцов работает
> неощутимо по времени.

А теперь посмотри как пошагово проходит процесс и как это можно улучшить


> И я ещё раз говорю если вам мой вариант ненравиться тогда
> я с удовольствием выслушаю ваш вариант.

А вот этого не надо... Программа нужна тебе а не кому-либо, поэтому писать тебе, а нам подсказывать...


 
Ega23 ©   (2009-07-03 13:25) [50]

Ну и, собственно, самое главное: такая "фича" не должна делаться автоматически.


 
Dennis I. Komarov ©   (2009-07-03 13:43) [51]


> Отвечаю сначало на > with form5 do - Я делаю это все из
> другой формы. Как тогда правельно?

А не модальной ли часом?


 
Dennis I. Komarov ©   (2009-07-03 16:27) [52]


> А не модальной ли часом?

Я про Форм5...



Страницы: 1 2 вся ветка

Текущий архив: 2009.08.30;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.018 c
2-1246553624
fics)
2009-07-02 20:53
2009.08.30
Indy IdTelnet


1-1212768112
San1712
2008-06-06 20:01
2009.08.30
Как передать данные в процедуру ?


2-1246133770
aligator2008
2009-06-28 00:16
2009.08.30
richedit


2-1246181883
Новичок
2009-06-28 13:38
2009.08.30
Закладки TabSheet


6-1205841824
rosl
2008-03-18 15:03
2009.08.30
отключить сетевые подключения