Суть проблемы: есть объект "Рабочий лист", у него есть деталь "Действие" с колонками "Плановая дата" (DateTime), "Дата результата" (DateTime), "Результат" (Guid). Нужно в реестре отобразить все рабочие листы, где есть действия с плановой датой = DateTime.Now, либо просроченные действия, то есть действия, у которых плановая дата DateTime.Now и Результат = Guid.Empty. При этом, рабочие листы с просроченными действиями должны отражаться вверху списка.
Не понимаю пока, как написать такой фильтр. Помогите примерами...
Нравится
Добрый день, Алексей.
Подобную фильтрацию можно осуществить пользовательскими средствами. Вам следует использовать два агрегирующих фильтра объединенных логическим ИЛИ:
Выбрать колонку по обратной связи (на примере деталь Активности раздела контактов):
Сформировать условия:
А как-то можно посмотреть какой код при этом генерится? У меня кастомная страница с реестром, и никаких визуальных фильтров на ней нет.
Алексей, вот пример простого фильтра для реестра.
Размещать на PageLoadComplete.
var structure = Page.DataSource.CurrentStructure; var filter = structure.CreateFilterWithParameters(Page.DataSource.Schema, FilterComparisonType.Contain, "Name", "a"); structure.Filters.Add(filter); Page.DataSource.LoadRows(); return true;
С простыми-то фильтрами проблем нет:)
А в моем случае, вместо "Name" что нужно поставить? Да и тип фильтра будет явно не "Contain". У класса DataSourceStructure есть метод CreateDataSourceFilterExistsExpression, подозреваю, что копать надо в его сторону, но в SDK никаких примеров его использования я не нашел. Вопрос открыт...
Вот так делал я:
filters = structure.CreateFiltersGroup("CustomFilters", LogicalOperationStrict.And); if (!string.IsNullOrEmpty(address)) { var addressfilters = structure.CreateFiltersGroup("CustomAddressFilters", LogicalOperationStrict.Or); addressfilters.Add(structure.CreateFilterWithParameters(dataSource.Schema, FilterComparisonType.Contain, "[AccountAddressCLADR:Account].AddressString", address)); addressfilters.Add(structure.CreateFilterWithParameters(dataSource.Schema, FilterComparisonType.Contain, "[Contact:Account].[ContactAddressCLADR:Contact].AddressString", address)); filters.Add(addressfilters); } Page.TreeGrid.Clear(); if (filters.Count > 0) { structure.Filters.Add(filters); dataSource.LoadRows(); Page.TreeGrid.RefreshData(); }