Урок 6. Практика разработки. Часть 3#
В данном уроке мы рассмотрим:
Диалог с пользователем
Мультиселект (множественный выбор)
Группировка объектов
Объектные характеристики
Диалог с пользователем#
Диалоги позволяют задавать вопросы пользователю и получать от него ответы на эти вопросы.
Мультиселект#
Мультиселект - возможность выбрать несколько строк в списках или деревьях.
Руководство разработчика: Выборки # Мультиселект
Руководство разработчика: Выборки # Диалоги # Форма в режиме выбора значения
Группировка объектов#
Группировка используется для систематизации хранения объектов и удобства восприятия пользователем, так же группировка позволяет массово управлять характеристиками и настройками объектов класса.
Руководство разработчика: Сервисные возможности для классов # Группировка
Объектные характеристики#
Характеристика – это качественное или количественное свойство объекта. Характеристиками в системе являются специальные атрибуты, которые содержат дополнительную пользовательскую информацию.
Руководство разработчика: Сервисные возможности для классов # Объектные характеристики
Практические задания#
Диалог с пользователем#
В классе
Lbr_Publisherдобавьте диалог, в котором у пользователя запрашивается подтверждение на удаление объекта.Для заказов
Lbr_InOrderиLbr_OutOrderна закладках с детализацией реализуйте следующую логику для операции «Создать»:
при нажатии на иконку операции открывается список книг в режиме выбора
если пользователь выбрал книгу и подтвердил выбор, то создается новая запись в детализации заказа.
Мультиселект#
Для заказов на закладке «Состав» измените работу операции «Создать» на мультиселект:
В
ApiклассовLbr_OutOrderDetиLbr_InOrderDetреализуйте метод регистрации записи. Метод принимаетidзаказа иidкниги, осуществляет поиск записи в с такими идентификаторами заказа и книги в классе, если запись есть, то возвращает ееid, если записи нет, то создает ее и возвращает ееid.В операции создания открывать форму выбора книг в режиме мультиселекта, для каждой выбранной книги вызывать метод регистрации, таким образом книги в позициях заказа не будут дублироваться, если пользователь выбрал книгу, уже подобранную в заказ.
В списке книг (
Lbr_Book#List) реализовать операцию подбора книг в заказы:создать на тулбаре новую операцию
при нажатии на операцию создается диалог с произвольными кнопками, текст диалога
В какой тип заказа добавить выбранные книги?, список кнопок:Возврат
Выдача
Отмена
Если пользователь нажал «Отмена», то выполнение операции завершается без дальнейших действий.
Если пользователь выбрал «Возврат» или «Выдача», то открывается список заказов в режиме выбора с
мультиселектом(Возврат - списокLbr_InOrder, Выдача - списокLbr_OutOrder).Для каждого выбранного заказа выполняется следующая логика:
обходим все выделенные книги и регистрируем их для заказа методом регистрации созданном в пункте 1.
Группировка объектов#
Включите группировку для класса
Lbr_Publisherв
odmукажите тип группировки «Множественная»переформируйте исходный код и таблицы
соберите проект.
Настройте дерево групп:
Под корневой группой создайте 2 подгруппы:
Зарубежные издательства
Отечественные издательства
Выведите закладку с группами объекта в карточке (отображение
Card).Активируйте в выборке
Lbr_Publisher#ListоперациюДополнительно(имя методаextraOperations).Под операцией
Дополнительносоздайте новую операциюСтатистика текущей группы, выводящую статистику по группе, о количестве объектов в группе и количестве подгрупп.Создайте новую операцию на тулбаре, укажите ей операцию-предка
Для определения текущей группы используйте
getVar("idGroup#")Используя диалоги, вывести на экран информацию вида:
Количество объектов в группе: 42 Количество объектов без учета подгрупп: 1 Количество подгрупп: 10
Запросить количество объектов в группе можно через таблицу
Btk_FlatObjectGroupЗапросить количество объектов в группе без учета подгрупп можно через таблицу
Btk_ObjectGroupЗапросить количество подгрупп можно через таблицу
Btk_GroupTreeпо полюidParentи исключить запись, в которойidParentравняетсяidChild
Под операцией
Дополнительнореализуйте операциюЗарегистрировать объект в корневой группе, которая добавляет объект в корневую группу, для этого:Создайте новую операцию на тулбаре, укажите ей операцию-предка
Операция получает
ropтекущего объектаРегистрирует объект в корневой группе методом
Btk_ObjectGroupApi#registerпараметр
bpMultiGroupпередавать в значении1, т.к. на классе включена множественная группировка.параметр
bpMainGroupпередавать в значении1, так для объекта эта группа станет «Основной»для получение
idкорневой группы используйте кодBtk_ClassApi().load(Lbr_PublisherApi().idClass).get(_.idGroupRoot)
Объектные характеристики#
Добавьте в
odmклассаLbr_Publisherлогический атрибутbIsForeign-Зарубежное издательство, укажите ему свойство, что он является объектной характеристикой.Настройке карточку объектных характеристик для класса
Lbr_Publisher, зависящую от групп объекта.укажите нужный тип карточки в
odm.xmlobjectAttrCardType="group"
выведите закладку в карточке объекта (используйте выборку
Btk_ObjectGroupAvi#List_Tab).
Добавьте объектные характеристики, хранящиеся в json-контейнере, в карточке класса.
зайдите в карточку класса
Lbr_Publisherи откройте закладкуАтрибутывыполните операцию создать
заполните поля для нового атрибута:
системное имя = dSanctionBegin
наименование = Дата начала санкций
тип данных = Date
Тип атрибута = Basic
сохраните результат.
создайте второй атрибут:
системное имя = idJsonAuthor
наименование = Любимый автор издательства
тип данных = Long
Тип атрибута = RefObject
Ссылается на класс = выберите
Lbr_Author
Настройте вывод объектных характеристик на группах объекта.
Откройте интерфейс редактирования групп и закладку
Атрибуты группыи включите редактирование в спискеДля корневой группы добавьте атрибут
bIsForeignДля группы «Зарубежные издательства»
добавьте атрибут
dSanctionBeginпереопределите атрибут
bIsForeign, установите значение по умолчанию1. В предложенном диалоге согласитесь установить значение по умолчанию для всех объектов с перезаписью имеющихся значений.
Для группы «Отечественные издательства»
добавьте атрибут
idJsonAuthorпереопределите атрибут
bIsForeign, установите значение по умолчанию0. В предложенном диалоге согласитесь установить значение по умолчанию для всех объектов с перезаписью имеющихся значений.
После настройки на карточке об. характеристик будут доступны атрибуты:
bIsForeign- для всех объектов, при включении в группу «Зарубежные издательства» будет устанавливаться значение1, при включении в «Отечественные издательства» будет устанавливаться значение0dSanctionBegin- для объектов группы «Зарубежные издательства», снимите признакИспользовать для основных группidJsonAuthor- для объектов группы «Отечественные издательства», снимите признакИспользовать для основных групп
Под операцией
Дополнительносделайте операциюОбновить характеристики, которая будет обновлять значения характеристик объекта.Создайте новую операцию на тулбаре, укажите ей операцию-предка
Проверяем какое это издательство, получая значение характеристики
bIsForeignЕсли зарубежное:
проверяем текущее значение характеристики
dSanctionBegin, если оно заполнено, то выдаем сообщениеДля издательства <Наименование> уже введены санкции, начало санкций: <значение характеристики dSanctionBegin>если текущее значение
dSanctionBeginне заполнено, то заполняем текущей датой, и выдаем сообщениеДля издательства <Наименование> успешно введены санкции
Если отечественное:
проверяем текущее значение характеристики
idJsonAuthor, если оно заполнено, то выдаем сообщениеДля издательства <Наименование> уже выбран любимый автор: <headline для значение характеристики idJsonAuthor>если текущее значение
idJsonAuthorне заполнено, то открываем диалог выбора автора, и устанавливаем выбранное значение в характеристику
Примечание
Для получения значения характеристики, хранящейся в таблице класса используется стандартный способ, как и для других атрибутов класса.
Для получения значения json-характеристики используется метод
ru.bitec.app.btk.class_.attr.AttrApi#getAttrValue. Пример вызова:val dDate = Lbr_PublisherApi().getAttrValue(rop, "dSanctionBegin").asNDate
Для установки значения json-характеристики используется метод
ru.bitec.app.btk.class_.attr.AttrApi#setAttrValue. Пример вызова:Lbr_PublisherApi().setAttrValue(rop, "dSanctionBegin", NDate.now())