итоги
Фильтры
Разработка

Фильтр по полю с итогом

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

Есть отчет, который выводит все города, и для каждого показывает количество контрагентов в этих городах.

В запросе к отчету выбирается поле AccountID с итогом количество. Нужно сделать фильтр, который отображает все города, у которых количество контрагентов больше введенного значения.

Есть идея создания поля в tbl_City и для каждого города пересчитывать и записывать значение количества городов и фильтровать уже по этому полю.

Подскажите пожалуйста, может есть более рациональное решение?

Нравится

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

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

Как вариант также можно создать в sq параметр Count, фильтр сравнения tbl_City.AccountID > :Parameter(Count)

Далее, создать собственное окно фильтрации (пример можно посмотреть здесь (во вложении первого ответа от Наталья Бондарь) и передать в sq значение введенного количества контрагентов.

Здравствуйте вы меня не совсем поняли. Каким образом можно отфильтровать по такому полю (на скриншоте).

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

Нет, в блоке WHERE нельзя применять фильтр по колонке с агрегатной функцией. Для этого используется HAVING:

[sql]
SELECT
COUNT(CAST([tbl_Account].[ID] AS VARCHAR(38))) AS [AccountCount],
tbl_City.Name
FROM
[dbo].[tbl_City] AS [tbl_City]
LEFT OUTER JOIN
[dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[CityID] = [tbl_City].[ID]
GROUP BY
tbl_City.Name
HAVING COUNT(CAST([tbl_Account].[ID] AS VARCHAR(38))) > 1
[/sql]
Однако, можно попробовать использовать подзапрос в фильтре, который будет повторять основной запрос, но уже с фильтром.

А можете поподробнее рассказать насчет подзапроса в фильтре, что-то ничего не выходит.

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

Сервис во вложении.

Спасибо!

Фильтр по количеству работает. Но мне нужно вместе с этим фильтром еще фильтры по типу контрагента и по ответственному. Сделал так:

Подскажите пожалуйста, как правильно включать фильтры подзапроса из скрипта

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

Включаются фильтры следующим образом:
[javascript]
var SelectedIDs = GetAttribute(Self , 'SelectedIDs');
ApplyQueryIncludeFilter(dsReportAccountBalanceHeader.SelectQuery, Filters, 'IDs', SelectedIDs);
[/javascript]

Также, если Вы добавите стандартное окно фильтрации в отчетах Fast Report, фильтры будут созданы и автоматически включены.

А как включить эти фильтры из собственного окна фильтрации для отчета? Думаю примерно так:
[javascript]

function fr_AccountCitiesOnPreview(ReportPreviewer) {
var DatasetNameStr = "ds_AccountsCities";
var str = ReportPreviewer.DatasetUSIList.CommaText; //в строчке ReportPreviewer.DatasetUSIList.CommaText передаются USI датасетов, через запятую
var ReportDatasetUSI = str.substr(str.indexOf(DatasetNameStr), DatasetNameStr.length);
var Dataset = ReportPreviewer.DatasetByUSI(ReportDatasetUSI);
var AccountTypeIDstr = GetAttribute(ReportPreviewer.Report,'AccountTypeIDs');
var OwnerIDstr = GetAttribute(ReportPreviewer.Report,'OwnerIDs');
var Count = GetAttribute(ReportPreviewer.Report,'Count');
var AccountTypeIDs = AccountTypeIDstr.split(',');
var OwnerIDs = OwnerIDstr.split(',');
var SelectQuery = Dataset.SelectQuery;
if (Count > 0) {
ApplyDatasetFilter(Dataset, 'Parameter', Count, true);
}
if (AccountTypeIDstr) {
ApplyQueryIncludeFilter(Dataset.SelectQuery, Dataset.SelectQuery.Filters, 'AccountTypeIDs', AccountTypeIDs);
}
if (OwnerIDstr) {
ApplyQueryIncludeFilter(Dataset.SelectQuery, Dataset.SelectQuery.Filters, 'OwnerIDs', OwnerIDs);
}
}
[/javascript]
Но так не работает. Что нужно писать вместо Dataset.SelectQuery.Filters?

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

Попробуйте функцию ApplyDatasetIncludeFilter(Dataset, FilterCode, ParamValues, Enabled, Parameters)

[javascript]
function ApplyDatasetIncludeFilter(Dataset, FilterCode, ParamValues, Enabled, Parameters) {
var Filter = GetSelectQueryFilterByCode(Dataset.SelectQuery, FilterCode);
ApplyQueryIncludeFilter(Dataset.SelectQuery, Filter.ParentFilters, FilterCode,
ParamValues, Enabled, null, Parameters);
}
[/javascript]

т.е:

[javascript]
ApplyDatasetIncludeFilter(Dataset, 'AccountTypeIDs', AccountTypeIDs, true)
[/javascript]

И проверьте, что бы в if "заходило".

В if заходит, но фильтры не срабатывают :sad:

Дмитрий, здесь нужна отладка...

Попробуйте на функции ApplyDatasetIncludeFilter(Dataset, 'AccountTypeIDs', AccountTypeIDs, true) нажать F11 в MS Visual Studio и пройтись в глубь. Попробуйте найти причину: возможно система берет "не тот" Select query (по идее их должно быть два), находит ли система в данном select query фильтр AccountTypeIDs.

Если не получится, напишите в личку время и дату когда Вам будет удобнее провести удаленное подключение для отладки.

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

По видимому он берет не "тот" SelectQuery, так как в списке фильтров при выполнении только Parmeter. А нет способа обращаться непосредственно к Subquery?

Мои попытки типа Dataset.SelectQuery.Subquery ни к чему не привели.

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

Есть:

[javascript]
Dataset.SelectQuery.Items(0).Filters
[/javascript]

Вместо Items(0), попробуйте поставить Items(1) и посмотреть что "внутри".

На
[javascript]
Dataset.SelectQuery.Items(1).Filters
[/javascript]
Пишет List index out of bounds (1)

Попробуйте в SelectQuery сервисе обозвать второй Select как Select1, и потом:

[javascript]
var Select1 = Dataset.SelectQuery.ItemsByCode('Select1');
var Filters = Select1.Filters;
[/javascript]

Бросил это занятие и сделал записью итогов в отдельное поле в таблице городов и фильтрацией по этому полю. Вопрос закрыт.

Есть другой вопрос: если во время работы с CRM открыть и закрыть отчет, то при закрытии CRM выскакивает ошибка:

В чем может быть проблема?

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

Данная ситуация воспроизводится для любого отчета? Попробуйте после открытия подождать минуту, а после закрыть. Воспроизведется ли ситуация?

Также рекомендую Вам почистить кеш и обновить используемые Вами бинарные файлы на более новую версию, направив запрос на support@terrasoft.ru.

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