![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TpFIBDataSet: RecordCount, глюк? [Firebird 2.0]
Megabyte © (2006-12-20 13:20:00)Мне надо узнать кол-во возвращаемых строк, чтобы задать длину дин. массива.
У Датасета есть 2 свойства:
RecordCount - заметил глюк, что всегда почему-то возвращает 1!
RecordCountFromSrv - не совсем понимаю, чем отличается от пред. свойства и что обозначает(м.б. кто подскажет). В другом проекте оно показывало мне нужное число.
В новом проекте: делаю запрос через ИБЭксперт - показывает 2097
Делаю тот же запрос на клиенте - TpFIBDataSet.RecordCountFromSrv выдает 11811
Как так?
з.ы. Короче, мне надо получить число строк! Остальное, если можете, подскажите...
Megabyte (2006-12-20 16:26:00) [1]Всем спасибо.
Виталий Панасенко (2006-12-20 15:57:00) [2]
> Megabyte © (20.12.06 14:36) [18]
> Ладно. Мысль вашу вроде понял. Осталось понять, как делать
> М-Д у TpFIBDataSet...
> Спасибо.
На сайте www.devrace.com/ru естьподборка статей по этому поводу. Относительно RecordCount - установи PrepareOptions-psAskRecordCount=True
Anatoly Podgoretsky (2006-12-20 15:22:00) [3]> Desdechado (20.12.2006 15:08:20) [20]
Компоненты которые вместо этого использующие RecordCount, который какая то химера.
Desdechado (2006-12-20 15:08:00) [4]а я бы хранимку написал
Anatoly Podgoretsky © (20.12.06 14:02) [10]
> Вот это уже по теории, а не по реализации того или другого компонента.
Ну-ка, ну-ка, это какие такие компоненты вернут для SELECT Count(*) результат отличный от теории?
Sergey13 (2006-12-20 14:44:00) [5]> [18] Megabyte © (20.12.06 14:36)
Что бы сделать М-Д у любых датасетов, надо что бы в подчиненном датасете в запросе было параметром ключевое поле главного датасета. При перемещении по главному ДС меняется параметр и переоткрывается детальный ДС. Но можно и съэмулировать это дело открыв сразу все интересующие данные и вместо переоткрытия детали просто смешаться на нужное значение мастер-поля и циклом (пока оно не сменилось) бегать по нему. Или, всесто позиционирования, можно отфильтровать по мастер-полю.
Megabyte (2006-12-20 14:36:00) [6]Ладно. Мысль вашу вроде понял. Осталось понять, как делать М-Д у TpFIBDataSet...
Спасибо.
Sergey13 (2006-12-20 14:26:00) [7]> [15] Megabyte © (20.12.06 14:18)
> Не понимаю, каким макаром мне их увязывать?
> select Pm.phone_model_id, Pm.phone_model_title, Pl.part_description, count(*)
> from phone_model
> select Pm.phone_model_title, count(R.repair_id)
> from phone_model
По наименованию вроде некузяво связывать, хотя если они уникальны, то ничего страшного. Но можно и ID во второй запрос добавить и по нему сделать М-Д связку, или локейтиться на худой конец по нему во втором датасете, или фильтровать по нему. Масса вариантов.
iva (2006-12-20 14:21:00) [8]
> Чтобы все это увязать, все вычисления делаю на клиенте.
А почему не стороне сервера?
Megabyte (2006-12-20 14:18:00) [9]
> Sergey13 © (20.12.06 14:09) [14]
Массивы проще увязывать, чем датасеты?
Не понимаю, каким макаром мне их увязывать?
1запрос: ID_модели, Название_модели, Название_запчасти, Кол-во запчастей.
select Pm.phone_model_id, Pm.phone_model_title, Pl.part_description,
count(*)
from phone_model Pm join Repairs R on Pm.phone_model_id = R.phone_model_id
join parts_on_repair Pr on Pr.repair_id = R.repair_id
join part_list Pl on Pr.part_list_id = Pl.part_list_id
group by Pm.phone_model_title, Pl.part_description, Pm.phone_model_id
2запрос: ID_модели, Кол-во моделей.
select Pm.phone_model_title, count(R.repair_id)
from phone_model Pm join Repairs R on Pm.phone_model_id = R.phone_model_id
group by Pm.phone_model_title
1 задача - связать эти 2 запроса:
ID_модели, Название_модели, Кол-во моделей, Название_запчасти, Кол-во запчастей, т.к. потом надо будет сделать вычисляемое поле: Кол-во запчастей/Кол-во моделей.
Что значит в данном случае связать датасеты и зачем, не понимаю. Да и это только часть операций.
Sergey13 (2006-12-20 14:09:00) [10]> [8] Megabyte © (20.12.06 13:56)
> Чтобы все это увязать, все вычисления делаю на клиенте.
Массивы проще увязывать, чем датасеты?
Anatoly Podgoretsky (2006-12-20 14:04:00) [11]> Megabyte (20.12.2006 14:00:09) [9]
Не обязан и тебе много примеров привели, почему ты можешь получить цифры с потолка
Ega23 (2006-12-20 14:02:00) [12]После Open сделай Last. Потом смотри RecordCount
Megabyte (2006-12-20 14:02:00) [13]
> Megabyte © (20.12.06 13:48) [5]
Я может что не понимаю... Сделал предварительно TpFIBDataSet.fetchAll, а потом TpFIBDataSet.RecordCount, кот вернул число, равное TpFIBDataSet.RecordCountFromSrv,т.е. 11811.
НО это не верное число! IBExpert выдает другое число. Не понимаю, почему?
Сорри, был не прав, после фетча на клиенте TpFIBDataSet.RecordCount выдает нужное мне число 2097!
Но все же происхождение TpFIBDataSet.RecordCountFromSrv = 11811 мне не понятно.
Всем спасибо.
Anatoly Podgoretsky (2006-12-20 14:02:00) [14]> Desdechado (20.12.2006 13:54:07) [7]
Вот это уже по теории, а не по реализации того или другого компонента.
Megabyte (2006-12-20 14:00:00) [15]
> Desdechado © (20.12.06 13:54) [7]
> IBExpert выдает другое число.
Потому как ты недофетчил в IBExpert'е.
Вот если сделаешь SELECT Count(*), то увидишь реальное кол-во.
У меня в запросе уже есть агрегатное поле, где используется count.
Если перейти на последнюю строку, разве не показывает реальное кол-во записей(справа вверху)?
з.ы.Можно, конечно. задавать статически большую длину массива, или в цикле +1 делать, но это имхо не правильно...
Megabyte (2006-12-20 13:56:00) [16]
> > Мне надо узнать кол-во возвращаемых строк, чтобы задать длину дин. массива.
перегружаеш данные из рекортсета в динамический массив? а зачем собственно? может не надо?
Анализ данных. Это только часть дела. У меня уже есть 4 запроса, кот. в один сделать невозможно.
Вот полностью задача: Надо расчитывать возможный расход деталей для ремонта телефонов. На каком основании делаю: получаю в одном запросе количество(count) всех деталей для каждой из моделей(1 запрос); потом получаю количество всех моделей(2-й запрос), кот. ремонтировали; считаю расход деталей на единицу каждой модели; далее смотрю, сколько аппаратов находится на приеме(3-й запрос) и сколько деталей есть на складе(4-й запрос); делаю расчет, сколько деталей возможно понадобится для ремонта всем аппаратов, находящихся на приемке; если это число больше, чем на складе, вечером отправляется сигнализирующий об этом отчет на почту.
Чтобы все это увязать, все вычисления делаю на клиенте.
> Ega23 © (20.12.06 13:45) [4]
BLOB-поля в НД присутствуют?
Нет
Desdechado (2006-12-20 13:54:00) [17]> IBExpert выдает другое число.
Потому как ты недофетчил в IBExpert'е.
Вот если сделаешь SELECT Count(*), то увидишь реальное кол-во.
Anatoly Podgoretsky (2006-12-20 13:52:00) [18]> Megabyte (20.12.2006 13:48:05) [5]
А какая разница верное или нет, справка говорит, что это нормально.
Megabyte (2006-12-20 13:48:00) [19]Я может что не понимаю... Сделал предварительно TpFIBDataSet.fetchAll, а потом TpFIBDataSet.RecordCount, кот вернул число, равное TpFIBDataSet.RecordCountFromSrv,т.е. 11811.
НО это не верное число! IBExpert выдает другое число. Не понимаю, почему?
Ega23 (2006-12-20 13:45:00) [20]BLOB-поля в НД присутствуют?