Сложная фильтрация в реестре

Суть проблемы: есть объект "Рабочий лист", у него есть деталь "Действие" с колонками "Плановая дата" (DateTime), "Дата результата" (DateTime), "Результат" (Guid). Нужно в реестре отобразить все рабочие листы, где есть действия с плановой датой = DateTime.Now, либо просроченные действия, то есть действия, у которых плановая дата DateTime.Now и Результат = Guid.Empty. При этом, рабочие листы с просроченными действиями должны отражаться вверху списка.

Не понимаю пока, как написать такой фильтр. Помогите примерами...

Нравится

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

Добрый день, Алексей.

Подобную фильтрацию можно осуществить пользовательскими средствами. Вам следует использовать два агрегирующих фильтра объединенных логическим ИЛИ:

Выбрать колонку по обратной связи (на примере деталь Активности раздела контактов):

Сформировать условия:

А как-то можно посмотреть какой код при этом генерится? У меня кастомная страница с реестром, и никаких визуальных фильтров на ней нет.

Алексей, вот пример простого фильтра для реестра.
Размещать на 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();		
}
Показать все комментарии