Блок свойств и действий
Блок свойств и действий инструкции 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
DISABLEIF propertyExpression
READONLYIF propertyExpression
CLASS propertyExpression
BACKGROUND propertyExpression
FOREGROUND propertyExpression
HEADER propertyExpression
FOOTER propertyExpression
COLUMNS [groupid] (groupName1, ..., groupNameM)
viewType
customView
OPTIONS propertyExpression
sessionScopeType
APPLY
OPTIMISTICASYNC
DRAW groupObjectName
insertPosition
ORDER [USER | FIXED] [DESC]
FILTER [USER | FIXED]
QUICKFILTER formPropertyName
PIVOT calcType
PIVOT LAST [DESC] (propertyExpression1, ..., propertyExpressionZ)
PIVOT FORMULA formulaStr (operand1, ..., operandM)
COLUMN
ROW
MEASURE
ON eventType actionId(param1, ..., paramZ) | { actionOperator }
EVENTID eventId
ATTR
EXTID extID
NOEXTID
EXTNULL
IN propertyGroup
imageSetting
STICKY
NOSTICKY
syncType
HINTNOUPDATE
HINTTABLE
Описание
Один блок 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- показывает значение объекта (для пользовательских классов - код объекта).INTERVAL- показывает интервал между значениями пары объектов одного и того же класса даты или времени.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
-
-
DISABLEIF propertyExpressionУказание свойства, определяющего недоступность добавляемого свойства (действия). Если значение этого свойства не равно
NULL, то добавляемое свойство (действие) будет недоступно. По поведению аналогично опцииDISABLE, только с дополнительным условием, зависящим от данных.-
propertyExpression
-
-
READONLYIF propertyExpressionУказание свойства, определяющего возможность редактирования добавляемого свойства (выполнения добавляемого действия). Если значение этого свойства не равно
NULL, то добавляемое свойство не будет иметь возможности редактирования, а добавляемое действие возможности быть выполненным. По поведению аналогично опцииREADONLY, только с дополнительным условием, зависящим от данных.-
propertyExpression
-
-
CLASS propertyExpressionУказание свойства, значение которого определяет CSS-классы (через пробел) элемента значения добавляемого свойства. Аналогично свойству
valueClassв инструкцииDESIGN.-
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- панельPOPUP- всплывающая панель
Если не указана, используется соответствующая опция из опций свойств. Если и она не указана, используется тип представления по умолчанию для группы отображения этого свойства или действия.
-
customViewУказание пользовательского представления значения добавляемого свойства. Может иметь один из следующих видов:
-
CUSTOM renderFunction [CHANGE [editFunction]] -
CUSTOM CHANGE [editFunction]Указание JavaScript функций, отвечающих за отображение (
renderFunction) и редактирование (editFunction) значения свойства. Каждая функция задается строковым литералом с ее именем. Если после ключевого словаCHANGEфункция не указана, используется механизм редактирования по умолчанию. -
SELECT selectTypeУказание того, что значение свойства должно отображаться и редактироваться в виде выбора из списка возможных значений. Тип элемента выбора
selectTypeзадается строковым литералом (например'dropdown','buttonGroup'). -
SELECT [AUTO]Указание того, что тип элемента выбора определяется автоматически. Ключевое слово
AUTOнеобязательно, может быть использовано для устранения неоднозначности. -
NOSELECTКлючевое слово, запрещающее автоматический выбор представления в виде списка возможных значений.
-
-
OPTIONS propertyExpressionУказание свойства, значение которого должно являться объектом класса JSON. Значение передается в настройки представления значения добавляемого свойства.
-
propertyExpression
-
-
sessionScopeTypeСессия, в которой должны выполняться операции работы с объектами (
NEW,EDIT,DELETE,NEWEDIT). Задается одним из ключевых слов:NEWSESSION- новая сессияNESTEDSESSION- вложенная сессияTHISSESSION- текущая сессия формы (значение по умолчанию). Имеет смысл использовать явно, чтобы отменить модификатор, заданный для всего блока.
-
APPLYМодификатор, указывающий, что изменение добавляемого свойства (или выполнение добавляемого действия) сразу применяется (фиксируется) в базе данных, а не остаётся в текущей сессии формы до явного применения. Может комбинироваться с
NEWSESSION/NESTEDSESSION(область сессии определяет, в какой сессии выполняется изменение, после чегоAPPLYего фиксирует) либо использоваться отдельно. -
OPTIMISTICASYNCМодификатор для добавляемого действия. Аналогичен такой же опции в инструкции
ACTION. -
insertPositionУказание позиции вставки свойства или действия в список свойств или действий на форме. Чаще всего используется в механизме расширения форм. Может задаваться одним из следующих способов:
-
AFTER formPropertyName -
BEFORE formPropertyNameСвойство или действие будет добавлено в структуру формы непосредственно перед (ключевое слово
BEFORE) или после (ключевое словоAFTER) указанного свойства или действия.-
formPropertyName
-
-
FIRSTКлючевое слово, указывающее на то, что свойство или действие будет добавлено в начало списка.
-
LASTКлючевое слово, указывающее на то, что свойство или действие должно будет добавлено в конец списка. В отличие от добавления по умолчанию, свойства или действия, вставленные с помощью
LAST, всегда будут располагаться после всех свойств или действий, добавленных в порядке объявления. -
DEFAULTКлючевое слово, указывающее на то, что свойство или действие добавляется в порядке объявления. Является значением по умолчанию.
-
-
ORDER [USER | FIXED] [DESC]Указание опции порядка для добавляемого свойства. Аналогично указанию свойства в блоке сортировок.
-
USERСвойство добавляется как пользовательская сортировка. Это поведение по умолчанию.
-
FIXEDСвойство добавляется как фиксированная сортировка.
-
DESCИспользуется сортировка по убыванию. Если не указано, используется сортировка по возрастанию.
-
-
FILTER [USER | FIXED]Указание опции фильтра для добавляемого свойства. Аналогично указанию свойства в блоке фиксированных фильтров.
-
USERСвойство добавляется как пользовательский фильтр. Это поведение по умолчанию.
-
FIXEDСвойство добавляется как фиксированный фильтр.
-
-
QUICKFILTER formPropertyNameУказание свойства, которое будет использоваться в обработках по умолчанию для быстрой фильтрации.
-
formPropertyName
-
-
PIVOT calcTypeУказание агрегирующей функции для значений добавляемого свойства при группировке строк (в том числе в виде представления сводная таблица).
-
calcTypeЗадаётся одним из ключевых слов:
SUM- сумма значенийMAX- максимум значенийMIN- минимум значений
-
-
PIVOT LAST [DESC] (propertyExpression1, ..., propertyExpressionZ)Указание того, что при группировке строк значение добавляемого свойства берётся из строки, последней в порядке значений перечисленных выражений.
-
DESCКлючевое слово, при указании которого используется обратный порядок.
-
propertyExpression1, ..., propertyExpressionZНепустой список выражений, задающих порядок строк.
-
-
PIVOT FORMULA formulaStr (operand1, ..., operandM)Указание того, что при группировке строк значение добавляемого свойства вычисляется по формуле из агрегированных значений самого свойства и перечисленных свойств-операндов.
-
formulaStrСтроковый литерал с арифметическим выражением (синтаксис math.js), в котором
$1- агрегированное значение добавляемого свойства, а$2, ..., $(M+1)- агрегированные значения свойствoperand1, ..., operandMсоответственно. -
operand1, ..., operandMСписок имён свойств / действий на форме, агрегированные значения которых доступны в формуле как
$2, ..., $(M+1).
-
-
COLUMN,ROW,MEASUREКлючевые слова, задающие начальное размещение добавляемого свойства в виде представления сводная таблица: в колонках (
COLUMN), рядах (ROW) или измерениях (MEASURE). Поэлементный аналог списковCOLUMNS,ROWSиMEASURESблока сводных таблиц. -
ON eventType actionId(param1, ..., paramZ) | { actionOperator }Указание действия, которое будет выполнено при наступлении указанного события формы .
-
eventTypeТип события формы. Задается одним из следующих ключевых слов:
-
CHANGE- попытка изменения значения добавляемого свойства (вызова добавляемого действия). -
CHANGE BEFORE/CHANGE AFTER- возникает непосредственно до (BEFORE) или после (AFTER) изменения значения добавляемого свойства. -
CHANGEWYS- попытка изменения непосредственно отображаемого значения свойства. Наступает при редактировании добавляемого свойства с помощью вставки текста (имеется ввиду Ctrl+V и аналогичные способы). -
GROUPCHANGE- попытка изменения значения свойства для всех объектов в таблице (групповое редактирование). -
EDIT- редактирование объекта, идущего на вход свойству. -
KEYPRESS key- нажатие пользователем клавишиkey, задаваемой строковым литералом. -
CONTEXTMENU [caption]- при указании этого типа события в контекстное меню свойства (действия) на форме будет добавлен пункт, выполняющий указанное действие. Также при необходимости можно задать заголовок этого пункта меню (строковый литерал). Если этого не сделать, то, по умолчанию, он будет равен заголовку действия.-
captionЗаголовок пункта в контекстном меню. Строковый литерал. Если заголовок не указан явно, то он будет равен заголовку вызываемого по событию действия.
-
-
-
actionId -
param1, ..., paramZСписок параметров действия. Каждый параметр задается именем объекта формы. Имя объекта, в свою очередь, задается простым идентификатором.
-
actionOperator
-
-
EVENTID eventIdУказание идентификатора события для добавляемого свойства (действия). Аналогично такой же опции в опциях свойств.
-
eventId
-
-
ATTRКлючевое слово. Используется только в иерархическом представлении. Указание того, что:
- при импорте из XML данные импортируется из аттрибутов тега, а не из дочернего тега.
- при экспорте в XML данные экспортируются в аттрибуты тега, а не в дочерний тег.
-
EXTID extIDУказание имени, которое будет использоваться для экспорта / импорта этого свойства. Используется только в структурированном представлении.
-
extIdСтроковый литерал.
-
-
NOEXTIDКлючевое слово, исключающее свойство из экспорта / импорта в структурированном представлении.
-
EXTNULLКлючевое слово. Используется только в иерархическом представлении. Указание того, что при экспорте в XML / JSON NULL значение не будет проигнорировано и будет выгружено:
- при экспорте в JSON как 'null'.
- при экспорте в XML как пустое значение.
-
IN propertyGroupУказание группы свойств и действий, которой принадлежит свойство (действие) на форме. Если эта опция не задана, то группой свойства (действия) на форме будет группа самого свойства.
-
propertyGroupимя группы свойств. Составной идентификатор.
-
-
imageSettingНастройка иконки, которая будет отображаться для свойства (действия) на форме. Эта опция, позволяет настроить отображение иконки вручную. Может иметь один из следующих видов:
-
IMAGE imageLiteralУказание иконки, которая будет отображаться в качестве иконки свойства (действия) на форме.
-
imageLiteralСтроковый литерал, значение которого определяет иконку.
-
-
IMAGE [AUTO]Указание того, что будет использован режим автоматической установки иконки. Ключевое слово
AUTOнеобязательно, может быть использовано для устранения неоднозначности. -
IMAGE propertyExpressionУказание свойства, значение которого определяет иконку. Позволяет задавать иконку динамически, в зависимости от данных.
-
NOIMAGEКлючевое слово, указывающее на то, что иконка свойства (действия) должна отсутствовать.
-
-
STICKY|NOSTICKYКлючевые слова, управляющие закреплением свойства (действия) в таблице. Аналогично такой же опции в опциях свойств.
-
syncTypeОпределяет, выполняется ли действие синхронно (
WAIT) или асинхронно (NOWAIT). Если опция не указана, используется соответствующая опция из опций свойств. -
HINTNOUPDATEКлючевое слово. Помечает, что закэшированные значения добавляемого свойства не должны обновляться при изменениях в сессии этой формы. Аналогично блоку
HINTNOUPDATEинструкцииFORM. -
HINTTABLEКлючевое слово. Помечает, что изменения добавляемого свойства при чтении данных этой формой должны материализовываться во временную таблицу. Аналогично блоку
HINTTABLEинструкцииFORM.
Примеры
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)
;