Добавление фильтра для детали

Добрый день,
Есть деталь, необходимо чтобы на ней отображались лишь записи подходящие под определенные условия (по значениям полей записей), как добавить подобный фильтр?

Нравится

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

Олег, фильтрация настраивается путем указания соответствующих 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;
},

Спасибо

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