Редактируемые результаты запроса
Результаты выполнения некоторых запросов можно редактировать. Это уникальное свойство языка запросов SberMobile, которое помогает собирать свойства различных объектов или настроек оборудования в одну таблицу (включая только необходимые поля, упорядочивая и формируя по группам) и редактировать эти свойства в удобной форме.
Поле в результате запроса может быть изменено при выполнении следующих условий:
Поле должно принадлежать переменной контекста, а не выходу функции. Это очевидно, т.к. вы можете записать новое значение для переменной назад в контекст, из которого она была взята, но невозможно "записать обратно" выход функции.
Переменная, из которой извлечено данное поле, не должна быть только для чтения.
Значение данного поля не должно получаться при помощи вычислений (используя простые функции, функции агрегации или выражения языка запросов).
Поле не должно извлекаться из таблицы, построенной при помощи вложенного запроса.
Все поля исходной таблицы должны выбираться в разделе ВЫБРАТЬ при помощи * или tableAlias.* (это делать необязательно, если использовать поля обратной записи).
Редактируемые результаты запроса доступны только при редактировании значения переменной результатов запроса ( |
Пример 1:
SELECT * FROM users.*:childInfo
Большинство полей в результате этого запроса могут быть изменены, потому что:
Они происходят напрямую из значения переменной userInfo,
Они доступны для записи в формате этой переменной,
Они не конвертируются при помощи функции или выражения в результате запроса,
Их отбор осуществляется при использовании * и без помощи ссылок на поля.
Некоторые поля (например, поле "Username") не доступны для редактирования, потому что они не определены как редактируемые в переменной childInfo.
Пример 2:
SELECT childInfo$firstname, childInfo$lastname FROM users.*:childInfo
Результат данного запроса не будет включать какие-либо редактируемые поля, потому что необходимые для выборки поля включаются в список прямо в разделе ВЫБРАТЬ, и поля обратной записи не определены в тексте запроса.
Поля обратной записи
Существует специальный способ выбрать определенное заранее количество полей, внося их в список раздела ВЫБРАТЬ и при этом сохраняя их доступными для редактирования. Для этого вам необходимо добавить три так называемых поля "обратной записи" к списку контекстных ссылок в запросе ВЫБРАТЬ. Данные поля помогут процессору запроса обнаружить, где должна быть сохранена информация при редактировании результатов запроса.
Формат ссылок на поля обратной записи выглядит следующим образом:
tableAlias.CONTEXT_ID, tableAlias.PARENT_ID, tableAlias.RECORD_INDEX
где tableAlias - альтернативное имя контекстной ссылки в разделе ОТ, CONTEXT_ID, PARENT_ID и RECORD_INDEX - определенные заранее константы. Просто внесите их в текст запроса как есть, без всяких изменений.
Данные поля обратной записи должны всегда использоваться совместно.
Пример:
Предположим, что мы имеем запрос, который отображает статистику трафика всех серверов устройств, доступных пользователю, выполняющему запрос:
SELECT
info.deviceServerInfo$owner,
info.deviceServerInfo$name,
info.deviceServerInfo$description,
info.deviceServerInfo$blocked,
info.status$servertods,
info.status$dstoserver,
FROM
users.*.deviceservers.*:status:deviceServerInfo as info
Результат данного запроса не может быть изменен, потому что выбранные поля находятся прямо в разделе ВЫБРАТЬ.
Чтобы сделать их редактируемыми, нужно добавить поля обратной записи к разделу ВЫБРАТЬ:
SELECT
info.deviceServerInfo$owner,
info.deviceServerInfo$name,
info.deviceServerInfo$description,
info.deviceServerInfo$blocked,
info.status$servertods,
info.status$dstoserver,
info.CONTEXT_ID,
info.PARENT_ID,
info.RECORD_INDEX
FROM
users.*.deviceservers.*:status:deviceServerInfo as info
Это позволит сделать описание сервера и результаты запроса редактируемыми. Остальные поля останутся доступными только для чтения, т.к. они заданы, как доступные только для чтения, в формате переменных deviceServerInfo ("Информация о сервере устройства") и status ("Статус сервера устройства").
Если некоторые столбцы не редактируются из-за отсутствия полей обратной записи, это указывается в запросе отчет отладки.