Блок свойств и действий
Блок свойств и действий инструкции FORM - добавление свойств и де йствий в структуру формы.
Синтаксис
PROPERTIES [(cparam1, ..., cparamN)] [formPropertyOptions] formPropertyDecl1, ..., formPropertyDeclM
Каждый formPropertyDecl
- это описание свойства или действия, добавляемого в структуру формы, которое имеет следующий синтаксис:
Если были указаны общие параметры блока (cparam1, ..., cparamN)
:
[[alias1] [caption1] =] [ACTION] formPropertyId1 [formPropertyOptions1], ..., [[aliasK] [captionK] =] [ACTION] formPropertyIdK [formPropertyOptionsK]
Если же общие параметры блока указаны не были, то:
[[alias1] [caption1] =] formMappedProperty1 [formPropertyOptions1], ..., [[aliasK] [captionK] =] formMappedPropertyK [formPropertyOptionsK]
Каждый formMappedProperty
это описание реализации свойства или действия, добавляемого на форму, которое имеет один из следующих синтаксисов
[ACTION] formPropertyId(param1, ..., paramN1)
formPropertyExpression
{ formActionOperator }
Каждый formPropertyOptions
- это опции свойства или действия, добавляемого в структуру формы. Они могут указываться друг за другом в произвольном порядке:
changeType
SHOWIF propertyExpression
READONLYIF propertyExpression
BACKGROUND propertyExpression
FOREGROUND propertyExpression
HEADER propertyExpression
FOOTER propertyExpression
COLUMNS [groupid] (groupName1, ..., groupNameM)
viewType
NEWSESSION | NESTEDSESSION
DRAW groupObjectName
BEFORE formPropertyName
AFTER formPropertyName
QUICKFILTER formPropertyName
ON eventType actionId(param1, ..., paramZ) | { actionOperator }
ATTR
EXTID extID
IN propertyGroup
Описание
Один блок PROPERTIES
добавляет свойства и действия в структуру формы. Для добавления одного свойства (действия) необходимо указать его идентификатор, а также указать, значения каких объектов формы будут передаваться этому свойству (действию) в качестве аргументов. Иногда удобно перечислить эти объекты формы для всего блока PROPERTIES
. Это можно сделать, указав общие параметры блока. В этом случае при добавлении свойства (действия) нужно указывать только его идентификатор, а в качестве аргументов будут браться общие параметры.
Каждое добавляемое в структуру формы свойство (действие) должно иметь имя на форме, уникальное в пределах формы. Это имя может задаваться либо явно, либо оно будет формироваться из имени свойства и передаваемых ему параметров - имен объектов, перечисленных через запятую.
FORM order
OBJECTS o=Order
PROPERTIES(o) d=date, Order.number;
В приведенном примере именами добавленных свойств date
и Order.number
будут d
и number(o)
.
При добавлении свойства (действия) в структуру формы можно указать набор его опций. Также можно указать общие опции для всего блока PROPERTIES
. Если какая-то из опций задана как для всего блока, так и для конкретного объявления, то будет использоваться значение опции для объявления.
Во всех выражениях и контекстно-зависимых операторах-действиях в качестве параметров можно использовать имена уже объявленных объектов на форме.
Параметры
-
cparam1, ..., cparamN
Список общих параметров блока. Каждый параметр задается именем объекта формы. Если этот список задан, то при добавлении свойства (действия) нужно указывать только ег о идентификатор без параметров. Имя объекта задается простым идентификатором.
-
alias
Имя добавляемого свойства или действия на форме. Простой идентификатор. Если имя не задано, то именем свойства (действия) на форме будет имя самого свойства (без имени пространства имен и сигнатуры) вместе с параметрами - именами объектов, перечисленными через запятую и заключенными в скобки.
-
caption
Заголовок добавляемого свойства или действия на форме. Строковый литерал. Если заголовок не задан, то заголовком свойства (действия) на форме будет заголовок самого свойства.
В текущей реализации платформы, если имя и заголовок не заданы одновременно, то при использовании выражений и операторов-действий =
- обязательно (то есть f(a,b)
, но =a*b+5
)
-
formPropertyId
Идентификатор свойства или действия, добавляемого в структуру формы.
Также в этом правиле, вместо идентификаторов свойств / действий, можно использовать операторы работы с объектами:
VALUE
- показывает значение объекта (для пользовательских классов - код объекта).NEW
- создание нового объекта.EDIT
- редактирование объекта.DELETE
- удаление объекта.NEWEDIT
- создание и редактирование нового объекта.
При этом для операторов
NEW
,EDIT
,NEWEDIT
, также как и для идентификаторов свойств / действий, можно в квадратных скобках явно указывать класс, объект которого будет добавляться / редактироваться (напримерNEW[A]
). -
ACTION
Ключевое слово. Если задано, то считается, что в
formPropertyId
задается действие. Если не задано, первоначально считается, что вformPropertyId
задается свойство, и только если оно не найдено, что вformPropertyId
задается действие. -
param1, ..., paramNk
Список параметров добавляемых свойств или действий. Каждый параметр з адается именем объекта формы. Количество указываемых параметров должно совпадать с количеством параметров добавляемого свойства или действия. Не указываются, если заданы общие параметры блока. Имя объекта, в свою очередь, задается простым идентификатором.
-
formPropertyExpression
Выражение, добавляемое в структуру формы.
-
formActionOperator
Контекстно-зависимый оператор-действие, добавляемый в структуру формы
Опции свойства или действия
-
changeType
Указание стандартных обработок событий изменений свойства или действия. Задается одним из ключевых слов:
CHANGEABLE
- вызывается соответствующая обработка возникшего события. Является значением по умолчанию. Имеет смысл использовать явно только в случае, когда для всего блока задан какой-то другой модификатор, а для одного конкретного свойства необходимо его убрать.READONLY
- при попытке редактирования свойства, будет либо включен механизм фильтрации, либо событие просто проигнорируется.DISABLE
- свойство недоступно для редактирования.SELECTOR
- при попытке редактирования свойства, будет вызван диалог для изменения текущего значения объекта (а не значения свойства). Применимо только для свойств с одним параметром.
-
SHOWIF propertyExpression
Указание свойства, определяющего видимость на форме добавляемого свойства или действия. Если значение этого свойства будет равно
NULL
, то добавляемое свойство (действие) не будет отображаться. Не может использоваться одновременно с опциейHEADER
.-
propertyExpression
-
-
READONLYIF propertyExpression
Указание свойства, определяющего возможность редактирования добавляемого свойства (выполнения добавляемого действия). Если значение этого свойства будет равно
NULL
, то добавляемое свойство не будет иметь возможности редактирования, а добавляемое действие возможности быть выполненным. По поведению аналогично опцииREADONLY
, только с дополнительным условием зависящим от данных.-
propertyExpression
-
-
BACKGROUND propertyExpression
Указание свойства, определяющего цвет фона ячейки значения добавляемого свойства (действия). Свойство может иметь как тип
COLOR
(в этом случае, будет использоваться его значение), так и любой другой тип. В таком случае, если значение не равняетсяNULL
, то будет использоваться в качестве фона цвет по умолчанию, хранящийся в глобальном свойствеSystem.defaultBackgroundColor
(задаваемый в настройках) или желтый (если цвет по умолчанию не задан).-
propertyExpression
-
-
FOREGROUND propertyExpression
Указание свойства, определяющего цвета текста ячейки значения добавляемого свойства (действия). Свойство может иметь как тип
COLOR
(в этом случае, будет использоваться его значение), так и любой другой тип. В таком случае, если значение не равняетсяNULL
, то будет использоваться цвет текста по умолчанию, хранящийся в глобальном свойствеSystem.defaultForegroundColor
(задаваемый в настройках) или красный (если цвет по умолчанию не задан).-
propertyExpression
-
-
HEADER propertyExpression
Указание свойства, определяющего заголовок колонки добавляемого свойства (действия). В качестве заголовка будет взято возвращаемое значение этого свойства. Если же возвращаемое значение равно
NULL
, то добавляемое свойство (действие) будет автоматически скрыто.-
propertyExpression
-
-
FOOTER propertyExpression
Указание свойства, определяющего колонтитул добавляемого свойства (действия). Используется только в печатном представлении формы.
-
propertyExpression
-
-
COLUMNS [groupid] (groupName1, ..., groupNameM)
Указание верхних групп объектов, значения которых будут формировать набор колонок для отображения добавляемого свойства (действия). Чаще всего, вместе с опцией
COLUMNS
используется опцияHEADER
, чтобы задать заголовки этим колонкам.groupid
Идентификатор группы колонок. Строковый литерал. Если для нескольких добавляемых свойств (действий) указывается опция
COLUMNS
с одинаковым набором групп объектов, то по умолчанию сначала будут располагаться все колонки одного свойства (действия), а затем другого. Чтобы сгруппировать колонки разных свойств (действий) по значению верхних объектов, можно задать им одинаковый строковый идентификатор группы колонок. В этом случае колонки для разных свойств (действий) будут чередоваться.-
groupName1, ..., groupNameM
Список имен верхних групп объектов. Каждое имя задается простым идентификатором.
-
DRAW groupObjectName
Указание имени группы объектов на форме, в таблице которой будет отображаться добавляемое свойство или действие.
-
groupObjectName
Имя группы объектов. Простой идентификатор.
-
-
viewType
Указание типа представления добавляемого свойства или действия:
GRID
- колонка таблицыTOOLBAR
- тулбарPANEL
- панель
Если не указана, используется соответствующая опция из опций свойств. Если и она не указана, используется тип представления по умолчанию для группы отображения этого свойства или действия.
-
NEWSESSION
|NESTEDSESSION
Модификаторы, указывающие, что операции работы с объектами (
NEW
,EDIT
,DELETE
,NEWEDIT
) должны выполняться в новой (вложенной) сессии. -
BEFORE formPropertyName
|AFTER formPropertyName
Указание того, что свойство или действие должно быть добавлено в структуру формы перед (ключевое слово
BEFORE
) или после (ключевое словоAFTER
) уже добавленного свойства или действия. Чаще всего используется в механизме расширения форм.-
formPropertyName
-
-
QUICKFILTER formPropertyName
Указание свойства, которое будет использоваться в обработках по умолчанию для быстрой фильтрации.
-
formPropertyName
-
-
ON eventType actionId(param1, ..., paramZ) | { actionOperator }
Указание действия, которое будет выполнено при наступлении указанного события формы .
-
eventType
Тип события формы. Задается одним из следующих ключевых слов:
-
CHANGE
- попытка изменения значения добавляемого свойства (вызова добавляемого действия). -
CHANGEWYS
- попытка изменения непосредственно отображаемого значения свойства. Наступает при редактировании добавляемого свойства с помощью вставки текста (имеется ввиду Ctrl+V и аналогичные способы). -
GROUPCHANGE
- попытка изменения значения свойства для всех объектов в таблице (групповое редактирование). -
EDIT
- редактирование объекта, идущего на вход свойству. -
CONTEXTMENU [caption]
- при указании этого типа события в контекстное меню свойства (действия) на форме будет добавлен пункт, выполняющий указанное действие. Также при необходимости можно задать заголовок этого пункта меню (строковый литерал). Если этого не сделать, то, по умолчанию, он будет равен заголовку действия.-
caption
Заголовок пункта в контекстном меню. Строковый литерал. Если заголовок не указан явно, то он будет равен заголовку вызываемого по событию действия.
-
-
-
actionId
-
param1, ..., paramZ
Список параметров действия. Каждый параметр задается именем объекта формы. Имя объекта, в свою очередь, задается простым идентификатором.
-
actionOperator
-
-
ATTR
Ключевое слово. Используется только в иерархическом представлении. Указание того, что:
- при импорте из XML данные импортируется из аттрибутов тега, а не из дочернего тега.
- при экспорте в XML данные экспортируются в аттрибуты тега, а не в дочерний тег.
-
EXTID extID
Указание имени, которое будет использоваться для экспорта / импорта этого свойства. Используется только в структурированном представлении.
-
extId
Строковый литерал.
-
-
EXTNULL
Ключевое слово. Используется только в иерархическом представлении. Указание того, что при экспорте в XML / JSON NULL значение не будет проигнорировано и будет выгружено:
- при экспорте в JSON как 'null'.
- при экспорте в XML как пустое значение.
-
IN propertyGroup
Указание группы свойств и действий, которой принадлежит свойство (действие) на форме. Если эта опция не задана, то группой свойства (действия) на форме будет группа самого свойства.
-
propertyGroup
имя группы свойств. Составной идентификатор.
-
Примеры
CLASS Order;
date = DATA DATE (Order);
time = DATA TIME (Order);
number = DATA INTEGER (Order);
series = DATA BPSTRING[2] (Order);
note = DATA ISTRING[255] (Order);
CLASS OrderDetail;
order = DATA Order (OrderDetail) NONULL DELETE;
date(OrderDetail d) = date(order(d));
index (OrderDetail d) = PARTITION SUM 1 ORDER d BY order(d) CHARWIDTH 4;
sku = DATA Sku (OrderDetail);
nameSku (OrderDetail d) = name(sku(d));
quantity = DATA NUMERIC[10,2] (OrderDetail);
price = DATA NUMERIC[10,2] (OrderDetail);
sum = DATA NUMERIC[12,2] (OrderDetail);
sum (Order o) = GROUP SUM sum(OrderDetail d) BY order(d);
quantity (Order o, Sku s) = GROUP SUM quantity(OrderDetail d) BY order(d), sku(d);
lastDetail (Order o, Sku s) = GROUP MAX OrderDetail d BY order(d), sku(d);
changeQuantity (Order o, Sku s) {
INPUT n = NUMERIC[10,2] DO {
IF lastDetail(o, s) THEN {
IF n THEN
quantity(OrderDetail d) <- n WHERE d == lastDetail(o, s);
ELSE
DELETE OrderDetail d WHERE d == lastDetail(o, s);
} ELSE IF n THEN {
NEW d = OrderDetail {
order(d) <- o;
sku(d) <- s;
quantity(d) <- n;
}
}
}
}
stopOrder = DATA BOOLEAN (Sku);
onStock = DATA NUMERIC[10,2] (Sku);
ordered = DATA NUMERIC[10,2] (Sku);
CLASS Customer;
name = DATA ISTRING[100] (Customer);
FORM customers
OBJECTS c = Customer
PROPERTIES(c) READONLY name
LIST Customer OBJECT c
;
customer = DATA Customer (Order);
nameCustomer (Order o) = name(customer(o));
customer(OrderDetail d) = customer(order(d));
CLASS Region;
name = DATA STRING[100] (Region);
region = DATA Region (Customer);
// объявляем форму заказы
FORM order 'Заказ'
OBJECTS o = Order PANEL // добавляем объект заказ на форму
PROPERTIES VALUE(o), // добавляем идентификатор заказа в базе данных
// добавляем свой ства дата/время заказа, серия/номер заказа
date(o), time(o), series(o), number(o),
// добавляем наименование покупателя, которое по умолчанию будет доступным для редактирования
// при этом, при попытке его редактирования, будет вызываться диалог по выбору покупателя -
// форма, для которой установлен параметр LIST customer
nameCustomer(o),
note(o), // добавляем примечание
// добавляем сумму по заказу без возможности редактирования,
// так как оно автоматически считается на основе суммы строк
sum(o) READONLY
OBJECTS d = OrderDetail // добавляем объект строка заказа
PROPERTIES(d) // все свойства в этом блоке будут иметь вход строка заказа
// добавляем порядковый номер строки и делаем, чтобы его нельзя было редактировать
index READONLY,
nameSku, // добавляем наименование
quantity, price, sum, // добавляем количество, цена, сумму
// добавляем предопределенное действие NEW, которое добавляет новую строку заказа
NEW,
DELETE // добавляем действие, которое будет удалять строку заказа
// указываем, что должны показываться только строки, относящиеся к данному заказу
FILTERS order(d) == o
// добавляем объект sku, в который мы будем выводить итоги по каждому sku в заказе
OBJECTS s = Sku
// добавляем наименование, при этом делая пометку, что его нельзя редактировать на этой форме
PROPERTIES(s) name READONLY
// добавляем свойство, в котором будет показываться заказанное количество по sku в данном заказе
PROPERTIES quantity(o, s)
// по умолчанию, несмотря на то, что свойство не помечено как READONLY, и при попытке
// его изменения ничего происходить не будет, так как quantity - это агрегированное свойство
// в данном случае делается пометка, что при попытке изменения будет вызвано действие changeQuantity
// в этом свойство написан алгоритм, который будет создавать/удалять строки заказа
// или изменять в них количество
ON CHANGE changeQuantity(o, s)
// делаем, чтобы свойство было недоступно для редактирования, в случае,
// если выставлен запрет на заказ по данному sku
READONLYIF stopOrder(s)
// кроме того, подсвечиваем в таком случае эту ячейку своим фоном,
// чтобы пользователь заранее видел такие позиции
BACKGROUND stopOrder(s)
EDIT Order OBJECT o // помечаем форму, как форму для редактирования заказов
;
EXTEND FORM order // расширяем форму при помощи концепции Mixin
// добавляем на форму свойство текущего остатка перед количеством в заказе
PROPERTIES onStock(s) BEFORE quantity(d),
// добавляем на форму количество уже заказанного товара в рамках всех заказов
ordered(s) BEFORE quantity(d)
;
FORM orders 'Заказы'
OBJECTS o = Order
// все свойства в этом блоке недоступны для редактирования
PROPERTIES(o) READONLY VALUE, date, number
// добавляем предопределенные действия NEW и EDIT, которые будут вызывать форму order для добавления заказов
PROPERTIES(o) NEWSESSION NEW, EDIT, DELETE
;
// создаем "отчет", в котором будут видны заказы за определенный интервал в разрезе покупателей в конкретном регионе
FORM orderReport 'Продажи по складам'
// объявляем группу объектов, состоящую из 2х объектов класса Дата с соответствующими заголовками,
// которая будет всегда отображаться в виде панели
OBJECTS interval = (dateFrom 'Дата (с)' = DATE, dateTo 'Дата (по)' = DATE) PANEL
// добавляем на форму свойства значений объектов даты, при помощи которых пользователь сможет выбирать даты
// кроме того, присваиваем этим свойствам имена на форме dateFrom и dateTo соответственно
PROPERTIES dateFrom = VALUE(dateFrom), dateTo = VALUE(dateTo)
// добавляем объект регион, по которому будет происходить фильтрация покупателей
OBJECTS r = Region PANEL
// добавляем свойство наименование региона, при этом помечаем, что при его редактировании должен вызываться
// диалог по выбору региона, выбранное значение которого будет использовано как текущее значение
PROPERTIES(r) name SELECTOR
OBJECTS c = Customer // добавляем объект покупатели
// специально не добавляем ни одного свойства, чтобы он был "невидимым",
// но он нужен для того, чтобы отображать покупателей в колонки
FILTERS region(c) == r // ставим фильтр на то, чтобы покупатели были только из этого региона
// добавляем объект sku, в таблице которого и будет показываться основная информация
OBJECTS s = Sku
// добавляем наименование sku и не забываем сделать его READONLY, иначе пользователь сможет изменять
// наименования товара непосредственно в отчете
PROPERTIES(s) name READONLY
// добавляем свойство, в котором рассчитано количество заказанного sku по покупателям в определенный интервал дат
PROPERTIES =
[GROUP SUM quantity(OrderDetail d) IF date(d) >= dateFrom AND date(d) <= dateTo BY sku(d), customer(d)](s, c)
// помечаем, что покупатели должны отображаться в колонки, при этом колонок будет столько же,
// сколько и рядов с учетом фильтров будет в объекте покупателя, и идти они будут в том же порядке
COLUMNS (c)
// задаем, что в качестве заголовка колонок будет использоваться имя покупателя
HEADER name(c)
;