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

Вниз

Как узнать колличество записей в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.006 c
15-1246260569
d@nger
2009-06-29 11:29
2009.08.30
Хост принудительно разрывает соединение....


15-1245862036
Nic
2009-06-24 20:47
2009.08.30
Открывается ли сайт


2-1246386849
AndrewG
2009-06-30 22:34
2009.08.30
Modal


15-1246515248
Лев
2009-07-02 10:14
2009.08.30
Помогите с SQL


4-1216031319
Dash Rendar
2008-07-14 14:28
2009.08.30
Как запустить свое приложение вместо проводника?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский