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