Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.66 MB
Время: 0.08 c
15-1255594116
ocean
2009-10-15 12:08
2009.12.13
Хочу повесить программу,


2-1256592395
Евгений Р.
2009-10-27 00:26
2009.12.13
Декодирование PHP строк


2-1256322344
Pascal96
2009-10-23 22:25
2009.12.13
CopyPaste в Borland Pascal 7.0


2-1256545768
@!!ex
2009-10-26 11:29
2009.12.13
Перемещение TrackBar кликом


2-1256168975
TIF
2009-10-22 03:49
2009.12.13
Отобразить кнопку на панели задач (TaskBar)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский