Добрый день,
Есть деталь, необходимо чтобы на ней отображались лишь записи подходящие под определенные условия (по значениям полей записей), как добавить подобный фильтр?
Нравится
Олег, фильтрация настраивается путем указания соответствующих masterColumn и detailColumn при добавлении детали на страницу
Вот пример сложного фильтра (на страницу с документом добавляем детали заявок)
define("CorrespondencePageV2", [], function() { return { entitySchemaName: "Document", details: /**SCHEMA_DETAILS*/{ Order: { schemaName: "OrderDetailV2", entitySchemaName: "Order", filter: { masterColumn: "Id", // Id текущего Document detailColumn: "[OrderInDocument:Order:Id].Document" // Все Document, которые связаны с Order детали через таблицу OrderInDocument } } }/**SCHEMA_DETAILS*/, diff: /**SCHEMA_DIFF*/[ { "operation": "insert", "parentName": "HistoryTabContainer", "propertyName": "items", "name": "Order", "values": { "itemType": Terrasoft.ViewItemType.DETAIL } } ]/**SCHEMA_DIFF*/ }; });
Если же фильтрация сложная или требует предварительных вычислений, то лучше наверное воспользоваться filterMethod:
details: /**SCHEMA_DETAILS*/{ OpportunityAccount: { schemaName: "OpportunityDetailV2", filter: { masterColumn: "Account", detailColumn: "Account" }, filterMethod: "opportunityAccountFilter", captionName: "AccountOpportunitiesCaption" }, }/**SCHEMA_DETAILS*/, methods: { /** * Метод фильтрации детали Продукты контрагента * @protected * @virtual * @return {Terrasoft.FilterGroup} Возвращает группу фильтров */ opportunityAccountFilter: function() { var account = this.get("Account"); var accountId = this.Terrasoft.GUID_EMPTY; if (account && account.value) { accountId = account.value; } var opportunityId = this.get("Id"); var filterGroup = new this.Terrasoft.createFilterGroup(); filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND; filterGroup.add("AccountFilter", this.Terrasoft.createColumnFilterWithParameter( this.Terrasoft.ComparisonType.EQUAL, "Account", accountId)); filterGroup.add("OpportunityFilter", this.Terrasoft.createColumnFilterWithParameter( this.Terrasoft.ComparisonType.NOT_EQUAL, "Id", opportunityId)); return filterGroup; }, }
Олег, здравствуйте!
"Толмачев Дмитрий Юрьевич" написал:Олег, фильтрация настраивается путем указания соответствующих masterColumn и detailColumn при добавлении детали на страницу
Вот пример сложного фильтра (на страницу с документом добавляем детали заявок)
define("CorrespondencePageV2", [],
function() {
return {
entitySchemaName: "Document",
details: /**SCHEMA_DETAILS*/{
Order: {
schemaName: "OrderDetailV2",
entitySchemaName: "Order",
filter: {
masterColumn: "Id", // Id текущего Document
detailColumn: "[OrderInDocument:Order:Id].Document" // Все Document, которые связаны с Order детали через таблицу OrderInDocument
}
}
}/**SCHEMA_DETAILS*/,
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"parentName": "HistoryTabContainer",
"propertyName": "items",
"name": "Order",
"values": { "itemType": Terrasoft.ViewItemType.DETAIL }
}
]/**SCHEMA_DIFF*/
};
});
Дмитрийпредоставил правильную рекомендацию.
За подобную бизнес-задачу отвечает masterColumn и detailColumn.
Спасибо, добавил filterMethod, работает, только одна проблема как мне сравнивать значение дат.
Необходимо отфильтровывать и выводить только те записи у которых ValidTill больше текущей даты.
Пробовал значение сравнивать с текущей датой в разных форматах (yyyy-mm-dd и dd/mm/yyyy), фильтр не отрабатывает
filterGroup.add("ValidTillGreaterFilter", this.Terrasoft.createColumnFilterWithParameter( this.Terrasoft.ComparisonType.GREATER, "ValidTill", today));
Также вопрос, как фильтровать логические значение, сравнивать их с true или 1 ?
С датами, по-моему, так:
filterGroup.add("ValidTillGreaterFilter", this.Terrasoft.createColumnFilterWithParameter( this.Terrasoft.ComparisonType.GREATER, "ValidTill", new Date()));
"Глобин Олег" написал:Также вопрос, как фильтровать логические значение, сравнивать их с true или 1 ?
Сравнивать с true.
Спасибо за помощь, добавил метод
productPriceFilter: function() { var filterGroup = new this.Terrasoft.createFilterGroup(); filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.OR; filterGroup.add("ValidTillNullFilter", this.Terrasoft.createColumnFilterWithParameter( this.Terrasoft.ComparisonType.IS_NULL, "UsrValidTill")); filterGroup.add("ValidTillGreaterFilter", this.Terrasoft.createColumnFilterWithParameter( this.Terrasoft.ComparisonType.GREATER, "UsrValidTill", new Date())); return filterGroup; },
и добавил деталь
"ProductPriceDetail": { "schemaName": "ProductPriceDetailV2", "filter": { "masterColumn": "Id", "detailColumn": "Product" }, "filterMethod": "productPriceHistoryFilter" },
Фильтрация по дате заработала, но теперь не работает базовая фильтрация по Id продукта и значению Product в детали.
Вопрос как добавить в filterMethod условие Id equal Product И (ValidTill > newDate() ИЛИ ValidTill isNull)
Т.е. добавить срази условие И и ИЛИ в один фильтр, т.к. изменение
filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.OR;
меняет отношения сразу между всеми условиями
Олег, добрый день!
Вам необходимо создать дополнительную группу фильтров, а существующую filterGroup использовать внутри неё:
productPriceFilter: function() { var filterGroup = new this.Terrasoft.createFilterGroup(); filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.OR; filterGroup.add("ValidTillNullFilter", this.Terrasoft.createColumnFilterWithParameter( this.Terrasoft.ComparisonType.IS_NULL, "UsrValidTill")); filterGroup.add("ValidTillGreaterFilter", this.Terrasoft.createColumnFilterWithParameter( this.Terrasoft.ComparisonType.GREATER, "UsrValidTill", new Date())); var mainFilterGroup = new this.Terrasoft.createFilterGroup(); mainFilterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND; mainFilterGroup.addItem(filterGroup); // добавляете фильтр по Id продукта return mainFilterGroup; },