Здравствуйте!
Система - 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 }