Урок 7. Практика разработки. Часть 4#

Цель данного урока познакомить слушателя с различными возможностями классов и выборок

Сервис универсальных коллекций (v-collection)#

Универсальные коллекции - это коллекции, для которых в качестве мастера могут выступать объекты разных классов.

Для изучения смотри:

Денормализация классов-деревьев#

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

Для изучения смотри:

Режимы редактирования выборки#

Для отображения имеется 3 варианта редактируемости, которые указываются в свойстве отображения editMode в разметке (файле avm):

  • edit - Разрешено редактирование данных. Можно запретить редактирование

  • notEdit - Запрещено редактирование данных. Можно разрешить редактирование

  • readOnly - Запрещено редактирование данных.

Для редактируемых списков доступна операция allowEdit, которая меняет режим редактирования.

Передача параметров в выборку#

Передача параметров в выборку - способ передачи данных между выборками, которые не зависят друг от друга. По умолчанию такая передача используется при открытии карточки, в которую передаются id объекта и режим редактирования.

В передаче дополнительных параметров при создании объекта в карточке используется метод insert_Params(), который можно переопределить для расширения списка параметров без переопределения всего метода создания.

Для изучения смотри:

Клонируемые операции#

Операции, которые размножаются по результату запроса. Запрос для размножения операции может быть указан в аннотации @Oper в свойстве cloneQuery или в разметке в блоке oper в свойстве cloneQuery

Результат запроса должен содержать поля:

  • sName - системное имя операции

  • nImageIndex - номер изображения для операции

  • sCaption - отображаемое имя операции

Получение значений атрибутов запроса происходит как обычное получение атрибутов через getVar. Для получения значений атрибутов выборки, откуда была вызвана операция, необходимо добавить super$ к имени атрибута

Фильтры#

Фильтрация набора данных производится с помощью макроса фильтра, генерируемого на основе условий с признаком isExpression="true" или непосредственного добавления условия в запрос получения данных. Имя макроса берется из разметки фильтра и подставляется с префиксом &. Например, для <macros name="DefFltReferenceMacro"> в запрос необходимо подставить &DefFltReferenceMacro, в котором будет сгенерирован макрос фильтра.

По умолчанию для справочников и классов с группировкой в Dvi генерируется подстановка макроса фильтра в запрос с помощью prepareSelectStatement

Разметка для фильтров аналогична разметке атрибутов. Атрибуты фильтров выводятся на панели фильтрации и имеют свои собственные сеттеры. По умолчанию для справочников генерируется фильтр «Отображать неиспользуемые». В свойствах фрейма можно отключить отображение панели фильтрации с помощью свойства frame «filter.isVisible» (по умолчанию отображение отключено для карточки).

Пример условия для частичного совпадения по тексту

expression="upper(t.sCode) like upper('%'||:flt_sCode||'%')"

Практика#

Создание универсальной коллекции#

  • Создайте v-collection Lbr_Link - «Связанные документы» с указанными ниже атрибутами

    name

    attribute-type

    caption

    Дополнительно

    gidDoc

    Varchar

    Документ

    Ссылается на класс Lbr_Document. Невидимый атрибут, ссылочный на мастера

    gidLink

    Varchar

    Связанный документ

    Ссылается на класс Lbr_Document

  • Подключите универсальную коллекцию к классам:

    • Lbr_InAct - Приходная накладная

    • Lbr_InOrder - Возврат книг

    • Lbr_OutOrder - Выдача книг

  • Выведите отображение связанных документов в закладки документов, настроенные на тип объекта.

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

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

Создание денормализации#

  • Создайте журнал Lbr_CatalogTree - «Денормализованное дерево каталога»

  • Подключите Lbr_CatalogTree в качестве денормализации для Lbr_Catalog

  • Заполните денормализацию для существующей структуры каталогов, используя метод updateDenormFull из TreeDenormApi

  • Для поддержания в актуальном состоянии структуры денормализованного дерева вызовите в серверных процедурах создания(api#insert), удаления(api#delete) и установки предка(api#setidPatent) класса Lbr_CatalogTree процедуры updateDenormAfterFlush(idpObject: NLong) и deleteDenormAfterFlush(idpObject: NLong) из апи денормализованного дерева.

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

Режимы редактирования выборки#

  • Для закладки книг из Урока 3 выведите операцию редактирования в списке allowEdit

Передача параметров в выборку#

  • Для закладки книг из Урока 3 выведите операции:

    • Удалить.

    • Создать.

    При создании записи в нее сразу должен подставиться каталог, для которого отображается перечень книг. Подстановка должна работать как при создании в списке для редактируемого списка, так и при создании в карточке для нередактируемого списка

Добавление фильтров#

  • Добавьте в Lbr_BookAvi#List фильтры:

    • ISBN

    • Наименование

    • Издатель - фильтр по трем точкам. Выбор издателя из умолчательного списка

Для добавления фильтров необходимо:

  1. В разметке в блоке filter объявить или дописать условия в macros. Для ссылочного фильтра необходимо так же объявить HL атрибут для вывода пользователю.

  2. Для HL атрибута ссылочного фильтра в Avi объявите сеттер, используя вызов метода Lbr_PublisherAvi.processIdHLEvent() с простановкой результата в ссылочный атрибут фильтра.

  3. Добавьте макрос фильтра к запросу данных, используя prepareSelectStatement, если его там нет.