Страница 2 из 3
Возращаясь к вопросу о прозводительности.
Добавлено: 27 апр 2010, 18:34
Ivan
Здравствуйте.
leon писал(а):Сейчас внимательнее посмотрел на отчёт и понял, что считается-то неправильно, т.к. значение должно считаться для каждой группы, а оно получается считается один раз для всего DataTable, а потом значение просто подставляется для каждой группы. Это неверно. Может быть на другое событие вешать пересчёт переменных Func1, Func2 и т.д.?
Мы оптимизировали тот отчет, который вы нам прислали в качестве примера. В этом отчете итоги рассчитываются именно так, с помощью функций Totals.Sum(). Мы уже обратили ваше внимание, что эта функция рассчитывает сумму сразу для всего датабэнда
без учета групп. Для подсчета суммы по группе надо использовать просто функцию Sum(). Для более конкретных рекомендаций что и где заменить пожалуйста вышлите ваш более свежий пример отчета с данными, так как ваши данные на скриншотах сильно отличаются от высланных нам.
Спасибо.
Возращаясь к вопросу о прозводительности.
Добавлено: 28 апр 2010, 04:58
Леонид
А, вот оно что. Понятно. Но всё дело в том, что я прислал Вам конечную форму версию отчёта.
И конструкцию Totals.Sum() я использовал только потому, что при написании в выражении IIF просто Sum (как Вы рекомендовали), то генератор отчётов говорит "The name 'Sum' does not exist in the current context". Возможно это связано с тем, что Sum стоит в операторе Div() и интерпретатор как-то неверно его понимает.
Чтобы проверить то, о чём я толкую, возьмите первоначальную версию отчёта (опубликованную в первом посте) и попробуйте изменить один (из четырёх текстбоксов), и измените такую конструкцию {IIF(Sum(DataBand1, qrMain.SALES_PLAN) <= 0, 0, Div(Totals.Sum(DataBand1, qrMain.AMOUNT_OUT) - Totals.Sum(DataBand1, qrMain.AMOUNT_RET), Totals.Sum(DataBand1, qrMain.SALES_PLAN)) * 100)} на такую {IIF(Sum(DataBand1, qrMain.SALES_PLAN) <= 0, 0, Div(Sum(DataBand1, qrMain.AMOUNT_OUT) - Sum(DataBand1, qrMain.AMOUNT_RET), Sum(DataBand1, qrMain.SALES_PLAN)) * 100)}. То есть, просто уберите в одном из текстбоксов все слова Totals и попробуйте запустить генерацию отчётов, увидите exception'ы.
Возращаясь к вопросу о прозводительности.
Добавлено: 03 май 2010, 14:04
Ivan
Здравствуйте.
leon писал(а):А, вот оно что. Понятно. Но всё дело в том, что я прислал Вам конечную форму версию отчёта.
И конструкцию Totals.Sum() я использовал только потому, что при написании в выражении IIF просто Sum (как Вы рекомендовали), то генератор отчётов говорит "The name 'Sum' does not exist in the current context". Возможно это связано с тем, что Sum стоит в операторе Div() и интерпретатор как-то неверно его понимает.
Мы определили причину бага - это проблемы со вложенностью функций. Сейчас занимаемся исправлением.
Как временное решение, откажитесь от оператора Div, замените простым делением. Т.е. вместо
Код: Выделить всё
{IIF(Sum(DataBand1, qrMain.SALES_PLAN) <= 0, 0, Div(Totals.Sum(DataBand1, qrMain.AMOUNT_OUT) - Totals.Sum(DataBand1, qrMain.AMOUNT_RET), Totals.Sum(DataBand1, qrMain.SALES_PLAN)) * 100)}
используйте следующую конструкцию:
Код: Выделить всё
{IIF(Sum(DataBand1, qrMain.SALES_PLAN) <= 0, 0, (Sum(DataBand1, qrMain.AMOUNT_OUT) - Sum(DataBand1, qrMain.AMOUNT_RET)) / Sum(DataBand1, qrMain.SALES_PLAN) * 100)}
Спасибо.
Возращаясь к вопросу о прозводительности.
Добавлено: 03 май 2010, 18:35
Jan
Здравствуйте,
leon писал(а):А, вот оно что. Понятно. Но всё дело в том, что я прислал Вам конечную форму версию отчёта.
И конструкцию Totals.Sum() я использовал только потому, что при написании в выражении IIF просто Sum (как Вы рекомендовали), то генератор отчётов говорит "The name 'Sum' does not exist in the current context". Возможно это связано с тем, что Sum стоит в операторе Div() и интерпретатор как-то неверно его понимает.
Чтобы проверить то, о чём я толкую, возьмите первоначальную версию отчёта (опубликованную в первом посте) и попробуйте изменить один (из четырёх текстбоксов), и измените такую конструкцию {IIF(Sum(DataBand1, qrMain.SALES_PLAN) <= 0, 0, Div(Totals.Sum(DataBand1, qrMain.AMOUNT_OUT) - Totals.Sum(DataBand1, qrMain.AMOUNT_RET), Totals.Sum(DataBand1, qrMain.SALES_PLAN)) * 100)} на такую {IIF(Sum(DataBand1, qrMain.SALES_PLAN) <= 0, 0, Div(Sum(DataBand1, qrMain.AMOUNT_OUT) - Sum(DataBand1, qrMain.AMOUNT_RET), Sum(DataBand1, qrMain.SALES_PLAN)) * 100)}. То есть, просто уберите в одном из текстбоксов все слова Totals и попробуйте запустить генерацию отчётов, увидите exception'ы.
Произвели доработку парсера выражений. Должно стать лучше. Проверьте пожалуйста билд от 3 мая.
Спасибо.
Возращаясь к вопросу о прозводительности.
Добавлено: 04 май 2010, 05:49
Леонид
Ребята, доброе утро!
В общем, попробовал поставил новый релиз от 3-го мая. Результат оказался весьма неоднозначным - не запускается ни один отчёт, которых мы уже сделали 61 штуку, т.к. близится релиз проекта.
В любом из отчётов пишет кучу ошибок, все они следующего содержания: "Reports.Report не содержит определение Text96_GetValue_End", "Reports.Report не содержит определение Text99_GetValue_End" и т.д., это для рассматриваемого отчёта Дебиторская задолженность (свёрнутая)".
Однако в других пишет тоже самое для Text##_GetValue_End, где Text## - название текстбокса.
Проверьте пожалуйста парсер ещё раз, т.к. он пока не работает. Пришлось откатиться назад до версии 2010.1.700.0.
Да, и ещё вопрос, Вы написали, чтобы я попробовал, но не указали, что конкретно там сделать, а именно, писать в текстбоксах просто Sum, либо так и оставить Totals.Sum?
Возращаясь к вопросу о прозводительности.
Добавлено: 04 май 2010, 06:35
Jan
Здравствуйте,
Извините за неудобство. Скачайте пожалуйста еще раз последний билд.
Спасибо.
Возращаясь к вопросу о прозводительности.
Добавлено: 04 май 2010, 12:10
Леонид
Да, попробовал.
Но теперь выдаёт такое сообщение: "The type Reports.Report already contains definition for Text104_Sum2", и так для каждого текстбокса, содержащего строку с оператором Sum.
Причём, я ещё раз подчеркну, что проблема возникает именно в операторе Div. Да, теперь парсер не ругается на Sum, но при рендеринге отчёта вылетает exception, который я описал выше.
Что делать с этим? Может попробуете у себя тот же отчёт, можете стереть во всех 4-х колонках все значения и написать следующие GroupFooterBand2, т.е. для самого верхнего:
Для "Обор": {IIF(Sum(DataBand1, qrMain.AMOUNT_OUT) == 0, 0, Div(Div(Sum(DataBand1, qrMain.DEBT_START) + Sum(DataBand1, qrMain.DEBT_END), 2) * Var_k, Sum(DataBand1, qrMain.AMOUNT_PAY)))}.
Для "% плана продаж": {IIF(Sum(DataBand1, qrMain.SALES_PLAN) <= 0, 0, Div(Sum(DataBand1, qrMain.AMOUNT_OUT) - Sum(DataBand1, qrMain.AMOUNT_RET), Sum(DataBand1, qrMain.SALES_PLAN)) * 100)}
Для "% плана оплат": {IIF(Sum(DataBand1, qrMain.PAYMENTS_PLAN) <= 0, 0, Div(Sum(DataBand1, qrMain.AMOUNT_PAY), Sum(DataBand1, qrMain.PAYMENTS_PLAN)) * 100)}
Для "% отгр. к пред. году": {IIF((Sum(DataBand1, qrMain.AMOUNT_PREV_OUT) - Sum(DataBand1, qrMain.AMOUNT_PREV_RET)) <= 0, 100, Div((Sum(DataBand1, qrMain.AMOUNT_OUT) - Sum(DataBand1, qrMain.AMOUNT_RET)), (Sum(DataBand1, qrMain.AMOUNT_PREV_OUT) - Sum(DataBand1, qrMain.AMOUNT_PREV_RET)) * 100))}
Возращаясь к вопросу о прозводительности.
Добавлено: 05 май 2010, 05:02
Jan
Здравствуйте,
Упустили этот момент. Билд перезалили еще раз. Большое спасибо за помощь в исправлении ошибки.
Спасибо.
Возращаясь к вопросу о прозводительности.
Добавлено: 05 май 2010, 07:14
Леонид
Убрал все слова Totals перед Sum - всё заработало. 5 страниц рендерятся 2-3 сек., а 67 страниц (которые рендерились 16 минут) теперь рендерятся 13-14 секунд - это действительно отличный результат. :grinder:
Думаю, что вопрос закрыт. Отличная работа. Благодарю за помощь! :biggrin:
Возращаясь к вопросу о прозводительности.
Добавлено: 05 май 2010, 08:03
Andrew
Отлично! Удачного вам дня!