Здравствуйте!
Есть отчет, который выводит все города, и для каждого показывает количество контрагентов в этих городах.
В запросе к отчету выбирается поле AccountID с итогом количество. Нужно сделать фильтр, который отображает все города, у которых количество контрагентов больше введенного значения.
Есть идея создания поля в tbl_City и для каждого города пересчитывать и записывать значение количества городов и фильтровать уже по этому полю.
Подскажите пожалуйста, может есть более рациональное решение?
Нравится
Здравствуйте.
Как вариант также можно создать в 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 "заходило".
Дмитрий, здесь нужна отладка...
Попробуйте на функции 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.