Перейти к основному содержанию
`Ctrl`+`K`

# Создание 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.

  - Тег layout.

### Тег filter

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

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

  - Тег macros

  - Тег layout

### Тег 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` - флаг управляет активностью операции. Если флаг снят, операция не загружается в клиент и, соответственно, не отображается на панели управления, в меню и т.д.