Skip to end of metadata
Go to start of metadata

Этот оператор создает действие, которое открывает форму в интерактивном представлении.

Управление потоком

Существует два режима работы оператора:

  • Синхронный (WAIT) - ожидает момента, пока пользователь не закроет форму, и только после этого, записав все результаты выполнения, передает управление следующему за ним действию.
  • Асинхронный (NOWAIT) - передает управление следующему за ним действию сразу после открытия формы на клиенте.

По умолчанию режим работы оператора - синхронный. 

Расположение формы

Открываемая форма может быть показана двумя способами:

  • Как окно (FLOAT)- форма показывается в виде плавающего окна.
  • Как закладка (DOCKED) - форма открывается в виде закладки в системном окне System.forms.

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

В текущей реализации платформы форма, показываемая как окно, всегда модальная, поэтому режим "асинхронное окно" не поддерживается.

Управление системными действиями

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

Диалоговая форма

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

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

Также как и в остальных операторах ввода значения, в диалоговой форме этого оператора можно:

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

Диалоговая форма оператора доступна только в синхронном режиме.

Дополнительные возможности

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

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

Язык

Для открытия формы в интерактивном представлении используется оператор SHOW. Для показа формы в режиме диалога используется оператор DIALOG.

Примеры

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 date = DATA DATE (Order);
FORM showForm
    OBJECTS dateFrom = DATE, dateTo = DATE PANEL
    PROPERTIES VALUE(dateFrom), VALUE(dateTo)
    
    OBJECTS o = Order
    FILTERS date(o) >= dateFrom, date(o) <= dateTo
;

testShow ()  { 
    SHOW showForm OBJECTS dateFrom = 2010_01_01, dateTo = 2010_12_31;
    
    NEWSESSION {
        NEW s = Sku {
            SHOW sku OBJECTS s = s FLOAT;
        }
    }
}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
 FORM selectSku
    OBJECTS s = Sku
    PROPERTIES(s) id
;

testDialog  { 
    DIALOG selectSku OBJECTS s INPUT DO {
        MESSAGE 'Selected sku : ' + id(s);
    }
}

sku = DATA Sku (OrderDetail);
idSku (OrderDetail d) = id(sku(d));

changeSku (OrderDetail d)  { 
    DIALOG selectSku OBJECTS s = sku(d) CHANGE;
    
    //равносильно первому варианту
    DIALOG selectSku OBJECTS s = sku(d) INPUT NULL CONSTRAINTFILTER DO {
        sku(d) <- s;
    }
}

  • No labels