Поле множественного выбора из справочника в BPMonline 5.X
Сейчас мы создадим в BPMonline 5.X поле справочника со множественным выбором. В отличие от обычного справочника, в нём можно выбрать как одно, так и несколько значений. Технически это реализуется как скрытая деталь для связи «многие ко многим».
Так выглядит поле с выбранными вариантами на карточке:
А так — окно выбора вариантов. Сверху — возможные, снизу — выбранные:
Выбор вариантов осуществляется кнопками со стрелочками между верхним и нижним реестрами.
Для поддержки множественного выбора была разработана библиотека
Далее мы рассмотрим пример. На карточке контакта нужно разместить поле множественного выбора из справочника «Виды недвижимости» (FacilitySubtype).
Создаём на странице поле справочника FacilitySubtypesEdit с такими свойствами:
Обратите внимание на заполненные и пустые свойства, помеченные красным.
Затем создаём обработчики событий в бизнес-процессе карточки. Все эти обработчики после базовых:
На Init
return true;
На PageLoadComplete
return true;
На OKButtonClick
return true;
}
Terrasoft.Configuration.MultiSelectLookupUtilities.MultiSelectLookupSave("FacilitySubtypeInContact", "FacilitySubtype", Page.FacilitySubtypesEdit, Page.DataSource.ActiveRowPrimaryColumnValue, "Contact", UserConnection);
return true;
На DataSourceSaved
return true;
}
Terrasoft.Configuration.MultiSelectLookupUtilities.MultiSelectLookupSave("FacilitySubtypeInContact", "FacilitySubtype", Page.FacilitySubtypesEdit, Page.DataSource.ActiveRowPrimaryColumnValue, "Contact", UserConnection);
return true;
Для хранения результатов выбора в БД должна быть создана схема-объект вроде FacilitySubtypeInContact с двумя полями-справочниками. В нашем случае это Contact и FacilitySubtype. Оба поля с галкой «каскадная связь». Первый справочник — раздел, в который добавляется поле. Второй — справочник, из которого будут выбираться значения. Он должен быть уже
Используя инструкцию, не забудьте заменить в вызовах функций параметры на свои: название объекта-развязки, объекта-справочника, объекта-раздела и поля ввода на карточке.
Добрый день.
При попытке опубликовать ваше решение выдается следующая ошибка:
вот в этом месте :
public static void MultiSelectLookupPrepare(LookupEdit multiLookupEdit) { if (multiLookupEdit == null) { return; } multiLookupEdit.PrepareLookupFilter += delegate(object sender, LookupEditEventArgs e) { e.ParametersValue.Add("openLookupSelectedValues", multiLookupEdit.SelectedValues); //ОШИБКА }; }
Или данный функционал доступен только с версии 5.4 ?
Спасибо, что сообщили о проблеме.
Да, похоже в 5.2 этого поля в классе ещё нет.
Вы можете избавиться от функции MultiSelectLookupPrepare. Без неё всё будет работать, но при открытии окна выбора в нём список выбранных значений снизу будет пустым, а не браться с карточки. Если это не устроит, нужно будет искать другой механизм передачи параметров в окно выбора.
Вы хотите перенести в 5.2 схемы из конфигурации 5.4?
Не уверен, что такое возможно без обновления ядра. Там используется свойство ParametersValue контрола «поле справочника», которое в 5.2 ещё не появилось.
Илья, реализация данного функционала в том виде, в котором он здесь предоставлен потребует внесения изменений в ядро версии 5.2. Так как развитие версии 5.2 прекращено, данная доработка ядра произведена не будет.
в принципе забил много костылей.
Общая идея - открывать справочник через действие процесса, в действии формировать передавать список SelectedValues (которые передаются в дейтвии) в LookUpGrid
и в окне справочника на PageLoadComplete заполнять SelectedDataSource значениями полученными из действия.
Не совсем понял, окно справочника теперь у вас открывается не по стандартной кнопке с лупой?
Добрый день
Спасибо за статью, полезно.
Возник один вопрос: при открытии справочника для выбора неск. значений, предыдущие выбранные значения не отображаются (т.е. ранее сохраненные напр).
Можете подсказать "куда капать"?
"Илья Т." написал:Добрый день.
Может ктонибудь реализовал передачу выделенных значений в множественный справочник? Уже бьюсь неделю и ничего не выходит.BPMOnline Версия 5.2.0.658
Оказалось, что мой вопрос уже был.. Тоже бьюсь с этой проблемой.
Видимо придется тоже свою кнопку добавлять
В таком случае должно работать нормально. У Ильи ошибка проявляется в 5.2.
За отображение ранее выбранных значений в справочнике отвечает функция MultiSelectLookupPrepare на событии Init. Она у вас вызывается?
"Зверев Александр" написал:В таком случае должно работать нормально. У Ильи ошибка проявляется в 5.2.
За отображение ранее выбранных значений в справочнике отвечает функция MultiSelectLookupPrepare на событии Init. Она у вас вызывается?
Да она вызывается.
Но при открытии справочника по лупе, значение не отображается в выделенных.
Антон, предоставьте, пожалуйста, код процесса, отображенного на Вашем скриншоте.
"Андрей Каспаревич" написал:Антон, предоставьте, пожалуйста, код процесса, отображенного на Вашем скриншоте.
С уважением,
Каспаревич Андрей
Эксперт 3-й линии поддержки
Terrasoft.Configuration.MultiSelectLookupUtilities.MultiSelectLookupPrepare(Page.ArgumentEdit);
и дальше старая логика...
Антон, для предоставления решения потребуется бэкап Вашей БД, либо выгруженные метаданные используемых схем.
Просьба обратиться в тех. поддержку с данным вопросом и предоставить бэкап, либо метаданные.
Спасибо!
У меня версия 5.4. хочу в INIT процесса страницы редактиврования Инцидента включить : Terrasoft.Configuration.MultiSelectLookupUtilities.MultiSelectLookupPrepare(Page.AdresatiEdit);
при этом при опубликовании у меня возникает ошибка, MultiSelectLookupUtilities в конфигурации не найдена. Ранее здесь писали, что в версии 5.4 эта библиотека должна уже быть. Как мне ее загрузить ?
Версия BPM 5.4.0.2407
Сделала все как описано, но при выборе нескольких значений в поле на странице и в таблицу ничего не пишется (окно выбора у меня выглядит как во вложении lookupgridpage.png).
Если выбирать двойным щелчком в верхнем реестре, то в поле выбора и в базу сохраняется одна запись. Но даже в этом случае при повторном открытии страницы выбора в реестре выбранных записей пусто (lookupGridPage2.png)
Здравствуйте, Лариса!
Опишите, пожалуйста, пошагово, что Вы сделали. Тогда можно будет понять, в чем ошибка.
Лариса, проблема решилась импортом страницы выбора из справочника из более поздней сборки.
Здравствуйте.
Добавила множественное поле на карточке, сделала все вышеописанные шаги.
В итоге: при повторном сохранении карточки выходит ошибка, что поле не заполнено(хотя оно заполнено и выбранные значения перечислены через ; ). Кликаю на это поле, ничего не меняю, сохраняю карточку, карточка сохраняется, ошибки уже нет. Как устранить такое поведение? Знаю, что при разработке проекта, разработчики с таким сталкивались тоже и как-то исправляли.
Антонина, возможно раньше это поле на карточке было обычным полем единичного выбора и в объекте осталось такое же поле, причём обязательное? А на карточке случайно не забыли очистить связь контрола с полем объекта (надо как на рис. 2)?
Да, это поле ранее было единичным и оно есть в объекте, но в поле обязательность заполнения стоит значение нет. На карточке тоже стоит так, как указана на представленном скрине.
Возможно, осталась старая логика включения обязательности этого поля на карточке по какому-то условию.
"Anonymous" написал:у кого не работает, обратите внимание, что в статье опечатка, в имени события пропущена буква "p".
PageLoadComlete -> PageLoadComplete
Спасибо тебе, Анонимус. Исправил.
Проблема аналогична описанной в комментарии #23 - не передаются выбранные позиции в/из реестра выбранных записей.
Версия 5.4.0.2339
Как можно получить исправленную страницу выбора из справочника (решение проблемы в соответствии с комментарием #28) ?
Если речь о LookupGridPage, прилагаю версию от 5.4.1.1035 с датой изменения 2.03.2013.
На всякий случай сохраните в файл старую версию из системы.
Попытка использовать LookupGripPage из комментария #37 неудачна - в версии отсутствует параметр TreeGridDblClickDisabled и при компиляции зависимые объекты дают ошибки (8 штук)
Нужна более поздняя по времени версия, в которой уже есть данная функциональность
А у Вас какая дата её изменения?
Ещё раз уточните, проблема как в #23 или в #25?
Проблема как в #25 - нет передачи значений в LookupGridPage и обратно
Дата изменения (по колонке "Метаданные изменены") - 10.03.2014, верчсия бинарников - от 19.02.2014
Размер файла MD (по сравнению с присланным в #37) - больше на 45 кБайт (примерно на 120 строк)
А окно тоже выглядит, как в #25 на скриншоте, или как в статье?
Окно как в #25 (в нижней части кнопки "Выбрать" и "Убрать из выбранного", а не стрелки)
Версия системы близкая к указанной в #25