Здравствуйте!
Система - bpm'online service enterprice 7.13
Раздел Конфигурации(он же Продукты на других версиях) в карточке единицы конфигурации есть деталь Комплектация, где присутствует возможность добавить связанные продукты(ед. конфигурации).
Интересует возможность добавления в контейнер секции(Конфигурации) поля для ввода и кнопки после нажатия на которою устанавливался бы фильтр на ед. конфигурации по названию(которое было введено в поле) и плюс в грид выводились все комплектующие данной ед. конфигурации.
Можно ли такое реализовать?
Нравится
Андреев Андрей Сергеевич,
Так, ну тогда можно попробовать следующий вариант:
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-ой части своего вопроса?
Литвинко Павел,
На скрине сама секция - Техника аки Конфигурации
1.Контейнер где должен располагаться фильтр(поле и кнопка)
2. Сущность секции аки Запись
На этом скрине карточка сущности.
В выделенной области есть деталь Комплектующие где хранятся связи с другими такими же записями того же раздела
Суть фильтра такова.
Вводишь в поле Название записи и после нажатие на кнопку происходит фильтрация и в гриде остается запись с этим названием плюс все записи что в детальке Комплектующие данной записи т.е. связанные.
Как сделать такого рода фильтрацию?
Андреев Андрей Сергеевич,
Так, ну тогда можно попробовать следующий вариант:
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 }