Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подсчет среднего значения с нулевыми числами [D7, WinXP]


Страницы:   1 2 3 4

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

Честно говоря это задача поставлена только сейчас, а изменятся требования? Опять перекомпилировать компонент. И не будет это наглостью менять чужой компонент?  Хотя эта версия с открытыми кодами, нужно с автором переговорить.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо