![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подсчет среднего значения с нулевыми числами [D7, WinXP]
kyn66 © (2009-10-23 09:53:00)Сталкнулся с данной ситуацией, пытаясь установить в футоре DBGridEh подсчет среднего значения по столбцу. Вот ведь как оно получается, имеется два ряда чисел:
5 5
4 0
3 3
2 0
1 1
= =
3 1.8
Но для реальной отчетности нужны реальные данные среднего значения, без нулей. Это как-то решается? Может есть какой дополнительный параметр для компонента или ....?
Sergey13 (2009-10-23 13:19:00) [21]> [36] kyn66 © (23.10.09 12:11)
> (хотя может это и протеворечит математической логике, не
> я ставлю задачи, руководство)
Могу посоветовать сообщить руководству (лучше письменно), что противоречие отчетности математике - прямой путь на допрос в прокуратуру.
Потому, что руководство может сказать в прокуратуре, что "мы акаедмиев не кончали и у нас по цифирям главный kyn66, к нему и вопросы".
Сергей М. (2009-10-23 13:15:00) [22]Вот хоть убей - ума не приложу, кому и зачем может понадобиться среднее арифметическое суммы прихода и/или расхода..
Или у тебя в заказчиках бизнес-аналитики ?)
Сергей М. (2009-10-23 13:06:00) [23]
> kyn66 © (23.10.09 12:57) [51]
И что ?
Напиши на форме, мол, это отчет по таким-то товарам за такой-то период, имевшим движение в течение отч.периода
kyn66 (2009-10-23 13:04:00) [24]Через SQl я буду формировать окончательные групповые отчеты по всем отделениям(на картинке инфа по одному отделению). А это рабочая информация. Строки содержат как вх. остаток, получено, реализовано и исх. остаток вот в рабочем порядке они и заполняются данными.
kyn66 (2009-10-23 12:57:00) [25]
> Берет он их из НД, который у тебя, очевидно, формируется
> в рез-те скуль-запроса.
Если я отфильтрую нулевые данные по одному столбцу, то в другом пропадут строки с ненулевыми данными. Если по товару небыло реализации, то это не значит, что по нему небыло прихода.
sniknik (2009-10-23 12:56:00) [26]> Ну и соотв-но переоткрыть НД ?
а зачем? просто наложить фильтр на уже полученные данные.
kyn66 (2009-10-23 12:55:00) [27]
> В ТЗ прямо так и написано ?
а ТЗ-пИсцубез разницы как это будет реализовано. Я больше за фейс программы отвечаю. Чтобы наглядно все видно было юзеру на экране.
http://yurec66.narod.ru/Vopros/rez2.jpg
Сергей М. (2009-10-23 12:51:00) [28]
> Здесь нужно управиться средствами самого компонента
В ТЗ прямо так и написано ?
Т.е. любое обращение к объекту Grid.DataSource.DataSet сурово карается по закону ТЗ-пИсца ?
Сергей М. (2009-10-23 12:48:00) [29]
> мы вроде речь о DBGridEh ведем
А он данные откуда берет ? Не с луны же они в него падают)
Берет он их из НД, который у тебя, очевидно, формируется в рез-те скуль-запроса.
Так что же мешает добавить в текст скуль-запроса соответствующую WHERE-статью, если кнопуля нажата, и убрать эту статью, если отжата ? Ну и соотв-но переоткрыть НД ?
kyn66 (2009-10-23 12:46:00) [30]
> Или в select добавить условие: where Field2 <> 0.
Я уже писал, что приприменении SQl проблем небыло бы. Здесь нужно управиться средствами самого компонента.
Сергей М. (2009-10-23 12:45:00) [31]
> Юрий Зотов © (23.10.09 12:42) [42]
Ему надо
> задействовав стандартный механизм компонента
kyn66 (2009-10-23 12:44:00) [32]
> С каким ?
Ну мы вроде речь о DBGridEh ведем...
Юрий Зотов (2009-10-23 12:43:00) [33]Или в select добавить условие: where Field2 <> 0.
Юрий Зотов (2009-10-23 12:42:00) [34]Если я правильно понял задачу, то вот псевдокод:
Sum1 := 0;
Sum2 := 0;
N := 0;
DataSet.First;
while not DataSet.Eof do
if DataSet.Field[2].AsInteger <> 0 then
begin
Inc(Sum1, DataSet.Fields[1].AsInteger);
Inc(Sum2, DataSet.Fields[2].AsInteger);
Inc(N)
end;
if N <> 0 then
begin
Average1 := Sum1 / N;
Average2 := Sum2 / N
end
else
begin
Average1 := 0;
Average2 := 0
end;
Сергей М. (2009-10-23 12:42:00) [35]
> как эту кнопульку связать с компонентом?
С каким ?
kyn66 (2009-10-23 12:33:00) [36]
> Проще и правильней поставить на форму кнопулю, включающую/отключающую
> фильтрацию НД на предмет включения/исключения из avg-расчетов
> позиций, имеющих нуль в поле, участвующем в расчете.Тогда
> и коверкать чужой компонент не придется)
Это самое лучшее было бы решение, только как эту кнопульку связать с компонентом? Это типа если бы у компонента было дополнительное свойство "Учитывать нулевые значения". А с временной доработкой компонента конечно не выход, я согласен. Мало ли придется переустанавливать с архивов и т.д.
sniknik (2009-10-23 12:21:00) [37]> И не будет это наглостью менять чужой компонент?
это будет глупостью... т.к. с этим ты гораздо скорее словишь логическую ошибку на другом отчете, чем с испугавшим тебя null AV. потому как null вполне нормально, стандартными методами обрабатывается, и это значение, а не адрес метода/т.д..
Сергей М. (2009-10-23 12:17:00) [38]Проще и правильней поставить на форму кнопулю, включающую/отключающую фильтрацию НД на предмет включения/исключения из avg-расчетов позиций, имеющих нуль в поле, участвующем в расчете.
Тогда и коверкать чужой компонент не придется)
kyn66 (2009-10-23 12:12:00) [39]
> А если там будут значения -3, тогда что, это же уже не реальное
> значение и оборота тоже нет, есть минусование.
Да, интересно, про минусовое значение я как-то не думал...
kyn66 (2009-10-23 12:11:00) [40]Ура, решение найдено !!!
Немного подправил в модуле компонента DBSumLst строки относительно 0:
было
...
goAvg:
begin
if (FDataSet.FieldByName(Item.FieldName).IsNull = False) then
Inc(Item.FNotNullRecordCount);
Item.FSumValueAsSum := Item.FSumValueAsSum + FDataSet.FieldByName(Item.FieldName).AsFloat;
end;
...
после модернизации
goAvg:
begin
if (FDataSet.FieldByName(Item.FieldName).IsNull = False) AND
(FDataSet.FieldByName(Item.FieldName).Value <> 0) then
Inc(Item.FNotNullRecordCount);
Item.FSumValueAsSum := Item.FSumValueAsSum + FDataSet.FieldByName(Item.FieldName).AsFloat;
end;
И результат получился такой как требуется по задаче (хотя может это и протеворечит математической логике, не я ставлю задачи, руководство)
В итоге получились вот такие данные
http://yurec66.narod.ru/Vopros/rez2.jpg
Честно говоря это задача поставлена только сейчас, а изменятся требования? Опять перекомпилировать компонент. И не будет это наглостью менять чужой компонент? Хотя эта версия с открытыми кодами, нужно с автором переговорить.