В отчете при выводе строки Masterdata и строки Группировки нужно вывести процент от общих итогов и итогов по группировки. Возможно ли это?
Или обратиться к уже выведенной ячейке отчета.
primer.doc

Нравится

25 комментариев

Обратитесь к значению самого Memo.
В том Memo где хотите вывести процент от Итога запишите
[SummaryMemo.Value * ЗначениеПроцента]
Само значение советую вынести в системную переменную, которую считывайте в переменную отчета:

//-----------------------------------------------------------------------------
// fr_ReportOnPreviewScript
//-----------------------------------------------------------------------------
 
 
function fr_ReportOnPreview(ReportPreviewer) {
...
ReportPreviewer.Report.Attributes('ЗначениеПроцента') = GetSystemParameterValueEx('ЗначениеПроцента', false);
}

Подробнее тут

Передача параметров тут не причем. Мне необходимо при выводе строки данных знать итоги для расчета процентов (пример в прикрепленном файле).

Значит в моем предыдущем сообщении Вам нужно читать следующее :

"АльфаКрыса" написал:Обратитесь к значению самого Memo.
В том Memo где хотите вывести процент от Итога запишите
[SummaryMemo.Value * ЗначениеПроцента]

Передавать параметры, а не жестко хардкодить в отчете - это хороший тон программирования
Поясню скриншотом:
1
Базовый отчет: Campaigns\Reports\Campaigns Profitability\fr_ReportCampaignsProfitability

P.S. А где прикрепленный файл?

Прикрепленный файл в первом сообщении - primer.doc.
Хороший тон программирования это давать доступ к итогам и в начале выборки и в конце.

Здравствуйте, Владимир.

Как вариант, в sq датасета отчета можно добавить поле Count(Id), которое будет считать общие итоги. А в FastReport, с помощью агрерирующей функции, посчитать итоги по группе, разделить на поле с общим итогом, и умножить на 100.

Просмотрел прикрепленный файл, строку Итого по ответственному легко можно реализовать в FastReport,
к примеру:
К-во контрагентов это [COUNT(название DetailDataset)]
Сумма маржи [SUM(Название поля с датасета), название DetailDataset)], после чего к этим ячейкам можно получить доступ так как я писал ранее, так как это есть Memo.
Я вижу это так : MasterDataset - это датасет ответственных, подчиненный DetailDataset - датасет самой таблицы по каждому из ответственных.
По сути FastReport сам делает запросы на Count и SUM с датасетов.

Для АльфаКрыса: лучше смотреть надо - итоги по ответственному там уже есть.
(И Memo это твой родственник?)

Добрый день, Дмитрий. Спасибо за проявленный интерес к теме.
Можно конечно в sq внести подзапрос SUM(Marga), но при задавании условий возникает проблема - нужно выбирать по ответственному (он есть в строке) и по периоду, который выбирает пользователь при формировании отчета.

Владимир, здравствуйте.

Добавьте и включите в данный подзапрос также фильтры. Параметры используйте те, которые уже существуют (дата, ответственный).

Добрый день, Дмитрий.

Ничего не понял.

Наводящий вопрос вы написали "в sq датасета отчета" - но у меня это два разных сервиса
SelectQuery и DBDataset. (версия 3.2.0.81)

Фильтр пользователь выставляет при начале работы с отчетом и каким образом передать его в SelectQuery?

Здравствуйте.

Раз окно фильтрации работает, значит параметры передаются корректно в сервис select query. Значит их можно использовать для нескольких фильтров, в т.ч. в подзапросе для подсчета общих итогов.

DBDataset - это и есть датасет.
SelectQuery - это сервис выборки данных, которая потом(выборка) будет хранится в датасете (DBDataset).

Добрый день, Дмитрий.
Я не знаю как пользоваться параметрами из DBDataset в SelectQuery.

Посмотрел в Profiler при работе отчета - это @P2 и @P3.
Сделаль подзапрос в SelectQuery
(
SELECT SUM(Marga)
FROM tbl_Opportunity AS Opportunity_Marga
WHERE Opportunity_Marga.ActualCloseDate>=@P2 AND Opportunity_Marga.ActualCloseDate<=@P3 AND Opportunity_Marga.OwnerID = tbl_Opportunity.OwnerID
)

Но теперь не открывается сервис отчета.
Пишет -
Невозможно редактировать сервис 'Common\Medinskiy\Report_Client_XYZ\fr_Report_Client_XYZ'. Ошибка открытия источника данных "ds_Report_Client_XYZ".
Оригинальное сообщение об ошибке: Необходимо объявить скалярную переменную "@P2"

Здравствуйте, Владимир.

Просто откройте сервис SelectQuery для отчета и перенесите (создайте аналогичные) фильтры Where для главного запроса в подзапрос:

1

Добрый день, Дмитрий.

Этого сделать нельзя. Установку фильтров мы получаем в момент нажатия кнопки ОК в окне формирования фильтров в отчете.
Я так понимаю кода скрипта в SelectQuery нет.
Если я не прав будьте добры пример для выделенного участка

Здравствуйте, Владимир.

Дело в том что в данном окне фильтрации вы устанавливаете значение параметров для фильтров, а также включаете фильтры. Сами фильтры должны присутствовать в сервисе selectQuery для отчета.

Вы можете предоставить сервисы, которые используются при построении отчета?

Добрый день, Дмитрий.

С удовольствием предоставляю сервисы.

service_report.rar

Добрый день!

Попробуйте загрузить сервисы с вложения.
Откройте отчет - Вы увидите, что в датасете добавлено новое поле Count(Количество), в котором хранится общее количество записей в выборке отчета.
Используйте его для реализации нужного Вам функционала.

Добрый день, Дмитрий.

При загрузке sq_Report_Client_XYZ.xml возникает ошибка

Он нужен для понимания?

Владимир, давайте запланируем удаленное подключение на завтра.
Пожалуйста, сообщите удобное для Вас время (можно в ЛС).

Добрый день, Дмитрий.

Если можно в 10-00 03.08.2012.

Если нет, то как вам удобнее.

Добрый день, Дмитрий.

С сожалению должен констатировать следующее.

Фильтры которые вы применили в подзапросе никакого отношения к фильтрам в отчете не имеют!!!

Фильтры AccountTypeID и DataOtchetaNotNull - постоянно действующие фильтры в selectQuery никак не завящие от выбора пользователем в отчете!

А фильтры StartDate и EndDate - это вообще технологические для быстрого построения отчета из Администратора! В рабочем режиме они вообще не работают!!!

А сервис не загружался потому что вы перевели его на версию 3.4.0.121 а у нас рабочая версия 3.2.0.81.

Владимир, доброе утро!

К сожалению не смог к Вам дозвониться.
Попробуйте следующий вариант:

в датасете отчета создайте вычисляемое поле Count. На событии OnDatasetCalcFields для датасета, пропишите следующий код:

var Count = Dataset.RecordsCount;
Dataset('Count') = Count;

И далее, добавьте данное поле в отчет.

Добрый день, Дмитрий.

И чем мне поможет количество записей в выборке?

Здравствуйте!

Насколько я понял, задача состоит в том, чтобы отобразить процентное соотношение итогов по группе, к общим итогам по выборке. С итогами по группе (detail data) мы разобрались. Вопрос был как получить итоги по выборке. Приведенный мною способ и позволяет посчитать их.

Добрый день, Дмитрий.

Вообще вопрос был совершенно в другом. Я думал вы поможете построить фильтры хотя бы на примере count(). Но ...

Всем спасибо за внимание.

Показать все комментарии