Skip to end of metadata
Go to start of metadata

Блок свойств и действий инструкции FORM - добавление свойств и действий в структуру формы

Синтаксис

PROPERTIES [(cparam1, ..., cparamN)] [formPropertyOptions] formPropertyDecl1, ..., formPropertyDeclM

Каждый formPropertyDecl - это описание свойства или действия, добавляемого в структуру формы, которое имеет следующий синтаксис:

Если были указаны общие параметры блока PROPERTIES (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 - при попытке редактирования свойства, будет либо включен механизм фильтрации, либо событие просто проигнорируется.
  • 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

Строковый литерал.

IN propertyGroup

Указание группы свойств и действий, которой принадлежит свойство (действие) на форме. Если эта опция не задана, то группой свойства (действия) на форме будет группа самого свойства. 

propertyGroup - имя группы свойств. Составной идентификатор.

Примеры

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
 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), // добавляем свойства дата/время заказа, серия/номер заказа
               nameCustomer(o), // добавляем наименование покупателя, которое по умолчанию будет доступным для редактирования
                                     // при этом, при попытке его редактирования, будет вызываться диалог по выбору покупателя - форма, для которой установлен параметр LIST customer
               note(o), // добавляем примечание
               sum(o) READONLY // добавляем сумму по заказу без возможности редактирования, так как оно автоматически считается на основе суммы строк                                     
                         
    OBJECTS d = OrderDetail // добавляем объект строка заказа
    PROPERTIES(d) // все свойства в этом блоке будут иметь вход строка заказа
                  index READONLY, // добавляем порядковый номер строки и делаем, чтобы его нельзя было редактировать
                  nameSku, // добавляем наименование
                  quantity, price, sum, // добавляем количество, цена, сумму
                  NEW, // добавляем предопределенное действие NEW, которое добавляет новую строку заказа
                  DELETE // добавляем действие, которое будет удалять строку заказа
    FILTERS order(d) == o // указываем, что должны показываться только строки, относящиеся к данному заказу
  
    OBJECTS s = Sku // добавляем объект sku, в который мы будем выводить итоги по каждому sku в заказе
    PROPERTIES(s) name READONLY // добавляем наименование , при этом делая пометку, что его нельзя редактировать на этой форме
     
    PROPERTIES quantity(o, s) // добавляем свойство, в котором будет показываться заказанное количество по sku в данном заказе
               ON CHANGE changeQuantity(o, s) // по умолчанию, несмотря на то, что свойство не помечено как READONLY, и при попытке его изменения ничего происходить не будет, так как quantity - это агрегированное свойство
                                                           // в данном случае делается пометка, что при попытке изменения будет вызвано действие changeQuantity
                                                           // в этом свойство написан алгоритм, который будет создавать/удалять строки заказа или изменять в них количество
               READONLYIF stopOrder(s) // делаем, чтобы свойство было недоступно для редактирования, в случае, если выставлен запрет на заказ по данному sku
               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 // все свойства в этом блоке недоступны для редактирования
    PROPERTIES(o) NEWSESSION NEW, EDIT, DELETE // добавляем предопределенные действия NEW и EDIT, которые будут вызывать форму order для добавления заказов
;
  
// создаем "отчет", в котором будут видны заказы за определенный интервал в разрезе покупателей в конкретном регионе
FORM orderReport 'Продажи по складам'
    OBJECTS interval = (dateFrom 'Дата (с)' = DATE, dateTo 'Дата (по)' = DATE) PANEL // объявляем группу объектов, состоящую из 2х объектов класса Дата с соответствующими заголовками, которая будет всегда отображаться в виде панели
    PROPERTIES dateFrom = VALUE(dateFrom), dateTo = VALUE(dateTo) // добавляем на форму свойства значений объектов даты, при помощи которых пользователь сможет выбирать даты
                                                                        // кроме того, присваиваем этим свойствам имена на форме dateFrom и dateTo соответственно
     
    OBJECTS r = Region PANEL // добавляем объект регион, по которому будет происходить фильтрация покупателей
    PROPERTIES(r) name SELECTOR // добавляем свойство наименование региона, при этом помечаем, что при его редактировании должен вызываться диалог по выбору региона, выбранное значение которого будет использовано как текущее значение
  
    OBJECTS c = Customer // добавляем объект покупатели
                         // специально не добавляем ни одного свойства, чтобы он был "невидимым", но он нужен для того, чтобы отображать покупателей в колонки
    FILTERS region(c) == r // ставим фильтр на то, чтобы покупатели были только из этого региона
  
    OBJECTS s = Sku // добавляем объект sku, в таблице которого и будет показываться основная информация
    PROPERTIES(s) name READONLY // добавляем наименование sku и не забываем сделать его READONLY, иначе пользователь сможет изменять наименования товара непосредственно в отчете
     
    PROPERTIES = [ GROUP SUM quantity(OrderDetail d) IF date(d) >= dateFrom AND date(d) <= dateTo BY sku(d), customer(d)](s, c) 
                // добавляем свойство, в котором рассчитана количество заказанного sku по покупателям за определенный интервал дат
               COLUMNS (c) // помечаем, что покупатели должны отображаться в колонки, при этом колонок будет столько же, сколько и рядов с учетом фильтров будет в объекте покупателя, и идти они будут в том же порядке
               HEADER name(c) // задаем, что в качестве заголовка колонок будет использоваться имя покупателя
;

  • No labels