Всем доброго времени суток.
Версия 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 пусто.
Нравится
Добрый вечер.
Дело в том, что при фильтрации на сервер посылается не совсем очевидный запрос, а именно: выбираются записи, в которых дата закрытия больше указанной даты начала, и соответственно, записи в которых дата начала меньше указанной даты конца периода. Поэтому, когда вы не ставите дату завершения будет происходить сравнение с 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);То есть задаётся ещё одна группа фильтров, объединённых логической операцией ИЛИ, которая подключается внутрь группы фильтров.