Вопрос

Настройка фильтра по датам

Всем доброго времени суток.

Версия 7.11.

Есть типовой фильтр периода:

var periodFilter = this.Terrasoft.createFilterGroup();
periodFilter.logicalOperation = Terrasoft.LogicalOperatorType.AND;
periodFilter.add("UsrDueDate", this.Terrasoft.createColumnFilterWithParameter(
	this.Terrasoft.ComparisonType.GREATER_OR_EQUAL, "UsrDueDate",
	UsrFilterStartDate));
periodFilter.add("UsrStartDate", this.Terrasoft.createColumnFilterWithParameter(
	this.Terrasoft.ComparisonType.LESS_OR_EQUAL, "UsrStartDate",
	UsrFilterDueDate));
if (fixedFilters.contains("PeriodFilter")) {
	fixedFilters.removeByKey("PeriodFilter");
}
fixedFilters.add("PeriodFilter", periodFilter);

Здесь UsrFilterStartDate, UsrFilterDueDate - значения даты начала и конца периода, указанные в фильтре (например, такой фильтр используется в разделе Активности), UsrStartDate, UsrDueDate - соответственно, даты начала и завершения в некотором объекте. В результате находятся все записи, которые хоть каким-нибудь "боком" попадают в заданный диапазон.

Проблема в том, что есть записи, в которых указана только дата начала UsrStartDate, т.к. запись ещё не "закрыта", то UsrDueDate пока пуста. Как сделать, чтобы такие записи тоже попадали в фильтр? Сейчас они не попадают, т.к. в колонке UsrDueDate пусто.

Нравится

2 комментария

Добрый вечер.

Дело в том, что при фильтрации на сервер посылается не совсем очевидный запрос, а именно: выбираются записи, в которых дата закрытия больше указанной даты начала, и соответственно, записи в которых дата начала меньше указанной даты конца периода. Поэтому, когда вы не ставите дату завершения будет происходить сравнение с null, и элемент не выбирается. Можете перехватить фильтры и удалить ненужный(«PeriodFilter») и установить свой. В ActivitySection это можно сделать в методе getFilters.

Нашёл способ, может кому понадобится:

 

var periodFilter = this.Terrasoft.createFilterGroup();
				periodFilter.logicalOperation = Terrasoft.LogicalOperatorType.AND;
 
 
				periodFilter.add("UsrStartDate", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.LESS_OR_EQUAL, "UsrStartDate",
					UsrStartDate));
 
				var dueDateFilter = this.Terrasoft.createFilterGroup();
				dueDateFilter.setLogicalOperation(1);
 
				dueDateFilter.add("NotUsrDueDate", this.Terrasoft.createColumnIsNullFilter("UsrDueDate"));
				dueDateFilter.add("UsrDueDate", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.GREATER_OR_EQUAL, "UsrDueDate",
					UsrDueDate));
 
				periodFilter.add("dueDateFilter", dueDateFilter);

То есть задаётся ещё одна группа фильтров, объединённых логической операцией ИЛИ, которая подключается внутрь группы фильтров.

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