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

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

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

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

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

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

Нравится

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

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

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

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

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

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

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

	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

Однако, можно попробовать использовать подзапрос в фильтре, который будет повторять основной запрос, но уже с фильтром.

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

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

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

Спасибо!

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

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

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

Включаются фильтры следующим образом:

var SelectedIDs = GetAttribute(Self , 'SelectedIDs');
ApplyQueryIncludeFilter(dsReportAccountBalanceHeader.SelectQuery, Filters, 'IDs', SelectedIDs);

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

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

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);
	}
}

Но так не работает. Что нужно писать вместо Dataset.SelectQuery.Filters?

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

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

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

т.е:

 ApplyDatasetIncludeFilter(Dataset, 'AccountTypeIDs', AccountTypeIDs, true)

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

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

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

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

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

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

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

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

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

Есть:

Dataset.SelectQuery.Items(0).Filters

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

На

Dataset.SelectQuery.Items(1).Filters

Пишет List index out of bounds (1)

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

var Select1 = Dataset.SelectQuery.ItemsByCode('Select1');
var Filters = Select1.Filters;

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

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

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

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

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

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

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