Проблема с подсчетом AVG
Наткнулся на проблему с подсчетом AVG в FR 2.51.
Когда какая нибудь строка в столбце равна null (запрос вернул null),
стандартный [AVG([ADOQV1T2T3."P1"], MasterData1)] ее учитывает.
Т.е. добавляет null и делит на число строк. А хотелось бы этот null совсем игнорировать. Т.е. брать число строк которые не null.
Как я понял единственный выход считать AVG самому, в скрипте.
Поделитесь плииз примерчиком.
Когда какая нибудь строка в столбце равна null (запрос вернул null),
стандартный [AVG([ADOQV1T2T3."P1"], MasterData1)] ее учитывает.
Т.е. добавляет null и делит на число строк. А хотелось бы этот null совсем игнорировать. Т.е. брать число строк которые не null.
Как я понял единственный выход считать AVG самому, в скрипте.
Поделитесь плииз примерчиком.
Комментарии
похоже не может конвертнуть булеву FieldIsNull в 1 или 0
IF(FieldIsNull('ADOQV1T2T3."P1"'),0,1)
чтобы проверить, как работает FieldIsNull поместите на MasterData мемку с выражением [IF(FieldIsNull('ADOQV1T2T3."P1"'),0,1)] и посмотрите, что выводит.
для проверки работы SUM без FieldIsNull, вместо FieldIsNull подставьте true.
работает. в строках где null пишет True
Когда исправляю на
[(FieldIsNull('ADOQV1T2T3."P1"'),0,1)] выдает ошибку
[IF(INT(FIELDISNULL([Table1."NAME"])), 0, 1)]
2 yarik:
Заведи 2 переменных (проинициализируй их нулями в самом начале отчёта)
Затем в обработчике MasterData.OnBeforePrint Сравнивай с нулом чё тебе надо и плюсуй к переменным сумму и кол-во.
Ну и в конце отчёта подели одну переменную на другую ...
надо в мемке для проверки написать
- это абсолютно неправильно. В FIELDISNULL передается ИМЯ ПОЛЯ, а не значение поля
правильно именно
FIELDISNULL('Table1."NAME"')
Я составил функцию с помощью "мастера" (т.е. Expression Builder ->Functions... ит.д.)
и увидите, что говорит сам Автор по этому поводу.
Вот выражение для подсчета среднего значения без учета NULL-ов.
Объясняю почему не работало раньше.
FieldIsNull почему-то всегда возвращает TRUE, если задать имя поля с использованием синонима датасета из словаря данных. Т.е. в FieldIsNull надо задавать имя поля ТОЛЬКО в таком виде <span style='font-size:14pt;line-height:100%'>DialogForm.ИМЯ_ДАТАСЕТА."ИМЯ_ПОЛЯ"</span>
Второй момент. При использовании FiledIsNull в ф-ции IF может возникать ошибка "True is not valid floating point value" или "False is not valid floating point value", если записать выражение в таком виде IF(FieldIsNull('DialogForm.ADOQV1T2T3."P1"'),0,1).
Удалось победить добавив '=true' после вызова IF, что весьма странно , т.к. FieldIsNull и так возвращает булевское значение.
Т.е. правильным использованием FieldIsNull() совместно с IF() будет следующее выражение
IF(FieldIsNull('DialogForm.ADOQV1T2T3."P1"')=true,0,1)
[SUM([ADOQV1T2T3."P1"], MasterData1) / SUM( IF(FieldIsNull('DialogForm.ADOQV1T2T3."P1"')=true,0,1), MasterData1 ) ]
заработал!!!
Всем огромное спасибо за помощь!!!
2 Andrew_Sh большой Respect!!!
2 Moderator примерчик можно и в FAQ занести, думаю проблемка распространенная.