Редактируемые результаты запроса

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

Поле в результате запроса может быть изменено при выполнении следующих условий:

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

  • Переменная, из которой извлечено данное поле, не должна быть только для чтения.

  • Значение данного поля не должно получаться при помощи вычислений (используя простые функции, функции агрегации или выражения языка запросов).

  • Поле не должно извлекаться из таблицы, построенной при помощи вложенного запроса.

  • Все поля исходной таблицы должны выбираться в разделе ВЫБРАТЬ при помощи * или tableAlias.*  (это делать необязательно, если использовать поля обратной записи).

Редактируемые результаты запроса доступны только при редактировании значения переменной результатов запроса (data) контекста запроса.

Пример 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 ("Статус сервера устройства").

Если некоторые столбцы не редактируются из-за отсутствия полей обратной записи, это указывается в запросе отчет отладки.