Запрос значения (REQUEST)
Оператор запроса значений создает действие, в котором запрос значения(ий) у пользователя отделен от непосредственно обработки этого значения(ий). Соответственно, этот оператор позволяет не выполнять запрос значения, если его результат заранее известен в контексте вызова (значение свойства System.requestPushed
равно TRUE
). Это, в свою очередь, позволяет в различных вариантах использования автоматически получать следующие возможности:
-
Асинхронный ввод
Если пользователь инициировал событие изменения свойства (
CHANGE
), а его обработка содержит ровно один запрос значения встроенного класса (самый частый случай), платформа не вызывает сразу эту обработку, а сначала запрашивает у пользователя ввод значения этого встроенного класса. Как только этот ввод завершен, пользователь может сразу продолжить свою работу, а результат ввода значения асинхронно (в новом потоке) посылается на сервер, где только в этот момент (а не при инициировании события) запускается обработка возникшего события. При этом (будем называть эту технику проталкиванием значения запроса), результат запроса помечается как заранее известный (значение свойстваSystem.requestPushed
устанавливаетсяTRUE
), а введенное значение записывается в специальное семейство свойствrequested
. Соответственно, так как это семейство свойств используется в качестве результата по умолчанию всех операторов ввода значения, эмулируется поведение, как если бы обработка была синхронной, однако при этом существенно улучшается эргономика изменения данных на форме (так, например, пользователь может продолжать ввод данных, не дожидаясь расчета всех свойств на форме). -
PASTE
Когда пользователь вставляет значение в ячейку свойства средствами операционной системы, платформа инициирует событие WYSIWYG изменения этого свойства (
CHANGEWYS
), и вызывает соответствующую ему обработку на сервере. При этом значение, которое вставил пользователь, проталкивается как значение запроса.
-
Обработка событий изменений (
CHANGEWYS
иCHANGE
) по умолчанию для композицииЕсли изменяемое свойство создано при помощи оператора композиции с одним аргументом (чаще всего названия или идентификатора), и для него явно не задана обработка события изменения, платформа автоматически создает эту обработку следующим образом:
-
CHANGE
У пользователя запрашивается объект класса значения свойства, которое используется в качестве аргумента, и изменяет значение этого свойства на полученный объект
-
CHANGEWYS
У пользователя запрашивается объект класса значения редактируемого свойства, после чего платформа находит первый попавшийся объект, для которого значение свойства композиции равно значению, введенному пользователем, и изменяет значение свойства, используемого в качестве аргумента, на этот объект.
к сведениюВ обоих случая под изменением свойства подразумевается вызов обработки события
CHANGE
, при этом значение, на которое изменяется свойство, проталкивается как значение запроса.Создание таких обработок по умолчанию позволяет использовать PASTE "из коробки" для свойств, значения которых принадлежат не только встроенным, но и пользовательским классам.
-
-
Обработка события групповой корректировки (
GROUPCHANGE
) по умолчаниюПо умолчанию обработка групповой корректировки создается следующим образом: сначала вызывается обработка
CHANGE
для текущих значений объектов, затем, если ввод не был отменен, эта же обработка вызывается для всех остальных значений объектов (подходящих под фильтр), при этом значение свойстваSystem.requestPushed
устанавливается равнымTRUE
(предполагается, что результат ввода не изменяется в процессе его обработки, таким образом эмулируется поведение, как если бы первое введенное значение проталкивалось).
Фактически, оператор запроса значений выполняет всего лишь две операции: проверяет на System.requestPushed
(проталкивание значения) для действия запроса значения, и на System.requestCanceled
(отмена значения) для действия обработки запроса, а также отвечает за определение возможности асинхронного ввода редактируемого свойства. В то же время использование этого оператора делает код понятнее и читабельнее, поэтому рекомендуется использовать именно его (вместо явных проверок и опций).
Также как и в остальных операторах ввода значения, в этом операторе можно задавать основное и альтернативное действия. Первое вызовется, если ввод был успешно завершен, второе - в обратном случае (если ввод был отменен). Соответственно, именно эти два действия в этом операторе отвечают за обработку значений запроса.
Неявное использование
Отметим, что все операторы ввода значения можно автоматически "оборачивать" в оператор запроса значения при использовании соответствующей опции (DO
). И так как, как правило, значение вводится при помощи одного оператора ввода, по умолчанию рекомендуются использовать именно эту опцию, а оператор запроса значения использовать явно только в действительно сложных случаях, например, если вариантов ввода может быть несколько (в зависимости от условия вызываются разные формы и т.п.)
Язык
Синтаксис оператора запроса значения описывается оператором REQUEST
.
Примеры
requestCustomer (Order o) {
LOCAL resultValue = STRING[100] ();
REQUEST {
ASK 'Choose from list?' DO
DIALOG customers OBJECTS c = resultValue() CHANGE;
ELSE
INPUT = resultValue() CHANGE;
} DO
customer(o) <- resultValue();
}
FORM request
OBJECTS o = Order
PROPERTIES(o) customer ON CHANGE requestCustomer(o) // будет работать, к примеру, групповая корректировка
;