Урок 6. Практика разработки. Часть 3#

В данном уроке мы рассмотрим:

  1. Диалог с пользователем

  2. Мультиселект (множественный выбор)

  3. Группировка объектов

  4. Объектные характеристики

Диалог с пользователем#

Диалоги позволяют задавать вопросы пользователю и получать от него ответы на эти вопросы.

Руководство разработчика: Выборки # Диалоги

Мультиселект#

Мультиселект - возможность выбрать несколько строк в списках или деревьях.

Руководство разработчика: Выборки # Мультиселект

Руководство разработчика: Выборки # Диалоги # Форма в режиме выбора значения

Группировка объектов#

Группировка используется для систематизации хранения объектов и удобства восприятия пользователем, так же группировка позволяет массово управлять характеристиками и настройками объектов класса.

Руководство разработчика: Сервисные возможности для классов # Группировка

Объектные характеристики#

Характеристика – это качественное или количественное свойство объекта. Характеристиками в системе являются специальные атрибуты, которые содержат дополнительную пользовательскую информацию.

Руководство разработчика: Сервисные возможности для классов # Объектные характеристики

Практические задания#

Диалог с пользователем#

  1. В классе Lbr_Publisher добавьте диалог, в котором у пользователя запрашивается подтверждение на удаление объекта.

  2. Для заказов Lbr_InOrder и Lbr_OutOrder на закладках с детализацией реализуйте следующую логику для операции «Создать»:

  • при нажатии на иконку операции открывается список книг в режиме выбора

  • если пользователь выбрал книгу и подтвердил выбор, то создается новая запись в детализации заказа.

Мультиселект#

  1. Для заказов на закладке «Состав» измените работу операции «Создать» на мультиселект:

    • В Api классов Lbr_OutOrderDet и Lbr_InOrderDet реализуйте метод регистрации записи. Метод принимает id заказа и id книги, осуществляет поиск записи в с такими идентификаторами заказа и книги в классе, если запись есть, то возвращает ее id, если записи нет, то создает ее и возвращает ее id.

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

  2. В списке книг (Lbr_Book#List) реализовать операцию подбора книг в заказы:

    • создать на тулбаре новую операцию

    • при нажатии на операцию создается диалог с произвольными кнопками, текст диалога В какой тип заказа добавить выбранные книги?, список кнопок:

      • Возврат

      • Выдача

      • Отмена

    • Если пользователь нажал «Отмена», то выполнение операции завершается без дальнейших действий.

    • Если пользователь выбрал «Возврат» или «Выдача», то открывается список заказов в режиме выбора с мультиселектом (Возврат - список Lbr_InOrder, Выдача - список Lbr_OutOrder).

    • Для каждого выбранного заказа выполняется следующая логика:

      • обходим все выделенные книги и регистрируем их для заказа методом регистрации созданном в пункте 1.

Группировка объектов#

  1. Включите группировку для класса Lbr_Publisher

    • в odm укажите тип группировки «Множественная»

    • переформируйте исходный код и таблицы

    • соберите проект.

  2. Настройте дерево групп:

    • Под корневой группой создайте 2 подгруппы:

      • Зарубежные издательства

      • Отечественные издательства

  3. Выведите закладку с группами объекта в карточке (отображение Card).

  4. Активируйте в выборке Lbr_Publisher#List операцию Дополнительно (имя метода extraOperations).

  5. Под операцией Дополнительно создайте новую операцию Статистика текущей группы, выводящую статистику по группе, о количестве объектов в группе и количестве подгрупп.

    • Создайте новую операцию на тулбаре, укажите ей операцию-предка

    • Для определения текущей группы используйте getVar("idGroup#")

    • Используя диалоги, вывести на экран информацию вида:

      Количество объектов в группе: 42
      Количество объектов без учета подгрупп: 1
      Количество подгрупп: 10
      
    • Запросить количество объектов в группе можно через таблицу Btk_FlatObjectGroup

    • Запросить количество объектов в группе без учета подгрупп можно через таблицу Btk_ObjectGroup

    • Запросить количество подгрупп можно через таблицу Btk_GroupTree по полю idParent и исключить запись, в которой idParent равняется idChild

  6. Под операцией Дополнительно реализуйте операцию Зарегистрировать объект в корневой группе, которая добавляет объект в корневую группу, для этого:

    • Создайте новую операцию на тулбаре, укажите ей операцию-предка

    • Операция получает rop текущего объекта

    • Регистрирует объект в корневой группе методом Btk_ObjectGroupApi#register

      • параметр bpMultiGroup передавать в значении 1, т.к. на классе включена множественная группировка.

      • параметр bpMainGroup передавать в значении 1, так для объекта эта группа станет «Основной»

      • для получение id корневой группы используйте код Btk_ClassApi().load(Lbr_PublisherApi().idClass).get(_.idGroupRoot)

Объектные характеристики#

  1. Добавьте в odm класса Lbr_Publisher логический атрибут bIsForeign - Зарубежное издательство, укажите ему свойство, что он является объектной характеристикой.

  2. Настройке карточку объектных характеристик для класса Lbr_Publisher, зависящую от групп объекта.

    • укажите нужный тип карточки в odm.xml

      objectAttrCardType="group"
      
    • выведите закладку в карточке объекта (используйте выборку Btk_ObjectGroupAvi#List_Tab).

  3. Добавьте объектные характеристики, хранящиеся в json-контейнере, в карточке класса.

    • зайдите в карточку класса Lbr_Publisher и откройте закладку Атрибуты

    • выполните операцию создать

    • заполните поля для нового атрибута:

      • системное имя = dSanctionBegin

      • наименование = Дата начала санкций

      • тип данных = Date

      • Тип атрибута = Basic

    • сохраните результат.

    • создайте второй атрибут:

      • системное имя = idJsonAuthor

      • наименование = Любимый автор издательства

      • тип данных = Long

      • Тип атрибута = RefObject

      • Ссылается на класс = выберите Lbr_Author

  4. Настройте вывод объектных характеристик на группах объекта.

    • Откройте интерфейс редактирования групп и закладку Атрибуты группы и включите редактирование в списке

    • Для корневой группы добавьте атрибут bIsForeign

    • Для группы «Зарубежные издательства»

      • добавьте атрибут dSanctionBegin

      • переопределите атрибут bIsForeign, установите значение по умолчанию 1. В предложенном диалоге согласитесь установить значение по умолчанию для всех объектов с перезаписью имеющихся значений.

    • Для группы «Отечественные издательства»

      • добавьте атрибут idJsonAuthor

      • переопределите атрибут bIsForeign, установите значение по умолчанию 0. В предложенном диалоге согласитесь установить значение по умолчанию для всех объектов с перезаписью имеющихся значений.

    • После настройки на карточке об. характеристик будут доступны атрибуты:

      • bIsForeign - для всех объектов, при включении в группу «Зарубежные издательства» будет устанавливаться значение 1, при включении в «Отечественные издательства» будет устанавливаться значение 0

      • dSanctionBegin - для объектов группы «Зарубежные издательства», снимите признак Использовать для основных групп

      • idJsonAuthor - для объектов группы «Отечественные издательства», снимите признак Использовать для основных групп

  5. Под операцией Дополнительно сделайте операцию Обновить характеристики, которая будет обновлять значения характеристик объекта.

    • Создайте новую операцию на тулбаре, укажите ей операцию-предка

    • Проверяем какое это издательство, получая значение характеристики 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())