Урок 5. Работа с JSON

Если вы прошли расширенные уроки, то можете смело переходить к разделу...

Работу с JSON будем рассматривать на примере карточки заказа, так как заказ имеет вложенные сущности и потенциально может иметь больше уровней вложенности. Теперь будет интересно увидеть, как изменится форма с использованием JSON-объекта.

Построение объекта

С формы заказа на сервер должен уходить JSON-объект подобного вида:

{
   "order_id":3,
   "client_id":7,
   "order_position":[
      {
         "order_position_id":1,
         "material_id":4,
         "quantity":25.00,
         "unit_price":200.00,
         "updated": true,
         "deleted": false
      },
      {
         "order_position_id":null,
         "material_id":2,
         "quantity":2.00,
         "unit_price":350.00,
         "updated": false,
         "deleted": false
      }
   ]
}

Так как JSON-объект представляет собой набор пар "ключ-значение", то нам необходимо создать структуру <Structure> типа Dictionary, которую присвоим в объект Variable:

Обратите внимание, что у тэга <MyObject> стоит атрибут ChangeForm со значением False - этот объект вспомогательный, форма не должна его учитывать при проверке наличия изменений.

Добавим необходимые ключи в структуру и укажем источники данных:

Для поля client_id из OrderPrimaryGetDataConnection необходимо получить одно единственное значение - для этого используем атрибут GetScalar со значением True.

Для поля order_position, содержащего массив объектов, используем конструкцию <Array> с преобразованием массива строк из ConvertDataConnection в массив словарей.

У тэгов <Parameter> и <DataConnection> появился атрибут Refresh, который определяет, будет ли обновляться значение у тэгов <Key> и <Array>, если изменится значение источника. Таким образом, значение объекта OrderDictionaryVariable не будет пересчитываться каждый раз, когда измениться какой-либо источник.

Для ручного пересчета OrderDictionaryVariable нужно использовать команду ValueSetCommand для вызова set-проперти Refresh у объекта Variable:

Чтобы словарь преобразовать к JSON-объекту, создадим команду типа SerializeToJsonCommand:

Команда SerializeToJsonCommand при формировании JSON-объекта преобразует все даты со временем к UTC относительно пользовательских настроек временной зоны.

Сохранение изменений

Добавьте кнопку сохранить, как делали на экране со списком ТМЦ.

Создадим SetDataConnection, который в параметре Model будет передавать на сервер сериализованный JSON-объект:

Создадим последовательность команд SaveSequentialCommand, в которую добавим команды на построение JSON_объекта и команду передачи данных на сервер:

Перейдем в серверный xml-файл и создадим запрос AppOrderSaveSqlQuery:

В запросе вызывается функция на сохранение заказа, в которую передаем json-объект с данными о заказе.

Подробно почитать о функциях и операторах, поддерживаемых PostgreSQL для работы с JSON, можете по ссылке.

Функция сохранения заказа будет иметь вид:

Сохранение в базу

Реализуйте функцию template.order_save(json). Функция должна возвращать order_id, который необходимо отлавливать на форме TemplateOrderEdit.xml и писать в параметр OrderId.

Не забывайте про работу с датой со временем и временные зоны. В JSON-строке на сервер даты со временем придут в UTC. Для приведения времени во временную зону сервера используйте функцию public.convert_date_json(timestamp without time zone).

Last updated