PDA

Просмотр полной версии : при формировании отчета вылетает ошибка


csistra
27.02.2012, 12:20
При формировании внешнего отчета вылетает ошибка
http://saveimg.ru/show-image.php?id=dbb18c943b0e4f3deef474a1a08151d9
причем ошибка на нескольких ТС на остальных такой беды не наблюдаю.
сам отчет выглядит так:
http://saveimg.ru/show-image.php?id=75e841c5f798ea4a8da230316561f45c
подскажите где может скрыватся ошибка не соображу что то....

SK
27.02.2012, 13:58
Скорее всего, у Вас где-то свои формулы и N/A не воспринимается, естественно, как число в математическом действии, а проверки на N/A вместо числа у Вас нет.

csistra
27.02.2012, 13:59
Есть проверки на ноль, как на n\a делать не знаю.

SK
27.02.2012, 15:06
Есть проверки на ноль, как на n\a делать не знаю.
А в чем разница ???

csistra
28.02.2012, 08:08
Да ни в чем впринципе. Просто почему то на ноль делить оно не умеет.
А я не соображу как сделать пропуск строки или значения, если значение некоректное.

SK
28.02.2012, 08:56
Да ни в чем впринципе. Просто почему то на ноль делить оно не умеет.
А я не соображу как сделать пропуск строки или значения, если значение некоректное.
Имею ввиду: в чем разница в скрипте проверки ? Проверять на 0 или на N/A ?
Расчет идет в скрипте (на вкладке Код) с вызовом в ячейке через функцию или в самой ячейке ?

Проверка на 0 в ячейке для примера:
[IIF(<Dataset1."DISTANCE"> > 0, 100*<Dataset1."M1_FUEL"> / <Dataset1."DISTANCE">, 'деление на 0')]

csistra
28.02.2012, 11:25
Проверка в самой ячейке у меня.
Там где есть действия в принципе проверка то есть....
Но проверка идет как и увас в примере..... где еще может заползти ошибка пока не найду (

SK
28.02.2012, 13:54
Ну такую же проверку на N/A надо сделать, видимо.
Судя по характеру ошибки. "Строка не может быть приведена к типу дабл."

Присылайте файл отчета - посмотрю. Лично.

csistra
29.02.2012, 07:25
знать бы еще вашу почту :) в профиле что то не нашел.

Phantom
29.02.2012, 07:37
знать бы еще вашу почту в профиле что то не нашел.
шлите на support с пометкой для SK.

csistra
29.02.2012, 09:03
Ок ушло.

SK
29.02.2012, 09:50
Это составной отчет или переделанный отчет "Рейсы" ?

csistra
29.02.2012, 13:45
составной

SK
29.02.2012, 13:47
составной
Ценю лаконичный ответ. А дальше ? (из чего состоит ?)

csistra
01.03.2012, 09:39
Ценю лаконичный ответ. А дальше ? (из чего состоит ?)
http://saveimg.ru/show-image.php?id=5427c5d45a32e23fac9b0892d177dab1
так будет проще думаю.

SK
01.03.2012, 15:03
Вооот...

А теперь взглянем на Ваши итоговые формулы типа:

[AVG(IIF(<Dataset1."DISTANCE"> > 0, 100*<Dataset1."PARK_CNTR"> / <Dataset1."DISTANCE">, 'N/A'))]

Получается что ?
Если Dataset1."DISTANCE" меньше или равно 0, то в функцию усреднения AVG в качестве значения подставляется текстовая строка 'N/A'...
И что функция AVG должна с ней поделать ???

csistra
01.03.2012, 16:20
тогда либо необходимо дописать пропуск такого значения. либо подставить значение ноль.
Как делать пропуск незнаю :)

SK
01.03.2012, 16:47
тогда либо необходимо дописать пропуск такого значения. либо подставить значение ноль.
Как делать пропуск незнаю :)
Если подставите ноль, то среднее все равно будет считаться не совсем так, как надо.
Ведь по сути делится сумма по строкам на количество строк, а Вам надо, чтобы в количество строк не попали строки, где N/A (или 0) - зависит от задачи.

Решение см.: http://www.fast-report.com/ru/forum/index.php?showtopic=3075

csistra
02.03.2012, 07:25
Ок спс ушел читать.

SK
02.03.2012, 07:55
Ну, резюмируя: AVG использовать не получится. Хотя, как пишут в форуме по ссылке выше, было бы удобно, если бы был параметр, задающий признак строк, которые надо пропускать (исключить из подсчета AVG).

csistra
02.03.2012, 08:56
В таком случае остается прописать это упрощенными мат действиями.

Добавлено через 51 секунду
попробовать хотя бы.

Добавлено через 10 секунд
или найти другой путь...

SK
02.03.2012, 09:18
В смысле ? На форуме дан исчерпывающий ответ, как заменить AVG.
SUM по нужной колонке и разделить на количество строк за исключением строк с N/A.

csistra
02.03.2012, 09:21
не читале еще , только начал, отвлекся на соседнюю тему. Сейчас прочту попробую отпишусь. Спасибо за помошь

storm
02.03.2012, 11:13
[SUM(IIF(<Dataset1."DISTANCE"> > 0, 100*<Dataset1."PARK_CNTR"> / <Dataset1."DISTANCE">, 0)) / COUNT(IIF(<Dataset1."DISTANCE"> > 0, 1, 0))]
как-то так попробуйте, должно заработать, только проверьте синтаксис, чтобы был правильный и скобочек хватало

csistra
02.03.2012, 12:49
Если Dataset1."DISTANCE" меньше или равно 0, то в функцию усреднения AVG в качестве значения подставляется текстовая строка 'N/A'...
Очень правильное замечание.
Несуществующее значение по сути тот же ноль. Можно конечно и оспорить, но попробую так.
Заменил N\a на 0. ошибка пропала.

Добавлено через 53 секунды
[SUM(IIF( > 0, 100* / , 0)) / COUNT(IIF( > 0, 1, 0))]
попробовал... что то непошло... ошибок нет но и поле где стоит формула пустое..
разбираюсь .

Добавлено через 4 минуты
но тогда возникает другая проблема.
если в ячейке стоят 0, то avr в итоге показывает лажу. Сейчас подумаю как еще извратится.

Добавлено через 15 минут
подумал... блин . не получается никак по другому.
буду разбиратся с этой формулой от Storm тогда

SK
02.03.2012, 13:27
Очень правильное замечание.
Несуществующее значение по сути тот же ноль. Можно конечно и оспорить, но попробую так.
Заменил N\a на 0. ошибка пропала.
Проблема в том, что в этом случае функция для некоторых ситуаций не работает как надо.
Вы всего лишь устранили причину вылета с ошибкой, но то ли Вы получили, что должно быть ?

Смотрите: AVG делит сумму по столбцу на количество строк.

Допустим, имеем таблицу:
1. N/A (0)
2. 200
3. 150
4. N/A (0)
5. N/A (0)
6. N/A (0)
7. 50
8. N/A (0)
9. 100
10. N/A (0)

По логике работы AVG с превращением N/A в 0:
Среднее = (0+200+150+0+0+0+50+0+100+0)/10=500/10=50

По логике исключения N/A:
Среднее = (200+150+50+100)/4=500/4=125

Что скажете ?

SK
02.03.2012, 13:30
подумал... блин . не получается никак по другому.
буду разбиратся с этой формулой от Storm тогда
На форуме было предложено 1-в-1, как предложил Storm.

csistra
02.03.2012, 14:34
глова не варит к концу дня вот и весь ответ.
Я проверил AVG и пришел к такому же выводу как и вы.
Только вот неполучается у меня. руки кривые и гоова пустая. Сейчас выдохнцу и еще раз попробую.

storm
05.03.2012, 05:08
На форуме было предложено 1-в-1, как предложил Storm.
форум не читал, а формула элементарно суммирует все "нормальные элементы" и кол-во "нормальных элементов" и делит одно на другое

csistra,
попробуйте вывести отдельно две колонки первая сумма из моей формулы, вторая - кол-во элементов и посмотрите, что где не так

csistra
05.03.2012, 06:26
нормальных элементов"
может из-за того что я поменял n\a на пустое место ?
Сегодня попробую.

storm
05.03.2012, 06:40
может из-за того что я поменял n\a на пустое место ?
Сегодня попробую.
что-то я не понял, так вы пробовали ту формулу, что я вам выше привел?

csistra
06.03.2012, 06:38
Да пробовал.
Она результатов не дает. Т.е. ошибок не выскакивает и в ячейке где ставлю формулу пустое значение. просто пусто.

storm
06.03.2012, 06:40
csistra,
попробуйте вывести отдельно две колонки первая сумма из моей формулы, вторая - кол-во элементов и посмотрите, что где не так
так пробовали?

csistra
06.03.2012, 13:11
[COUNT(IIF(<Dataset1."DISTANCE"> > 0, 1, 0))]
возвращает пустое значение.

SK
06.03.2012, 14:02
COUNT не должен возвращать пустое значение, если в отчете есть хоть 1 строка.

Правда, здесь должен быть не COUNT, а [SUM(IIF(<Dataset1."DISTANCE"> > 0, 1, 0))]
Дал же ссылку на форум...

csistra
06.03.2012, 14:47
да было бы еще куча времени чтобы во все вникнуть, я блин второй день пытаюсь занятся этим и только сяду как всех распирает блин отвлекать.

storm
07.03.2012, 04:15
Правда, здесь должен быть не COUNT, а [SUM(IIF( > 0, 1, 0))]
правильно говорите Константин, ошибся чуток)), писал "на коленке" так сказать

SK
07.03.2012, 06:09
да было бы еще куча времени чтобы во все вникнуть, я блин второй день пытаюсь занятся этим и только сяду как всех распирает блин отвлекать.
Теперь Вы лучше понимаете: как работают программеры. :ha:

csistra
07.03.2012, 08:26
не издевайтесь.
Дополнительно вопрос.
у меня в ячейке считает : [IIF(<Dataset1."M1_P_HOURS"> >0 , <Dataset1."M1_FUEL_PRK"> / <Dataset1."M1_P_HOURS">, '0')]
В итоговой было:
[(SUM(<Dataset1."M1_FUEL_PRK">) / SUM( <Dataset1."M1_P_HOURS">))]
по формуле что вы посоветовали я накалякал:
[IIF(SUM(IIF(<Dataset1."M1_FUEL_PRK"> >0,1,0),0 ) <0 ,0,SUM(<Dataset1."M1_FUEL_PRK">/<Dataset1."M1_P_HOURS">) / SUM(IIF(<Dataset1."M1_P_HOURS"> >0,1,0), 0))]
Слишком уж много всего получается в итоговой строке для простого мат действия.
Возможно объявить переменную для значения :
[IIF(<Dataset1."M1_P_HOURS"> >0 , <Dataset1."M1_FUEL_PRK"> / <Dataset1."M1_P_HOURS">, '0')]
Тогда в простых ячейках будет не эта формула, а только переменная.
И в итоговой будет тогда все очень понятно

SK
07.03.2012, 08:52
Ничего не понял.
Что считаете-то ? Сумма частных не равна частному сумм.

csistra
07.03.2012, 09:19
Как объявить переменную и присвоить ей выражение в виде формулы ?

Добавлено через 9 минут
Есть у вас нормальный мануал на внешние отчеты ?
на сайте, я что не скачаю так не то... может я не то качаю ?

SK
07.03.2012, 09:31
Если речь про мануал по системе программирования собственных шаблонов, то:

http://www.fast-report.com/pbc_download/fr4.6_help_doc_rus.zip

csistra
07.03.2012, 10:36
вообще жесть...
начитался теперь еще хуже стало.

Добавлено через 27 минут
Ссылка на список переменных отчета хранится в свойстве TfrxReport.Variables.
Не нашел у себя в отчете такое ... все истыкал :(

SK
07.03.2012, 10:46
Это программное свойство, с которым можно работать через вкладку "Код", а не окошко в редакторе.

csistra
07.03.2012, 11:04
объявляю переменную в коде
frxReport1.Script.Variables['My Variable'] := 'test';
соответственно меня посылает подальше с таким синтаксисом, хотя в мане написано именно так. наверное я или не туда пихаю это или вообще .


Добавлено через 4 минуты


Добавлено через 7 минут
все запутался совсем. пойду подумаю.

csistra
11.03.2012, 07:08
Обчитался мануалов.
разломал весь шаблон.
Начал все переделывать. Возник еще один вопрос не нашел в манах пока что.
Как вывести отдельной ячейкой значение задаваемого периода отчета.
Т.е. если я выбилраю отчет с 1 марта по 10 марта. Чтобы отображалось в ячейке
1.03-10.03 ?
Подскажите плз кто знает.

storm
11.03.2012, 07:39
frxReport1.Script.Variables['My Variable'] := 'test';
я так понимаю, что вы прочитали не то руководство, читайте руководство пользователя, там по шаблонам все подробно расписано

Как вывести отдельной ячейкой значение задаваемого периода отчета.
в "Руководство по работе с программой.doc" написано об этом

Всегда доступные поля: StartTime – Начальное время периода, за которое формируется отчет
EndTime – Конечное время периода, за которое формируется отчет

выводятся просто в квадратных скобках, пример: [StartTime] вывод начала периода

csistra
12.03.2012, 06:12
Нашел наконец то как объявить переменную.
С выводом даты тоже разобрался, но почемуто при выражении [StarTime] [EndTime]
start выводит значение формата дд.мм.гг. чч.мм а EndTime выводит значение формата дд.мм.гг.
не нашел пока еще как выводить только даты.

storm
12.03.2012, 06:32
start выводит значение формата дд.мм.гг. чч.мм а EndTime выводит значение формата дд.мм.гг.
они выводят в одинаковом формате, возможно у вас ячейка недостаточной ширины для того, чтобы влезло время

не нашел пока еще как выводить только даты.
самый простой метод, это обрезать все лишнее [Copy(<StartTime>,1,8)]

csistra
12.03.2012, 12:46
Спасибо помогло. Ковыряюсь дальше .

csistra
13.03.2012, 08:08
http://saveimg.ru/show-image.php?id=fa1cb47e80ca96d8fe9a569bc0ef23de
Вот такая беда у меня получилась.
Линия выделяет каждую вторую строку. В результате она почему то рвет данные. Никак не найду как поправить. Подскажите плз если знаете.

Добавлено через 1 минуту
затупил.. надо было линию на задний план поставить и все.

Добавлено через 28 минут
Еще один момент никак не победю.
Объявляю переменную называю её ost_na_100
Выражение переменной
IIF(<Dataset1."DISTANCE"> > 0, 100*<Dataset1."PARK_CNTR"> / <Dataset1."DISTANCE">, '0')
В отчете в ячейке пишу :
[ost_na_100]
в результате вместо значения при формированиии появляется:
IIF(<Dataset1."DISTANCE"> > 0, 100*<Dataset1."PARK_CNTR"> / <Dataset1."DISTANCE">, '0')
а не цифровое значение.
Что я не так сделал ?

storm
13.03.2012, 08:55
как вы присваиваете это значение? скорее всего вы в виде строки значение передаете, поэтому переменная и возвращает строку, а не результат вычисления, в общем шаблон нужно глядеть

csistra
13.03.2012, 09:21
http://saveimg.ru/show-image.php?id=ce1ca565f1d5d082468419609c695e3d
http://saveimg.ru/show-image.php?id=2e8a2e7a752e809d228f6990b9c6b727
http://saveimg.ru/show-image.php?id=960234a3976508ea43a3c529319547a2
Вот скрины. Как задаю переменную, что пишу в ячейке, что получается.
Если надо пришлю шаблон. напишите адрес.

storm
13.03.2012, 09:27
лучше задавайте выражение для этой переменной во вкладке КОД
или попробуйте поставить в квадратных скобках выражение для переменной

csistra
13.03.2012, 09:40
http://saveimg.ru/show-image.php?id=e09531386e73cd7c389ff82c173a75ad
прописал... но видимо неправильно. ...

storm
13.03.2012, 10:06
почитайте внимательно руководство пользователя FastReports - там есть раздел про глобальные переменные и как с ними работать

csistra
13.03.2012, 10:38
Не нашел ничего про глобальные переменные....
Зато вот ошибка появилась.
В закладке код ничего не менял.
http://saveimg.ru/show-image.php?id=c0ef84588a598fdb696369ce881e9940

storm
13.03.2012, 10:59
Не нашел ничего про глобальные переменные....
Руководство пользователя - раздел "Скрипт" - пункт "Обращение к переменным из списка переменных отчета"

csistra
14.03.2012, 06:13
Вроде разобрался..... Спасибо.
Скорее всего шаблон из которого я начал делать отчет сильно перекручен.
Ибо при внесении любых изменений в код, начинает глючить насмерть все.
Я создал новый, туда форму скопировал, прописал переменную и начало работать.
Только вот все расползается в форме. Буду собирать в кучу.

csistra
15.03.2012, 07:27
Подскажите плз еще один момент.
Значение выражения больше 100.
Как при сумировании ячеек при получении среднего значения ограничить отбор в сумму >0 <100 . Я вот не соображу ...
Зачем это нужно. Если фильтры настроены неправильно, в сутки у тс получается куча фиксаций остановок (тс в боксе стоит). Из-за этого в отчет выходит цифра 2000 например. И соответственно среднее число остановок на 1 тс получается бредовая цифра...

storm
15.03.2012, 07:51
точно также добавить проверку, как это делалось для нулевых значений

csistra
15.03.2012, 12:47
Cделал...немного через одно место но сделал.
Псб. Все отчет наконец то заработал как я хочу. Осталось проверить все ли я правильно сделал...
Пока вспомнил.
А можно сделать чтобы при формировании 1 отчета получалось сразу несколько отчетов на несколько страниц ?
Сильно это сложно ?

storm
15.03.2012, 12:58
А можно сделать чтобы при формировании 1 отчета получалось сразу несколько отчетов на несколько страниц ?
вопрос нуждаеца в пояснении

csistra
16.03.2012, 08:19
Хорошо.
Начинаю формировать 1 составной отчет. название не имеет значения.
После формирования у меня в окне просмотра получается не один отчет а сразу два, или три. Например отчет рейсы и следом тут же отчет о топливе.

storm
16.03.2012, 09:16
для этого и сделаны составные отчеты, то есть в одном отчете вы можете вывести любой набор данных по простым отчетам