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

Результаты выполнения некоторых запросов можно редактировать. Это уникальное свойство языка запросов 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 ("Статус сервера устройства"):

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