Skip to end of metadata
Go to start of metadata

Структура формы - это совокупность объектов, свойств, действий и связей между ними.

Объекты

При создании формы первоначально необходимо определить, какие объекты она будет отображать. Для каждого объекта формы нужно задать его класс.

Существует возможность объединять объекты в группы объектов. В этом случае в таблице будет показываться "декартово произведение" этих объектов (то есть для двух объектов - все пары, трех объектов - тройки и т.п.). 

В соответствии с порядком добавления групп объектов на форму образуется упорядоченный список групп объектов. Соответственно, последней группой для некоторого множества групп объектов будем называть группу из этого множества с максимальным порядковым номером в этом списке (то есть максимально позднюю). Аналогичным образом определяется последняя группа для множества объектов: сначала строится множество групп объектов, в которые входят эти объекты, затем для полученного множества групп объектов определяется последняя группа.

Каждый объект на форме в любой момент времени имеет текущее значение. Его изменение происходит либо в результате соответствующих действий пользователя в интерактивном представлении, либо "виртуально" в процессе чтения данных в статичном представлении.

Свойства и действия

После определения объектов на форму можно добавить свойства и действия, подставив эти объекты им на вход в качестве аргументов.

Добавление действий актуально только для интерактивного представления. В статичном представлении добавленные действия игнорируются.

Поведение свойств и действий с точки зрения их отображения на форме абсолютно одинаково, поэтому в дальнейшем в этом разделе будем использовать только термин свойство (для действий поведение абсолютно аналогично).


Группа отображения

Каждое свойство отображается ровно в одной из групп объектов на форме (будем называть ее группой отображения этого свойства). По умолчанию группой отображения является группа, последняя для множества объектов, которые передаются на вход этому свойству. При необходимости, разработчик может задать группу отображения явно (с определенными ограничениями при использовании в структурированном представлении)

Группы-в-колонки

По умолчанию, свойство отображается в своей группе отображения ровно один раз. При этом, в качестве значений объектов, который не находятся в группе отображения этого свойства (назовем их верхними), используются их текущие значения. Однако в платформе также существует возможность отображать одно свойство несколько раз таким образом, чтобы в качестве значений некоторых верхних объектов использовались не их текущие значения, а все наборы объектов (при таком отображении свойства образуется своего рода "матрица" - верхние объекты x объекты группы отображения). Соответственно, чтобы создать такую матрицу, необходимо при добавлении свойства на форму указать какие именно верхние объекты (а точнее группы объектов) необходимо использовать для создания колонок (будем называть эти группы объектов группами-в-колонки).

При определении группы отображения свойства группы-в-колонки игнорируются.

Группы свойств

Свойства на форме можно объединять в группы, которые, в свою очередь, используются в интерактивном (дизайне по умолчанию) и иерархическом представлениях формы. По умолчанию, привязка свойства к группе глобальна (то есть задается для свойства для всех форм сразу), однако, при необходимости, для отдельных форм эту привязку можно переопределить.

Настройки по умолчанию

Для свойств на форме существует большое количество настроек отображения в различных представлениях, абсолютное большинство из которых можно задавать не только непосредственно для свойства на форме, но и для самого добавляемого свойства (при его создании). Эти настройки будут настройками по умолчанию, то есть если настройка не задается явно для конкретного свойства на форме, то используется настройка самого свойства. При этом, эти настройки по умолчанию "наследуются" при использовании операторов композиции, выбора и предыдущего значения (то есть, если скажем для свойства f(a) задана ширина по умолчанию 10, то и свойство g(a) = f(a) IF h(a), также по умолчанию будет иметь ширину 10).

Фильтры

Для каждой формы разработчик может создать определенные фильтры, которые будут ограничивать список доступных к просмотру / выбору наборов объектов на форме.

Для задания фильтра необходимо указать свойство, которое будет использоваться в качестве критерия фильтрации. Фильтр будет применяться к таблице той группы объектов, которая является последней для множества объектов, передаваемых на вход этому свойству (то есть аналогично с определением группы отображения свойства). При этом будут показаны только те наборы объектов (ряды), для которых значения свойства не равняются NULL.

Сортировки

По умолчанию, во всех представлениях групп объектов наборы объектов отображаются в некотором недетерминированном порядке, который определяется конкретной реализацией платформы (чаще всего в качестве порядка используются внутренние идентификаторы). При необходимости, разработчик может задать этот порядок явно, указав список свойств на форме, которые будут использоваться в качестве сортировок. При этом для каждого свойства в этом списке можно задать по возрастанию или по убыванию должна идти сортировка (по умолчанию используется опция по возрастанию).

Значение NULL всегда считается наименьшим значением. 

Язык

Для создания новой формы и описания ее структуры предназначена инструкция FORM.

Примеры

 

 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
 CLASS Document;

// объявляем форму Документы
FORM documents 'Документы'
    OBJECTS d = Document // Добавляем один объект класса Document, по этому имени объект будет доступен в операторах DESIGN, SHOW, EXPORT, DIALOG и др.

    
    // ... добавляем свойства и фильтры на форму 

    LIST Document OBJECT d // помечаем что данная форма должна использоваться, когда необходимо выбрать документ, при этом объект d должен использоваться как возвращаемое значение
;
 
CLASS Item;

// объявляем форму Товар
FORM item 'Товар'
    OBJECTS i = Item PANEL // добавляем объект класса Item и помечаем, что он должен отображаться в панель (то есть видимо только одно значение)

    // ... добавляем свойства и фильтры на форму 

    EDIT Item OBJECT i // помечаем что данная форма должна использоваться, когда необходимо добавлять или редактировать товар
;

// объявляем форму со списком Товаров
FORM items 'Товары'
    OBJECTS i = Item

    // ... добавляем свойства и фильтры на форму 

    PROPERTIES(i) NEWSESSION NEW, EDIT // добавляем кнопки, которые будут создавать и редактировать товар, используя форму item
;

CLASS Invoice;
CLASS InvoiceDetail;

// объявляем форму печати инвойса
FORM printInvoice
    OBJECTS i = Invoice // добавляем объект класса инвойс, для которого будет идти печать

    // ... добавляем свойства и фильтры на форму 
;
  
// разбиваем определение формы на две инструкции (вторую инструкцию можно перенести в другой модуль)
EXTEND FORM printInvoice
    OBJECTS d = InvoiceDetail // добавляем строки инвойса, каждая из которых будет использоваться в отчете в качестве детализации

    // ... добавляем свойства и фильтры на форму 
;
print (Invoice invoice)  { PRINT printInvoice OBJECTS i = invoice; } // объявляем действие , при выполнении которого будет открываться форма печати инвойса

  • No labels

4 Comments

  1. Ты же понимаешь что в редактировании селектор и только для чтения это частные случаи первого пункта у которых действие пустое и выбора объекта по умолчанию. Кстати что она будет делать если я написал ON CHANGE EXEC и READONLY?

    То есть вообще гря редактирование - это просто клиентское событие, которое как и обычное событие вызывает действие, которое в свою очередь может быть обработкой по умолчанию, обработкой READONLY, SELECTOR или actionMapping,

    И вообще по сути должен быть подраздел События формы (клиентские события) - у которого варианты - Редактирование, Групповое редактирование, Редактирование WYS (Paste), Нажатие клавиши, и соответственно когда возникают, что вызывают / могут вызывать

  2. Ну начнем с того, что у нас сейчас в логике не так. То есть пустой ACTION на редактирование свойства, и выставленный маркер READONLY будут вести себя по разному.

    1. Это почему? С пустым ACTION'ом ничего не произойдет. И с readonly. Вопрос только с автостартом фильтра но он вроде тоже через клиентские события сделан. Так я не понял а что сейчас будет если readonly и on change прописать ?

  3. И вообще если подумать то события + действия (так как на форме они только так и вызываются через обработчики событий) - Controller, структура формы + сессии + свойства - model, а дизайн формы + алгоритм обновление (endApply на сервере, processFormChanges на клиенте) - View. Тут возможны варианты : структура формы - во view, или даже что более четко дизайн формы в model (собсно все равно, так как в классических языках нет разделения на свойства и структуры формы, куда там идет дизайн хрен поймешь). Хотя конечно главный идиотизм, в том что View - в большей степени алгоритм (физическая модель), а Model и Controller - логическая модель по этому сильно ориентироваться на паттерн MVC не стоит. Но разделить описание в этом направлении по моему стоит.