Создание avm-файла для выборки без класса#

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

Первичное создание avm-файла#

  • После того, как вы добавили Avi-файл выборки в определенное место проекта: имя_модуля/src/main/scala/ru/bitec/app/имя_модуля/...

    Файл с разметкой необходимо добавить в каталог имеющий идентичный путь:

    имя_модуля/src/main/resources/ru/bitec/app/имя_модуля/...

    Внимание

    Структуры каталогов, после ../ru/bitec/app/имя_модуля/ должны полностью совпадать
    
  • Имя avm-файла обычно выбирают такое, же как и у файла выборки. Вместо суффикса Avi используем суффикс .avm, например Mct_Example.avm.xml

  • После создания файла добавляем туда начальный код:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <view xmlns="http://www.global-system.ru/xsd/global3-view-1.0" name="Mct_Example">
        
    </view>
    

    Свойство name тега view - имя выборки без суффиксов.

Создание разметки для соответствующего отображения#

После создания трейта в Avi-файле выборки создаем тег representation с таким же именем:

trait MyList extends List
<representation name="representationName" caption="representationCaption">
    <filter name="globalFilterName">
        <macros name="macrosName">
            <condition id="condName" logicalOperator="logicalOperator" attr="condAttr" operator="condOperator" isExpression="true\false" expression="someSqlExpression">
                <filterAttr attribute-type="fltAttrType" name="fltName" editorType="fltEditorType" order="fltAttrOrder" caption="fltCaption" defaultValue="defVal" isLastInLine="true\false">
                    <editor>
                        <...>
                    </editor>
                </filterAttr>
            </condition>
        </macros>
        <layout>
            <hBox>
                <vBox>
                    <attr name="fltName"/>
                    <vGroup>
                        <hBox>
                            <attr name="fltName"/>
                            <vBox>
                                <attr name="fltName"/>
                                <attr name="fltName"/>
                            </vBox>
                        </hBox>
                    </vGroup>
                </vBox>
            </hBox>
        </layout>
    </filter>
    <layout>
        <composerType>
            <frame filter.isVisible="true\false" toolBar.isVisible="true\false" caption="caption" description="description">
                <frameType>
                    <layout>
                        <...>
                    </layout>
                </frameType>
            </frame>
            <composerSettings/>
        </composerType>
    </layout>
    <bandGroups>
        <bandGroup name="bandGroupName" caption="Группа"/>
    </bandGroups>
    <attributes>
        <attr name="attrName" order="attrOrder" caption="attrCaption" editorType="attrEditorType" isVisible="true\false" bandGroup="attrBandGroupName" isReadOnly="true\false" isRequired="true\false" isLastInLine="true\false"/>
    </attributes>
    <operations>
        <oper name="operName" order="operOrder" caption="operCaption" isActive="true\false"/>
    </operations>
</representation>

Разберем код разметки:

Основной тег representation#

  • Содержит два основных свойства:

name#

name = «representationName» - где representationName - имя отображения, такое же как у трейта созданного вами ранее, например MyList

caption#

caption = «representationCaption» - где representationCaption описание отображения, которое увидит пользователь в шапке отображения.

  • Внутри тега representation содержатся несколько тегов -

Тег filter#

  • Содержит одно основное свойство name = «globalFilterName» - Системное имя фильтра.

  • Внутри тега filter присутствуют два тега разметки -

Тег macros#

Обязательный

  • Содержит одно свойство: name = «macrosName» , например DefFltReferenceMacro, нужен системе, для дальнейшей подстановки данных из фильтра при обработке selectStatement-запроса

  • Внутри можно определить несколько тегов condition

Тег condition#

  • Содержит несколько свойств:

    1. id - системное имя тега, используется в обработке метаданных выборки. Обязателен для заполнения. Должен быть уникальным в разрезе макроса.

      Обязателен

    2. logicalOperator - логический оператор(and\or). С помощью указанного оператора текущий condition будет добавлен к остальным условиям в selectStatement-запроса.

      Обязателен

    3. isExpression = «true\false» - свойство тега, определяющее каким образом будет обработан фильтр.

      Обязателен

      Так же от его значения зависит обязательность указания дальнейших свойств фильтра -

      • Если true:

        • expression - условие. Становится обязательным.

          По сути представляет из себя фрагмент sql условия, по которому происходит фильтрация:

          (:filter$flt_bShowNotUsed = 1 or
              (coalesce(t.bnotactive,0) = 0
                  and (t.dexpirydate is null or t.dexpirydate > current_date)
              )
          )
          
          1 = :filter$flt_bShowNotUsed
          

          Внимание

          Условие обязано быть заключено в скобки, если оно состоит из более чем одного логического элемента, иначе фильтрация итогового набора данных будет некорректна!

      • Если false:

        Тогда заполняем следующие, ставшие обязательными, атрибуты -

        1. attr = «condAttr» - атрибут, по которому происходит фильтрация.

          Если в selectStatement-запросе присутствуют несколько таблиц, тогда в качестве condAttr можно указать любой атрибут этих таблиц, используя соответствующий псевдоним. Например:

          attr="ot.someAttribute"
          
        2. operator = «condOperator» - оператор условия стандартного фильтра. Такой как:

          operator`="equals"/"not equals"/"less"/"greater"/"greater or equals"/"less or equals"/"in"/"between"/"like"/"is null"
          

          По этому значению соответствующим образом будет проведено сравнение attr и значения, переданного из фильтра.

  • Внутри тега может содержаться несколько тегов filterAttr

Тег filterAttr#

  • Содержит несколько свойств:

    1. name - системное имя фильтра. Позволяет получить значение фильтра как в scala-коде выборки, так и внутри sql-запросов, вызываемых из scala-кода выборок. Например:

      ...
      val bVal = getVar("flt_bShowNotUsed").asNNumber.toBoolean
      ...
      
      s"""
          select
              ...
          from ...
          where ...
          logicalOperator (:filter$flt_bShowNotUsed = 1 or
              (coalesce(t.bnotactive,0) = 0
                  and (t.dexpirydate is null or t.dexpirydate > current_date)
              )
          )
      """
      
    2. attribute-type - тип атрибута стандартного фильтра:

      • Varchar

      • Number

      • Long

      • Date

    3. editorType - определяет тип редактора, который будет отображаться при редактировании ячейки списка, дерева или отображаться в карточке:

      • edit - Редактор в строке

      • editButton - Редактор в строке с кнопкой

      • currency - Денежный редактор

      • lookup - Выпадающий список по запросу

      • combo - Фиксированный выпадающий список

      • check - Чекбокс

      • datePick - Редактор даты

      • dateTimePick - Редактор даты и времени

      • timePick - Редактор времени

      • memo - Memo - поле

      • icon - Изображение

      • calendar - Календарь

      • buttonsEdit - Редактор в строке с произвольными кнопками

      • imageCollection - Список картинок

      • tagLookup - Выпадающий список с мультивыбором

      • editPassword - Редактор пароля в строке

      • button - Кнопка

      • Если editorType = buttonsEdit, тогда внутри этого тега надо указать еще два тега editor и ref:

        <editor>
            <buttonsEdit canEditText="true\false" changeableAttr="someAttr">
                <buttons lookup="true\false" openCard="true\false" reset="true\false"/>
            </buttonsEdit>
        </editor>
        <ref class="someClass"/>
        

        Где:

        • canEditText - по умолчанию, в поля ввода типа «Редактор скнопкой» и «Редактор с произвольными кнопками» вводить текст запрещено. Установив данное свойство в True, возможно разрешить ввод текста в поле ввода.

        • changeableAttr - свойство содержит имя атрибута, в который будет записан идентификатор ссылочного объекта, при редактировании ссылочного поля. Каждому ссылочному атрибуту класса соответсвуют 2 атрибута выборки: значимый и отображаемый. Первый содержит идентификатор, а второй заголовок ссылочного объекта, который понятен пользователю. Значимый атрибут обычно является скрытым, а пользователь редактирует отображемый атрибут, при этом необходимо, что бы редактор отображаемого атрибута знал имя значимого атрибута.

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

    4. order - порядковый номер. С его помощью можно настроить положение фильтров относительно друг друга.

    5. isLastInLine - свойство, отвечающее за перенос последующих фильтров на новую строку.

    6. caption - видимое имя фильтра.

    7. defaultValue - умолчательное значение фильтра.

Тег filter layout#

Необязательный тег. Служит для более детальной настройки расположения фильтров на выборке.

  • На первом уровне, внутри тега layout должны располагаться следующие теги:

    • vSection - секция фильтров

    • vGroup - группа фильтров

    • vBox - вертикальный контейнер

    • hBox - горизонтальный контейнер

  • На втором и последующих уровнях вложенности могут быть расположены те же теги, а так же тег attr, у которого есть два базовых свойства:

    • name - системное имя фильтра.

    • caption - отображаемое имя фильтра, перекрывает видимое имя фильтра, указанное в теге filterAttr.

  • Комбинируя данные теги, вы можете гибко настроить фильтры выборки.

Тег representation layout#

  • Содержит внутри себя один тег:

    • simpleComposer - отображается только эта выборка, без подчиненных.

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

      Вложенный тег:

      <tabItems isVisible="false">
          <tabItem selection="gtk-Mct_ExampleAvi" representation="MyList" caption="Имя закладки, которое увидит пользователь"/>
          <tabItem.../>
          ...
      </tabItems>
      
    • dynamicComposer - подчиненные выборки будут отображаться как отдельная часть формы.

      Вложенный тег:

      <dynamicItems masterAlign="top/bottom/left/right/client">
          <dynamicItem selection="gtk-Mct_ExampleAvi" representation="MyList" align="..."/>
      </dynamicItems>
      
      • masterAlign - выравнивание главного фрейма. client - фрейм занимает всё доступное пространство компоновщика, не занятое фреймами с остальными типами выравнивания.

      • align - выравнивание детальной выборки.

    • tabDynamicComposer - сочетает в себе функционал tabComposer и dynamicComposer.

    • tabDynDetComposer - подчиненная выборка будет определятся автоматически, в зависимости от параметров этой выборки. Так же включает в себя функционал tabComposer.

    • Внутри любого из перечисленных тегов находится один обязательный тег:

      • frame

        Основные свойства:

        • filter.isVisible - будет ли видна панель фильтров на выборке.

        • toolBar.isVisible - будет ли виден тулбар с операциями на выборке.

        • caption - наименование фрейма. Отображается в первой строке заголовка фрейма или в заголовке формы, если фрейм является главным на форме

        • description - описание. Отображается второй строкой на расширенном заголовке фрейма.

        В этом теге, в свою очередь, устанавливает тег с указанием типа фрейма:

        • grid - данные отображаются списком.

        • tree - данные отображаются в виде дерева.

        • card - данные отображаются карточкой.

          В случае выбора карточного типа, внутри текущего тега можно установить тег layout, полностью аналогичный тегу layout фильтра.

Тег representation bandGroups#

Нужен для определения банд-групп. Содержит в себе набор тегов bandGroup:

<bandGroup name="bandName" caption="Имя банд-группы"/>

В дальнейшем определенные в этом теге банд-группы используются для объединения в этих группах атрибутов.

Тег representation attributes#

Содержит в себе набор тегов attr со следующими свойствами:

  • name - системное имя атрибута.

  • order - свойство управляет порядковым номером колонки в списке/дереве и порядковым номером поля ввода в карточке.

  • caption - Наименование атрибута.

  • editorType - аналогичен editorType фильтра.

  • bandGroup - свойство определяет группу объединения, в которую входит атрибут.

  • isVisible - свойство видимости атрибута.

  • isReadOnly - свойство редактируемости атрибута.

  • isRequired - свойство обязательности заполнения атрибута.

  • isLastInLine - аналогичен isLastInLine фильтра.

Тег representation operations#

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

Содержит в себе набор тегов oper со следующими базовыми свойствами:

  • name - системное имя операции. Имя должно совпадать с именем scala-метода (без учёта регистра) в Rep-классе, соответствующем отображению выборки.

  • order - порядковый номер операции. Свойство управляет положением операции на панели управления, в меню, и прочих контролах управления. По умолчанию равно 0. Если значения совпадают, порядок операций будет соответствовать порядку в XML.

  • caption - наименование операции. Отображается в меню и подменю.

  • isActive - флаг управляет активностью операции. Если флаг снят, операция не загружается в клиент и, соответственно, не отображается на панели управления, в меню и т.д.