Форум: "Начинающим";
Текущий архив: 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