Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.13;
Скачать: CL | DM;

Вниз

Подсчет среднего значения с нулевыми числами   Найти похожие ветки 

 
kyn66 ©   (2009-10-23 09:53) [0]

Сталкнулся с данной ситуацией, пытаясь установить в футоре DBGridEh подсчет среднего значения по столбцу. Вот ведь как оно получается, имеется два ряда чисел:

5      5
4      0
3      3
2      0
1      1
=      =
3     1.8

Но для реальной отчетности нужны реальные данные среднего значения, без нулей. Это как-то решается? Может есть какой дополнительный параметр для компонента или ....?


 
Медвежонок Пятачок ©   (2009-10-23 09:56) [1]

для реальной отчетности нужны реальные данные среднего значения

1.8 это и есть реальное среднее значение


 
kyn66 ©   (2009-10-23 10:11) [2]


> 1.8 это и есть реальное среднее значение


но значения нужны без нулей. Через SQl это сделать было бы просто, но в данном случае компонент сам берет на себя работу по подсчету общих строк.


 
Сергей М. ©   (2009-10-23 10:12) [3]


> Это как-то решается?


Это решается исключением ненужных значений из ряда перед расчетом


 
Медвежонок Пятачок ©   (2009-10-23 10:12) [4]

ну так убери из грида строки с нулями


 
Сергей М. ©   (2009-10-23 10:13) [5]


> компонент сам берет на себя работу по подсчету общих строк


Не нравится логика компонента - реализуй свою логику, в чем проблема-то ?


 
sniknik ©   (2009-10-23 10:16) [6]

подозреваю, что если бы значение было null, то тогда бы не посчиталось, а 0 это вполне нормальное реальное значение. то что кто то решил, что оно для него нереально ничего не меняет в общей логике.


 
Сергей М. ©   (2009-10-23 10:19) [7]


> подсчету общих строк


Каких таких "общих" ?
С кем/чем они "общие" ?


 
kyn66 ©   (2009-10-23 10:19) [8]


> ну так убери из грида строки с нулями


Их нельзя убрать. Вот картинка с реальными данными http://yurec66.narod.ru/Vopros/gof.jpg . Там по суммам должны быть подсчитаны средние значения, а по кол-вам суммированные. А получается так, что замесяц движение где было, где небыло и средние значение получаются неверные...


 
Медвежонок Пятачок ©   (2009-10-23 10:25) [9]

считай не гридом.
потому что грид считает по правилам арифметики.


 
brother ©   (2009-10-23 10:25) [10]

я не понял, что смущает?


 
Сергей М. ©   (2009-10-23 10:27) [11]


> средние значение получаются неверные


Не выдумывай.
Среднее арифметическое - оно и в Африке среднее арифметическое.


 
brother ©   (2009-10-23 10:32) [12]

сам то понимаешь, чего хочешь? вопрос переформулируй


 
kyn66 ©   (2009-10-23 10:39) [13]


> Среднее арифметическое - оно и в Африке среднее арифметическое.


Не, ну я согласен впринципе. Значит нужно футор убирать. Просто хотелось чтобы красиво грид смотрелся, как бы в  законченном виде :)


 
brother ©   (2009-10-23 10:40) [14]

имхо автор партизан... и шифрами говорит...)


 
Сергей М. ©   (2009-10-23 10:49) [15]


> нужно футор убирать


Это уж тебе самому решать, убирать его или не убирать.


> я согласен впринципе


Если согласен, тогда что за ерунду ты городишь про "реальные значения" ?
те самые нули в тот самый период абсолютно реально влияют на статистику. Если ты выкинешь эти нули, то тогда ты обязан выкинуть из периода и соотв.дни, иначе коту под хвост такая статистика)


 
kyn66 ©   (2009-10-23 10:50) [16]


> сам то понимаешь, чего хочешь? вопрос переформулируй


А что не понятного? Подсчитать среднее по столбцу без учета нулей


 
brother ©   (2009-10-23 10:52) [17]

у тебя с математикой туго?
(5 + 3 + 1)/3 = 3


 
Сергей М. ©   (2009-10-23 10:55) [18]


> Подсчитать среднее по столбцу без учета нулей


Тогда это будет не в среднем за месяц, а в среднем за период, сотоящий из дней в течение этого месяца,  в которые было ненулевое движение.

А это два разных отчета, которые ты сейчас пытаешься замесить в одну кучу, рискую ввести юзера в заблуждение.


 
brother ©   (2009-10-23 10:56) [19]

Сергей, твой телепатор еще работает?)


 
kyn66 ©   (2009-10-23 10:57) [20]


> Если ты выкинешь эти нули, то тогда ты обязан выкинуть из
> периода и соотв.дни, иначе коту под хвост такая статистика)


В представленной картинке (http://yurec66.narod.ru/Vopros/gof.jpg) кокретно заострим внимание на графе "Реализация за месяц" . Там статистика показана не по дням, а по товару конкретно. И если реализации за месяц небыло, то зачем включать нули в общую сумму реализации по остальным позициям. Здесь есть здравый смысл. Может просто действия компонента в данном случае не совсем подходят.


 
Сергей М. ©   (2009-10-23 10:57) [21]


> brother ©   (23.10.09 10:52) [17]


Почему туго ? Он на 5 делит, а не на 3, ибо в ряду 5 значений. И получает как и положено 1,8


 
kyn66 ©   (2009-10-23 11:00) [22]


> у тебя с математикой туго?(5 + 3 + 1)/3 = 3


Это ты не мне скажи, а компоненту, чтобы нуливыкинул из столбца.


 
brother ©   (2009-10-23 11:02) [23]

> чтобы нуливыкинул из столбца.

не заполняй значение


 
Сергей М. ©   (2009-10-23 11:04) [24]


> Здесь есть здравый смысл


Нет тут никакого здравого смысла.


 
kyn66 ©   (2009-10-23 11:25) [25]


> Нет тут никакого здравого смысла.


Тяжело объяснить , если не понятна задача. Представьте, что стоит такая задача, подсчитать среднее, без учета нулей, задействовав стандартный механизм компонента. Нужно глянуть в исходнике как там идет обработка.


 
brother ©   (2009-10-23 11:31) [26]

> Тяжело объяснить , если не понятна задача.

если тебе задача не понятна, какие ТЗ ты нам предъявляешь?


 
kyn66 ©   (2009-10-23 11:36) [27]


> если тебе задача не понятна, какие ТЗ ты нам предъявляешь?


Это не мне, а тебе не понятно. Сколько раз объяснять нужно? См. основной вопрос! Но для реальной отчетности нужны реальные данные среднего значения, без нулей.


 
brother ©   (2009-10-23 11:39) [28]

а ты еще и не доволен? я умываю руки, тебе смотреть [6] [18]


 
Сергей М. ©   (2009-10-23 11:49) [29]


> kyn66 ©   (23.10.09 11:25) [25]


Вообще-то пользователь в здравом рассудке вполне резонно должен полагать, что если в футере написано "ИТОГО", то в соответствующих колонках там фигурируют итоговые кол-ва и суммы по всей показанной гридом номенклатуре.
А ты там вместо ожидаемых итоговых количеств и сумм безо всяких на то комментариев хочешь вывести статистические расчеты типа среднеарифметических значений, да еще и никак не информируя пользователя о  "нестандартной" логике этих расчетов.


 
kyn66 ©   (2009-10-23 11:52) [30]


> а ты еще и не доволен? я умываю руки, тебе смотреть [6]
> [18]


Да без обид, просто устал объяснять, что иногда ставятся разные задачи и все под одну логику не подведешь.

Я вот прошелся по исходнику в режиме отладки и вышел вот на эту строку http://yurec66.narod.ru/Vopros/rez.jpg . Явно понятно, что компонент подсчитывает все строки не Null. Но потом будет гемор с этими неопределенными значениями в дальнейших подсчетах. Exeption вываливать будут, было уже такое , тока уже не помню в какой ситуации, пока явно ноль не поставишь вместо пустого значения.


 
kyn66 ©   (2009-10-23 11:53) [31]


> Сергей М.


Если бы проблема была только в слове "ИТОГО"....


 
Сергей М. ©   (2009-10-23 12:02) [32]


> Если бы проблема была только в слове "ИТОГО"


Действительно - если бы)


 
Anatoly Podgoretsky ©   (2009-10-23 12:04) [33]


> Тяжело объяснить , если не понятна задача. Представьте,
> что стоит такая задача, подсчитать среднее, без учета нулей,
>  задействовав стандартный механизм компонента. Нужно глянуть
> в исходнике как там идет обработка

Там реальное значение, а не пустые значения и механизм не только стандартный, но еще и соответствует математике.


 
Anatoly Podgoretsky ©   (2009-10-23 12:06) [34]

А если там будут значения -3, тогда что, это же уже не реальное значение и оборота тоже нет, есть минусование.


 
Anatoly Podgoretsky ©   (2009-10-23 12:08) [35]

АVG определен так Sum(Values)/Count(Values) и все
Все значения должный учитываться. NULL отсутствие значения.


 
kyn66 ©   (2009-10-23 12:11) [36]

Ура, решение найдено !!!

Немного подправил в модуле компонента 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

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


 
kyn66 ©   (2009-10-23 12:12) [37]


> А если там будут значения -3, тогда что, это же уже не реальное
> значение и оборота тоже нет, есть минусование.


Да, интересно, про минусовое значение я как-то не думал...


 
Сергей М. ©   (2009-10-23 12:17) [38]

Проще и правильней поставить на форму кнопулю, включающую/отключающую фильтрацию НД на предмет включения/исключения из avg-расчетов позиций, имеющих нуль в поле, участвующем в расчете.

Тогда и коверкать чужой компонент не придется)


 
sniknik ©   (2009-10-23 12:21) [39]

> И не будет это наглостью менять чужой компонент?
это будет глупостью... т.к. с этим ты гораздо скорее словишь логическую ошибку на другом отчете, чем с испугавшим тебя null AV. потому как null вполне нормально, стандартными методами обрабатывается, и это значение, а не адрес метода/т.д..


 
kyn66 ©   (2009-10-23 12:33) [40]


> Проще и правильней поставить на форму кнопулю, включающую/отключающую
> фильтрацию НД на предмет включения/исключения из avg-расчетов
> позиций, имеющих нуль в поле, участвующем в расчете.Тогда
> и коверкать чужой компонент не придется)


Это самое лучшее было бы решение, только как эту кнопульку связать с компонентом? Это типа если бы у компонента было дополнительное свойство "Учитывать нулевые значения". А с временной доработкой компонента конечно не выход, я согласен. Мало ли придется переустанавливать с архивов и т.д.


 
Сергей М. ©   (2009-10-23 12:42) [41]


> как эту кнопульку связать с компонентом?


С каким ?


 
Юрий Зотов ©   (2009-10-23 12:42) [42]

Если я правильно понял задачу, то вот псевдокод:

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:43) [43]

Или в select добавить условие: where Field2 <> 0.


 
kyn66 ©   (2009-10-23 12:44) [44]


> С каким ?


Ну мы вроде речь о DBGridEh ведем...


 
Сергей М. ©   (2009-10-23 12:45) [45]


> Юрий Зотов ©   (23.10.09 12:42) [42]

Ему надо

> задействовав стандартный механизм компонента


 
kyn66 ©   (2009-10-23 12:46) [46]


> Или в select добавить условие: where Field2 <> 0.


Я уже писал, что приприменении SQl проблем небыло бы. Здесь нужно управиться средствами самого компонента.


 
Сергей М. ©   (2009-10-23 12:48) [47]


> мы вроде речь о DBGridEh ведем


А он данные откуда берет ? Не с луны же они в него падают)
Берет он их из НД, который у тебя, очевидно, формируется в рез-те скуль-запроса.
Так что же мешает добавить в текст скуль-запроса соответствующую WHERE-статью, если кнопуля нажата, и убрать эту статью, если отжата ? Ну и соотв-но переоткрыть НД ?


 
Сергей М. ©   (2009-10-23 12:51) [48]


> Здесь нужно управиться средствами самого компонента


В ТЗ прямо так и написано ?
Т.е. любое обращение к объекту Grid.DataSource.DataSet сурово карается по закону ТЗ-пИсца ?


 
kyn66 ©   (2009-10-23 12:55) [49]


> В ТЗ прямо так и написано ?


а ТЗ-пИсцу без разницы как это будет реализовано. Я больше за фейс программы отвечаю. Чтобы наглядно все видно было юзеру на экране.
http://yurec66.narod.ru/Vopros/rez2.jpg


 
sniknik ©   (2009-10-23 12:56) [50]

> Ну и соотв-но переоткрыть НД ?
а зачем? просто наложить фильтр на уже полученные данные.


 
kyn66 ©   (2009-10-23 12:57) [51]


> Берет он их из НД, который у тебя, очевидно, формируется
> в рез-те скуль-запроса.


Если я отфильтрую нулевые данные по одному столбцу, то в другом пропадут строки с ненулевыми данными. Если по товару небыло реализации, то это не значит, что по нему небыло прихода.


 
kyn66 ©   (2009-10-23 13:04) [52]

Через SQl я буду формировать окончательные групповые отчеты по всем  отделениям(на картинке инфа по одному отделению). А это рабочая информация. Строки содержат как вх. остаток, получено, реализовано и исх. остаток вот в рабочем порядке они и заполняются данными.


 
Сергей М. ©   (2009-10-23 13:06) [53]


> kyn66 ©   (23.10.09 12:57) [51]


И что ?
Напиши на форме, мол, это отчет по таким-то товарам за такой-то период, имевшим движение в течение отч.периода


 
Сергей М. ©   (2009-10-23 13:15) [54]

Вот хоть убей - ума не приложу, кому и зачем может понадобиться среднее арифметическое суммы прихода и/или расхода..

Или у тебя в заказчиках бизнес-аналитики ?)


 
Sergey13 ©   (2009-10-23 13:19) [55]

> [36] kyn66 ©   (23.10.09 12:11)
> (хотя может это и протеворечит математической логике, не
> я ставлю задачи, руководство)

Могу посоветовать сообщить руководству (лучше письменно), что противоречие отчетности математике - прямой путь на допрос в прокуратуру.
Потому, что руководство может сказать в прокуратуре, что "мы акаедмиев не кончали и у нас по цифирям главный kyn66, к нему и вопросы".


 
kyn66 ©   (2009-10-23 13:23) [56]


> Вот хоть убей - ума не приложу, кому и зачем может понадобиться
> среднее арифметическое суммы прихода и/или расхода..


МЫ сейчас начнем обсуждать другую тему... Как видно из картинки, в списке гофроящик. Они могут быть одного номинала(типоразмер) но с разной розничной ценой. Все зависит от закупки. Поэтому руководство и интересует средняя сумма на разные виды ящиков. Так понятно?


 
Сергей М. ©   (2009-10-23 13:24) [57]


> Sergey13 ©   (23.10.09 13:19) [55]


Угу. В прокуратуре тоже люди далеко не больные на голову, и под цифирью в графе "ИТОГО" подразумевают именно "ИТОГО", а не какое-то там хитромудрое среднеарифметическое)


 
kyn66 ©   (2009-10-23 13:27) [58]

В превом столбце указана розничная цена на все типоразмеры ящиков. А в течение месяца не по всем была реализация. Вот и интересует на какую среднюю сумму реализовано гофроящиков.


 
Сергей М. ©   (2009-10-23 13:31) [59]


> руководство и интересует средняя сумма на разные виды ящиков


А что, руководство разве не интересует общая сумма поставок и реализаций за период тех самых картинных гофроящиков ящиков, коль скоро тебе была дана команда на размещение в форме в графе "ИТОГО" среднеарифметического вместо суммы ?


 
Sergey13 ©   (2009-10-23 13:32) [60]

Плюсом к [55] Sergey13 ©   (23.10.09 13:19)

Если ты один раз продал вагон чего то, то по твоей отчетности выдет, что ты весь год продавал по вагону в месяц, и тем самым скрыл от государства 11/12 налогов. Статья лет на 10 наверное тянет, а то и более. 8-)


 
Сергей М. ©   (2009-10-23 13:33) [61]


> интересует на какую среднюю сумму реализовано гофроящиков


Ну и оформи этот отчет в виде отдельной формы !
Зачем пихать на одну и ту же форму отчеты в различных разрезах ?


 
kyn66 ©   (2009-10-23 13:50) [62]


> оманда на размещение в форме в графе "ИТОГО" среднеарифметического
> вместо суммы ?


Вот далось тебе это слово ИТОГО. Представь, что нет его там


 
kyn66 ©   (2009-10-23 13:53) [63]


> Зачем пихать на одну и ту же форму отчеты в различных разрезах
> ?


Пока об отчетах речь не идет. Изначально на форму был положен компонент DBgridEh для предоставления данных по определенному критерию и использована функция этого грида показывать в футоре суммы и средние значения. И все

Кстати, поля кол-во - суммируются, а лишь по суммам идуд средние значения.


 
Сергей М. ©   (2009-10-23 13:54) [64]


> Представь, что нет его там


А что там тогда вместо него будет ?)


 
Сергей М. ©   (2009-10-23 13:56) [65]


> Пока об отчетах речь не идет


То что ты продемонстрировал на картинке - это тот же самый отчет, только интерактивный.


 
kyn66 ©   (2009-10-23 14:40) [66]


> То что ты продемонстрировал на картинке - это тот же самый
> отчет, только интерактивный.


Я бы так не сказал, это просто данные в том виде, в котором юзер должен видеть на своем экране монитора, чтобы вносить дополнения в список, редактировать и т.д.


 
Сергей М. ©   (2009-10-23 14:54) [67]

По барабану где и в каком виде он должен их видеть, все равно это отчет.


> вносить дополнения в список, редактировать и т.д.


Это и есть то что подразумевается под интерактивным отчетом.


 
kyn66 ©   (2009-10-23 15:04) [68]

Связался с атором компонента. Он посоветовал вот что:

В DataSet"e можно создать калькулируемое поле в котором для нулей
устанавливать значение Null. И по нему подсчитывать.

Я так и сделал, однако появилась ошибка http://yurec66.narod.ru/Vopros/erobor.jpg .Полю OborotTblFNotNull присвоен тип Variant


 
kyn66 ©   (2009-10-23 15:16) [69]

Вот отсюда идет ошибка
goAvg:
  begin
     if (FDataSet.FieldByName(Item.FieldName).IsNull = False) then
       Inc(Item.FNotNullRecordCount);
    Item.FSumValueAsSum := Item.FSumValueAsSum +
           FDataSet.FieldByName(Item.FieldName).AsFloat;

Т.е. получается противоречие. Спtрва проверяется что значение поля не Null. Если истинно, счетчик увеличивается. И идет далее, где это Null-поле приводится к типу Float.


 
Anatoly Podgoretsky ©   (2009-10-23 15:27) [70]

> kyn66  (23.10.2009 15:04:08)  [68]

Ты что творишь, полю типа Double пытаешься присвоить NULL


 
kyn66 ©   (2009-10-23 15:30) [71]


> Ты что творишь, полю типа Double пытаешься присвоить NULL


ДА не Double оно совсем, а Variant(+ калькулируемое). А Variant потому, что будет принимать 2 значения и Null и Double


 
Anatoly Podgoretsky ©   (2009-10-23 15:47) [72]

> kyn66  (23.10.2009 15:30:11)  [71]

Я сообщения читать умею.


 
Amoeba ©   (2009-10-23 17:36) [73]


> brother ©   (23.10.09 10:40) [14]
>
> имхо автор партизан... и шифрами говорит...)

Так это завсегда с ним было ... И чего тут нового ...


 
kyn66 ©   (2009-10-23 17:40) [74]


> Так это завсегда с ним было ... И чего тут нового ...


У кого есть желание - тот поймет!

ВЫяснилось новое обстоятельство, что скорее всего проблема в ADS, поля таблицы не хотят принимать значение Null. Может кто работает с ADS?


 
kyn66 ©   (2009-10-23 18:16) [75]

Уважаемые коллеги. В конце концов решение найдено с подсказки автора компонента. Если вдруг кто сталкнется с такой ситуацией:
1) Использование DBGridEh
2) Поиск среднего значения среди ненулевых чисел, в списке которых есть нули

Решение:
т.к. грид осекает при подсчете среднего значения поля со значением Null, то  нужно создать Calculated поле, с типом данных таким как и основное и присвоить ненулевые значения. В футоре в качестве параметра FieldName указать это созданное поле.

Проверено, все работает. Всем спасибо, вопрос закрыт.



Страницы: 1 2 вся ветка

Текущий архив: 2009.12.13;
Скачать: CL | DM;

Наверх




Память: 0.67 MB
Время: 0.014 c
15-1255532875
БарЛог
2009-10-14 19:07
2009.12.13
Программа для массового сжатия изображений


15-1255863244
POOP
2009-10-18 14:54
2009.12.13
Если в bat файле


6-1207912827
Juri
2008-04-11 15:20
2009.12.13
SOAP


2-1256655721
Nutz
2009-10-27 18:02
2009.12.13
Сохранение в Unicode


2-1256057370
Инна
2009-10-20 20:49
2009.12.13
GDI как "затенить" заданый прямоугольник ?