Вопрос

День добрый.

Не смог отыскать примера структуры JSON'а для DataService.

В запросе отправляю следующий Json, без блока Filters отрабатывает корректно.

{
	"RootSchemaName": "Opportunity",
	"OperationType": "Select",
	"Columns": {
		"Items": {
			"Title": {
				"Expression":{
					"ExpressionType": "SchemaColumn",
					"ColumnPath": "Title"
				}
			}
		}
	},
	"AllColumns": false,
	"IsPageable": false,
	"Filters": {
		"RootSchemaName": "Opportunity",
		"FilterType": "CompareFilter",
		"LogicalOperation": "And",
		"LeftExpression": {
			"ExpressionType": "SchemaColumn",
			"ColumnPath": "Title"
		},
		"ComparisonType": "Contain",
		"RightExpression": {
			"ExpressionType": "Parameter",
			"Parameter": "test"
		},
		"LeftExpressionCaption": "test",
		"IsAggregative": false,
		"Key": "Title filter"
	}
}

Но при попытке использовать Filters сервис дает следующий ответ.

{
    "success": false,
    "responseStatus": {
        "ErrorCode": "NullReferenceException",
        "Message": "Ссылка на объект не указывает на экземпляр объекта.",
        "Errors": []
    },
    "rowsAffected": -1,
    "nextPrcElReady": false
}

Перепробовал различные варианты, но так и не смог отыскать где ошибка в структуре. Кто сталкивался и может привести пример структуры рабочего запроса? Спасибо!

У меня такой же вопрос

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

Добрый день.

Попробуйте для параметра значение указать таким образом:

"Parameter":{
    "DataValueType":[Тип данных],
     "Value":"[Значение колонки]"
}

 

Алла Савельева,

получилось, спасибо.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Коллеги, привет. 

Не могу найти внятного мануала на тему использования фильтрация в БП. 

Хочу отфильтровать ответственного по тикету по группе ответственных. (Выбираем группу -> список ответственных уменьшается). 

Подскажите как реализовать "хотелку" или укажите на гайд, где подобная задача решается?

У меня такой же вопрос

8 комментариев
Лучший ответ

Вашу задачу можно решить не только с помощью бизнес-правил.

Например, в базовой версии фильтрация поля 'Ответственный' настраивается через атрибуты таким образом:

"Owner": {
	"dataValueType": Terrasoft.DataValueType.LOOKUP,
	"lookupListConfig": {"filter": BaseFiltersGenerateModule.OwnerFilter}
}

Более того некоторые задачи по фильтрации данных с помощью бизнес-правил вообще не решаются.

Распишите подробнее, какие вводные данные для реализации задачи - на основании каких данных фильтрацию какого поля Вам нужно реализовать?

Начните с просмотра этой статьи. В ней несколько ссылок на более подробное описание различных моментов связаных с БП. Так же просмотрите  статью СТРУКТУРА КЛИЕНТСКОЙ СХЕМЫ

 

 

 

Вашу задачу можно решить не только с помощью бизнес-правил.

Например, в базовой версии фильтрация поля 'Ответственный' настраивается через атрибуты таким образом:

"Owner": {
	"dataValueType": Terrasoft.DataValueType.LOOKUP,
	"lookupListConfig": {"filter": BaseFiltersGenerateModule.OwnerFilter}
}

Более того некоторые задачи по фильтрации данных с помощью бизнес-правил вообще не решаются.

Распишите подробнее, какие вводные данные для реализации задачи - на основании каких данных фильтрацию какого поля Вам нужно реализовать?

Алла Савельева,  требуется следующую логику: 

1) При выборе ответственного, список доступных для выбора групп ответственных должен содержать только те группы, в которые входит ответственный

И обратное:

2) При выборе группы ответственных, список ответственных должен быть ограничен только теми специалистами, которые входят в данную группу. 

Sunrise challenge,

Напишите sql-запрос, который должен выполниться в базе данных, чтобы получить нужные Вам данные.

Потом попробуйте интерпретировать этот запрос в программный код согласно тому, как описано в статье на Академии (обратите внимание, что для клиентского кода принцип присоединения полей тот же).

Алла Савельева, 

Нужно ли где-то определять BaseFiltersGenerateModule.OwnerFilter? 

Sunrise challenge,

В данном случае метод фильтрации OwnerFilter определен в BaseFiltersGenerateModule и для его использования в карточке редактирования должен быть подключен этот модуль. Сделано это было для того, чтобы использовать данный метод фильтрации в нескольких карточках и не дублировать программный код.

Но Вы можете написать нужный метод фильтрации прямо в карточке редактирования, не вынося его в отдельный модуль.

Алла Савельева,

Компилятор не выдаёт ошибок, схема сохраняется, при этом фильтрация не осуществляется

Sunrise challenge,

А в консоли браузера есть такие-то ошибки при выборе значения для этого поля?

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Если не использую фильтр, то все работает, но без фильтрации
Если использую, то null на выходе

В чем может быть причина?

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "GeneralForm"
    });
    
    esq.addColumn("Id");
    esq.addColumn("UsrCode");
    esq.addColumn("UsrInfoId.Name");
    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
    Terrasoft.ComparisonType.EQUAL, "UsrInfoId.Name", "Инфо"));
    
    var rowsCount = 0;
    var rowsCount1 = "";
    esq.getEntityCollection(function(result) {
        if (result.success) {
            
            
            result.collection.each(function (item) {
                rowsCount = rowsCount + 1;
                rowsCount1 += item.get("UsrCode") + "#" + item.get("UsrInfoId.Name") + 
                    "(" + rowsCount + ")" + "\n";
            });
            this.set("UsrCount", rowsCount1);
        }
    }, this);

У меня такой же вопрос

12 комментариев
Лучший ответ

Посмотрите профилировщиком какой sql запрос отправляется в БД, это поможет определить проблему

Посмотрите профилировщиком какой sql запрос отправляется в БД, это поможет определить проблему

Ошибка в том, что Вы неправильно построили связи - нужно писать UsrInfo.Name, а у Вас UsrInfoId.Name.

Вот корректный код:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "GeneralForm"
    });
    
    esq.addColumn("Id");
    esq.addColumn("UsrCode");
    esq.addColumn("UsrInfo.Name");
    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
    Terrasoft.ComparisonType.EQUAL, "UsrInfo.Name", "Инфо"));
    
    var rowsCount = 0;
    var rowsCount1 = "";
    esq.getEntityCollection(function(result) {
        if (result.success) {
            
            
            result.collection.each(function (item) {
                rowsCount = rowsCount + 1;
                rowsCount1 += item.get("UsrCode") + "#" + item.get("UsrInfo.Name") + 
                    "(" + rowsCount + ")" + "\n";
            });
            this.set("UsrCount", rowsCount1);
        }
    }, this);

Ну, и на будущее смотрите, какая ошибка возвращается в браузере и выполняете отладку клиентского кода, тогда сразу становится понятно, в какой строке кода допущена ошибка.

Алла Савельева,

пытаюсь реализовать запрос:

select 
    q1.UsrCode
    , q2.Name
from 
    GeneralForm q1 
    join UsrInfoList q2 
on 
    q1.UsrInfoId = q2.Id

При моей текущей реализации этот кусок работает:
esq.addColumn("UsrInfoId.Name");
Проблема с фильтром. 

Григорий Чех,

Ок. Разбираюсь с тем как его использовать.

Григорий Чех,

а как корректно этот механизм объявить в коде?
добавил:
//перед esq
var performanceManagerLabel = "";
performanceManager.start(performanceManagerLabel + "_Init");
//сразу после фильтрации
performanceManager.stop(performanceManagerLabel + "_Init");
пишет:
'performanceManager' is not defined
 

Григорий Чех,

Нашел. 

performanceManager указать надо было.

Григорий Чех,

Верно понимаю, что performanceManager.stop по сути служит меткой для того, чтобы в браузере можно было посмотреть состояние системы на этот момент и при необходимости перескочить на следующую метку?

Алла Савельева,

Верно понимаю, что для такого запроса реализация ниже верна?
На практике без фильтра логика выдает правильное число строк, а с фильтром null.

select 
    q1.Id
    q1.UsrCode
    , q2.Name
from 
    GeneralForm q1 
    join UsrInfoList q2 
on 
    q1.UsrInfoId = q2.Id

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "GeneralForm"
esq.addColumn("Id");
esq.addColumn("UsrCode");
esq.addColumn("UsrInfoId.Name");
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "UsrInfoId.Name", "Инфо"));

Посмотрите в профайлере, что за SQL-запрос идёт в базу при выполнении последнего кода и потом запустите в Management Studio  его отдельно, чтобы выяснить, почему у него пустой результат.

Зверев Александр,

система в yазвании таблицы, которую пробую подцепить добавляет в начале и конце названия еще символы

SysUsrInfoListLcz. А нужна таблица была UsrInfoList. Это фича такая?

Хотя нет. Не в ней дело. Тут все хорошо.

SysUsrInfoListLcz — это автоматически сгенерированная таблица переводов названий для UsrInfoList.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

Пробую реализовывать запрос к данных через ESQ таким образом:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                    rootSchemaName: "UsrTbl1"
                });
                esq.addColumn("Id");
                esq.addColumn("UsrPar1");esq.addColumn("UsrInfoId");
                esq.addColumn("UsrValueList.Name");//вот с такими строками уже начинается проблема

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrValueList.Name", "значение1"));//и с такими фильтрами

 

Если нужно получить значение колонок с таблицы - rootSchemaName, то не вопрос.

Проблемы начинаются, когда пытаюсь использовать прямые ссылки или в одной запросе получать GUID, а во втором его использовать.

GUID  видимо со String плохо понимают друг друга. Если ли примеры их нормального совместного использования в рамках ESQ?

Можно ли как-то понять причины неработоспособности прямых ссылок? Или хотя бы понять как с GUID быть? Даже если я значение GUID пытаюсь вставлять так, то не работает:

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfoId", "337ED96B-B658-48B0-BBB6-7FACF918C735"));

У меня такой же вопрос

2 комментария
Лучший ответ

Eсли нужно получить справочную колонку, то её название нужно указывать без приставки "Id", как в схеме таблицы:

esq.addColumn("UsrInfo")

Аналогично и с фильтрами:

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfo", "337ED96B-B658-48B0-BBB6-7FACF918C735"));

Но обратите внимание, что, если у Вас фильтр построен по обратным связям, то можно писать 2 способами.

1. Через Id и тогда в качестве значения фильтра указываем Id:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(
                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment.Id", shipment.value));

2. Через справочное поле и тогда в качестве значения указывать значение справочного поля:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(
                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment", shipment));

А вообще, чтобы понять причину ошибки нужно отладиться на стороне клиента, если запрос уходит в базу данных, то посмотреть в SQL profiler, какой запрос идет в базу и какой результат работы этого запроса.

 

В js все Guid преобразуйте к нижнему регистру

те в вашем случае напишите что то типа esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfoId", "337ed.....

Eсли нужно получить справочную колонку, то её название нужно указывать без приставки "Id", как в схеме таблицы:

esq.addColumn("UsrInfo")

Аналогично и с фильтрами:

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfo", "337ED96B-B658-48B0-BBB6-7FACF918C735"));

Но обратите внимание, что, если у Вас фильтр построен по обратным связям, то можно писать 2 способами.

1. Через Id и тогда в качестве значения фильтра указываем Id:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(
                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment.Id", shipment.value));

2. Через справочное поле и тогда в качестве значения указывать значение справочного поля:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(
                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment", shipment));

А вообще, чтобы понять причину ошибки нужно отладиться на стороне клиента, если запрос уходит в базу данных, то посмотреть в SQL profiler, какой запрос идет в базу и какой результат работы этого запроса.

 

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Сделал следующие методы для валидации.

Нужно посчитать количество данных по условиям в группе фильтров. Все переменные присваивают правильные значения, кроме activeEverydayConcertCount на этапе чтения выборки. В чем проблема?

maxEverydayActive: function() {
                var invalidMessage = "";
                var activeEverydayConcertCount = 0;
                var maxActiveEverydayConcertCount = 0;
                Terrasoft.SysSettings.querySysSettingsItem("UsrMaxEverydayActiveProgram", function(value) {
                    maxActiveEverydayConcertCount = value;
                }, this);
                var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                    rootSchemaName: "UsrConcertProgram"
                });
                esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, "CountEntities",
                Terrasoft.AggregationEvalType.ALL);
                
                var filterGroup = this.Terrasoft.createFilterGroup();
                
                filterGroup.add("concertsIsActive",
                this.Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrIsActive", "1"));
                filterGroup.add("performancePeriodEveryday",
                this.Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
                "UsrPerformancePeriod", "85A8C133-FF83-4290-9F69-B34EAF627F8C"));
                
                esq.filters.addItem(filterGroup);
                
                esq.getEntity(function(result) {
                        if (result.success){
                            activeEverydayConcertCount = result.entity.get("CountEntities"); - здесь не присваивается значение. Должно быть 4. По БД проверил
                        }
                }, this);
                
                if (activeEverydayConcertCount >= maxActiveEverydayConcertCount) {
                    invalidMessage = this.get("Resources.Strings.MaximumActiveEverydayConcerts");
                }
                
                return {
                    invalidMessage: invalidMessage
                };
            },
            setValidationConfig: function() {
                this.callParent(arguments);
                this.addColumnValidator("UsrIsActive", this.maxEverydayActive);
                this.addColumnValidator("UsrPerformancePeriod", this.maxEverydayActive);
            }

У меня такой же вопрос

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

Пробовал различные операции без группы фильтров, а с обычными, без условия и тд. Ничего...

 

Paul_lgb,

Добрый день. Все дело в том, что у вас даже не вызывается callback вызова getEntity (если вызывается, то это странно, возможно в вашей версии еще есть такое поведение).

Функция getEntity имеет 3 параметра:

1. primaryColumnValue

2. callback

3. scope

Функция getEntity будет возвращать вам все колонки, относящиеся к этой entity.

Пример:

getEntity("<здесь Id контакта>", function(resullt) {}) //т.е. будет фильтрация по Id контакта

Для получения количества записей, без "фильтрации" нужно использовать функцию getEntityCollection(callback), но она асинхронна, поэтому это нужно учесть.

 

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Есть такой метод:

addRecords: function(detailColumnName, segmentName, isEditableSegment) {
            var masterId = this.get("MasterRecordId");
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: this.entitySchemaName
            });
            esq.addColumn(segmentName);
            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));
            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));
            esq.getEntityCollection(function(result) {
                var existsContactsCollection = [];
                if (result.success) {
                    result.collection.each(function(item) {
                        existsContactsCollection.push(item.get(segmentName).value);
                    });
                }
                var config = {
                    entitySchemaName: segmentName,
                    multiSelect: true,
                    columns: ["Type"]
                };
                
                var isAccount;
                if (segmentName === "Account") {
                    config.filters = Ext.create("Terrasoft.FilterGroup");
                    config.filters.add("first", Terrasoft.createColumnFilterWithParameter(
                        Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));
                    isAccount = true;
                }
                if (existsContactsCollection.length > 0) {

                    var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsContactsCollection);
                    existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;

                    existsFilter.Name = "existsFilter";
                    if (isAccount) {
                        config.filters.add("second", existsFilter);
                    } else {
                        config.filters = existsFilter;
                    }
                }
                this.openLookup(config, function(config) {
                    methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);
                }, this);
            }, this);
        },
где detailColumnName = "Campaing",
segmentName = "Product",
entitySchemaName = "ProductUsage"

В ProductUsage есть идентификатор родительского объекта (Campaing) и идентификатор продукта (Product)

Он нужен для того, чтобы лукап выводил только те записи, которых нет в детали для этого объекта и отрабатывает корректно, но вот когда на детали больше записей, чем 2100, БД SQL выдает ошибку, что конструкция IN принимает максимум 2100 параметров, поэтому я решил переделать запрос под конструкцию NotExists.

Изменил этот метод с фильтрами на следующий:

addNotExistsRecords: function(detailColumnName, segmentName, isEditableSegment) {
            var masterId = this.get("MasterRecordId");
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: this.entitySchemaName
            });
            esq.addColumn(segmentName);
            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));
            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));
            esq.filters.add("isEqualsTo", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "Product.Id", "ProductId"));
                
            var config = {
                entitySchemaName: segmentName,
                multiSelect: true,
                columns: ["Type"]
            };
            
            var isAccount;
            if (segmentName === "Account") {
                config.filters = Ext.create("Terrasoft.FilterGroup");
                config.filters.add("first", Terrasoft.createColumnFilterWithParameter(
                    Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));
                isAccount = true;
            }
            
            var existsFilter = Terrasoft.createNotExistsFilter("Id", esq);
            existsFilter.Name = "existsFilter";
            if (isAccount) {
                config.filters.add("second", existsFilter);
            } else {
                config.filters = existsFilter;
            }
            
            this.openLookup(config, function(config) {
                methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);
            }, this);
        },

 

Однако при выполнении происходит ошибка errorCode: "NotSupportedException", message: "None", stackTrace: undefined, errors: Array(0)
Где я ошибся при построении фильтров?

По сути нужно повторить такой запрос:

select Id from Product where NOT EXISTS(select Id from ProductUsage where CampaignId = 'f39db115-d2f4-4936-b415-bf6543187463' AND IsDeleted = 'false' AND Product.Id = ProductId)
 

У меня такой же вопрос

1 комментарий
Лучший ответ

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

Также, как вариант, Вы можете реализовать получение нужных Вам записей на стороне сервера. Подробное обсуждение можете посмотреть здесь.

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

Также, как вариант, Вы можете реализовать получение нужных Вам записей на стороне сервера. Подробное обсуждение можете посмотреть здесь.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Здравствуйте!
Система - bpm'online service enterprice 7.13 
Раздел Конфигурации(он же Продукты на других версиях) в карточке единицы конфигурации есть деталь Комплектация, где присутствует возможность добавить связанные продукты(ед. конфигурации).
Интересует возможность добавления в контейнер секции(Конфигурации) поля для ввода и кнопки после нажатия на которою устанавливался бы фильтр на ед. конфигурации по названию(которое было введено в поле) и плюс в грид выводились все комплектующие данной ед. конфигурации.
Можно ли такое реализовать?

У меня такой же вопрос

4 комментария
Лучший ответ

Андреев Андрей Сергеевич,

Так, ну тогда можно попробовать следующий вариант:
1) Создаем контейнер и поле для поиска

{
                "operation": "insert",
                "name": "MyFilterContainer",
                "parentName": "LeftGridUtilsContainer",
                "propertyName": "items",
                "index": 0,
                "values": {
                    "id": "MyFilterContainer",
                    "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                    "items": [],
                    "layout": {
                        "column": 25,
                        "row": 1,
                        "colSpan": 4
                    }
                }
            },
            {
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "UsrEmail",
                "values": {
                    "bindTo": "UsrEmailFilter",
                    "caption": {"bindTo": "Resources.Strings.UsrEmailFilter"},
                    "layout": {
                        "column": 5,
                        "row": 2,
                        "colSpan": 4
                    },
                    "controlConfig": {
                        "change": {
                            "bindTo": "emailChanged"
                        }
                    }
                }
            }

2) Добавляем атрибуты
 

  attributes: {
            "UsrEmailFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrEmails": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            }
        },

3) Добавляем методы
 

emailChanged: function(a, b, c) {
                this.set("UsrEmails", a);
                this.onUsrFilterChanged();
                debugger;
            },
            clearFilter: function() {
                this.set("UsrEmailFilter", "");
                this.onUsrFilterChanged();
            },
 
            onUsrFilterChanged: function() {
                this.reloadGridData();
            },
 
            initQueryFilters: function(esq) {
                this.callParent(arguments);
 
                var usrEmailFilter = this.get("UsrEmails");
 
                if (usrEmailFilter) {
                    esq.filters.add("UsrEmailFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.CONTAIN, "[Account:Id].Email".substring(), usrEmailFilter));
                } else {
                    esq.filters.removeByKey("UsrEmailFilter");
                }
            }

Конкретно в данном примере вы на выходе получите поле для фильтрации контрагентов по Email.
Ваша же задача, доработать initQueryFilters, во первых заменить на продукты фильтр и дополнить значениям с детали.

Делаете esq запрос,с фильтрами, по названию, в примере выше есть, формируйте коллекцию Id записей, затем по этой коллекции, делайте еще одну выборку уже в деталь, на выходе получите еще одну коллекцию ID продуктов записей, дополните её значениями первой коллекции, после чего, весь этот массив данных передайте в initQueryFilters и через обычный for (i=0; collection.lenghr; i++) { постройте и верните filterGroup }

Можете скриншотами показать, что вы хотите? Как-то все запутано звучит.
Что касается, первой части "Поле для ввода" и "Кнопки" по нажатию на которой в гриде отобразить подходящие значения - реализовать можно, делается достаточно быстро.
В моем понимании этой части вашей задачи все выглядит так: есть раздел Контрагент => Ввел в нужном Поле например Наша компания => клик Найти => в гриде раздела отобразились все записи с названием "Наша компания".
Если верно, то что вы хотите во 2-ой части своего вопроса?

Литвинко Павел,

http://prntscr.com/lj4zpx

На скрине сама секция - Техника аки Конфигурации

1.Контейнер где должен располагаться фильтр(поле и кнопка)
2. Сущность секции аки Запись

http://prntscr.com/lj50rz

На этом скрине карточка сущности.
В выделенной области есть деталь Комплектующие где хранятся связи с другими такими же записями того же раздела

Суть фильтра такова.
Вводишь в поле Название записи и после нажатие на кнопку происходит фильтрация и в гриде остается запись с этим названием плюс все записи что в детальке Комплектующие данной записи т.е. связанные.

Как сделать такого рода фильтрацию?

 

Андреев Андрей Сергеевич,

Так, ну тогда можно попробовать следующий вариант:
1) Создаем контейнер и поле для поиска

{
                "operation": "insert",
                "name": "MyFilterContainer",
                "parentName": "LeftGridUtilsContainer",
                "propertyName": "items",
                "index": 0,
                "values": {
                    "id": "MyFilterContainer",
                    "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                    "items": [],
                    "layout": {
                        "column": 25,
                        "row": 1,
                        "colSpan": 4
                    }
                }
            },
            {
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "UsrEmail",
                "values": {
                    "bindTo": "UsrEmailFilter",
                    "caption": {"bindTo": "Resources.Strings.UsrEmailFilter"},
                    "layout": {
                        "column": 5,
                        "row": 2,
                        "colSpan": 4
                    },
                    "controlConfig": {
                        "change": {
                            "bindTo": "emailChanged"
                        }
                    }
                }
            }

2) Добавляем атрибуты
 

  attributes: {
            "UsrEmailFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrEmails": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            }
        },

3) Добавляем методы
 

emailChanged: function(a, b, c) {
                this.set("UsrEmails", a);
                this.onUsrFilterChanged();
                debugger;
            },
            clearFilter: function() {
                this.set("UsrEmailFilter", "");
                this.onUsrFilterChanged();
            },
 
            onUsrFilterChanged: function() {
                this.reloadGridData();
            },
 
            initQueryFilters: function(esq) {
                this.callParent(arguments);
 
                var usrEmailFilter = this.get("UsrEmails");
 
                if (usrEmailFilter) {
                    esq.filters.add("UsrEmailFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.CONTAIN, "[Account:Id].Email".substring(), usrEmailFilter));
                } else {
                    esq.filters.removeByKey("UsrEmailFilter");
                }
            }

Конкретно в данном примере вы на выходе получите поле для фильтрации контрагентов по Email.
Ваша же задача, доработать initQueryFilters, во первых заменить на продукты фильтр и дополнить значениям с детали.

Делаете esq запрос,с фильтрами, по названию, в примере выше есть, формируйте коллекцию Id записей, затем по этой коллекции, делайте еще одну выборку уже в деталь, на выходе получите еще одну коллекцию ID продуктов записей, дополните её значениями первой коллекции, после чего, весь этот массив данных передайте в initQueryFilters и через обычный for (i=0; collection.lenghr; i++) { постройте и верните filterGroup }

Литвинко Павел,

Спасибо большое!
Чекните ЛС плз.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Здравствуйте! Подскажите, а как добавить в фильтры серверного EntitySchemaQuery подзапрос или где в системе можно найти пример? На SQL запрос выглядит следующим образом:

SELECT
   * 
FROM
   [Contract] 
WHERE
   StartDate = (
        SELECT MAX(c.StartDate)
        FROM Premises p
        JOIN PremisesInContract pic ON p.Id = pic.PremisesId
        JOIN Contract c ON spic.ContractId = c.Id
        WHERE p.Id = --@someparameter
   )

 

У меня такой же вопрос

1 комментарий
Лучший ответ

Добрый день, похожая ситуация обсуждалась тут https://community.terrasoft.ru/questions/ispolzovanie-kollekcii-v-select

Добрый день, похожая ситуация обсуждалась тут https://community.terrasoft.ru/questions/ispolzovanie-kollekcii-v-select

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

Подскажите, пожалуйста, можно ли сделать так чтобы значение справочного поля равнялось значению атрибута. Чтобы вопрос не казался странным, расскажу откуда растут корни. В атрибуте храниться значение Id продукта, который подбирается сложным, составным фильтром. Это значение надо передать в справочное поле продукта (привязанное к детали страницы), которое будет скрыто. Почему сделано так, потому что не смог реализовать комплексный фильтр к справочному полю детали (не нашел подходящего примера).

У меня такой же вопрос

7 комментариев
Лучший ответ

А что мешает например при загрузке загрузить в справочник ваше значение атрибута и настроить чтоб при изменении атрибута менялось значения справочника или вам что-то другое нужно?  Обмен данными между страничкой и деталью можно через подписку на события реализовать.Таким событием может стать например изменение атрибута(виртуальной колонки)

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

Да. Вот моя страница подбора продукта.

На самом деле мне просто нужно сохранить подобранный продукт в детали. Я не смог найти как можно настроить комплексный фильтр для справочного поля детали. Смог только реализовать через esq для атрибута. Но теперь не могу значение этого атрибута передать в деталь. 

Руслан Хасанов пишет:
На самом деле мне просто нужно сохранить подобранный продукт в детали

Если Вам нужно сохранить нужный продукт в деталь, то сделать это можно либо с помощью бизнес-процесса, либо с помощью классов InsertQuery для клиентской или серверной части приложения bpm'online.

На самом деле хотелось бы просто передать значение Id продукта на клиентской схеме. Вариант прямого сохранения в объект детали используя запрос не удобен тем что:
1. Если пользователь редактирует запись детали, то инсерт вставит еще одну запись и их количество будет расти с каждым нажатием кнопки сохранения

2. Второе происходит из первого - надо проверять есть ли такой Id в детали, если да то йпдейт. 

3. Надо переопределить кнопку сохранения

4. Необходимо изобретать велосипед, т.е. повторять логику сохранения записи детали.

Может есть способ передать подобранное значение в виртуальной колонке в колонку детали на схеме страницы?

А что мешает например при загрузке загрузить в справочник ваше значение атрибута и настроить чтоб при изменении атрибута менялось значения справочника или вам что-то другое нужно?  Обмен данными между страничкой и деталью можно через подписку на события реализовать.Таким событием может стать например изменение атрибута(виртуальной колонки)

Да, Григорий, мне так и надо сделать, чтобы в значение справочника устанавливалось значение атрибута. Мешает недостаток опыта, я не могу найти пример кода как это сделать. Если есть возможность, приведите, пожалуйста, пример. Спасибо огромное!

Нашел ветку в которой обсуждалась данная тема https://community.terrasoft.ru/questions/znacenie-v-pole-spravocnik

Вот решение для этого вопроса: 

this.loadLookupDisplayValue("Type", constants.ContractType.Standard);

Большое спасибо Сергею за подсказку.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день, коллеги!

Как вы добиваетесь в английской версии bpm'online того, чтобы в фильтрах Week начинался не с воскресенья, а с понедельника?

Спасибо

У меня такой же вопрос

4 комментария
Лучший ответ

Зверев Александр,

Вот так всегда сначала добавляется новая функциональность, а потом в одной из n-ой новой версии уже появляется системная настройка, чтобы ею управлять.

В данном случае можно было бы сразу предусмотреть возможность 'более гибкой' работы с этой функциональностью!  

Сейчас день начала недели жёстко привязан к культуре, в будущих версиях планируется отдельная настройка начала недели и формата даты.

Зверев Александр,

Вот так всегда сначала добавляется новая функциональность, а потом в одной из n-ой новой версии уже появляется системная настройка, чтобы ею управлять.

В данном случае можно было бы сразу предусмотреть возможность 'более гибкой' работы с этой функциональностью!  

Да, некоторые вещи в системе непонятно почему захардкодены...

Уже в версии 7.12.3 получили какие-то изменения, но опять привязали Европу к американским стандартам :(

Войдите или зарегистрируйтесь, чтобы комментировать