Создание avm-файла для выборки без класса
Contents
Создание 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 описание отображения, которое увидит пользователь в шапке отображения.
Тег filter#
Тег macros#
Обязательный
Содержит одно свойство:
name
= «macrosName» , напримерDefFltReferenceMacro
, нужен системе, для дальнейшей подстановки данных из фильтра при обработке selectStatement-запросаВнутри можно определить несколько тегов
condition
Тег condition#
Содержит несколько свойств:
id
- системное имя тега, используется в обработке метаданных выборки. Обязателен для заполнения. Должен быть уникальным в разрезе макроса.Обязателен
logicalOperator
- логический оператор(and
\or
). С помощью указанного оператора текущийcondition
будет добавлен к остальным условиям вselectStatement
-запроса
.Обязателен
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:
Тогда заполняем следующие, ставшие обязательными, атрибуты -
attr
= «condAttr» - атрибут, по которому происходит фильтрация.Если в selectStatement-запросе присутствуют несколько таблиц, тогда в качестве condAttr можно указать любой атрибут этих таблиц, используя соответствующий псевдоним. Например:
attr="ot.someAttribute"
operator
= «condOperator» - оператор условия стандартного фильтра. Такой как:operator`="equals"/"not equals"/"less"/"greater"/"greater or equals"/"less or equals"/"in"/"between"/"like"/"is null"
По этому значению соответствующим образом будет проведено сравнение
attr
и значения, переданного из фильтра.
Внутри тега может содержаться несколько тегов
filterAttr
Тег filterAttr#
Содержит несколько свойств:
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) ) ) """
attribute-type
- тип атрибута стандартного фильтра:Varchar
Number
Long
Date
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
- свойство содержит системное имя класса, на который ссылается данный атрибут. Это свойсво используется фильтром, для открытия формы выбора значения ссылочного атрибута, при формировании условия фильтрации.
order
- порядковый номер. С его помощью можно настроить положение фильтров относительно друг друга.isLastInLine
- свойство, отвечающее за перенос последующих фильтров на новую строку.caption
- видимое имя фильтра.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
- флаг управляет активностью операции. Если флаг снят, операция не загружается в клиент и, соответственно, не отображается на панели управления, в меню и т.д.