Открыть меню
Платформа Эра. Документация
Toggle preferences menu
Открыть персональное меню
Вы не представились системе
Your IP address will be publicly visible if you make any edits.

Работа с универсальным источником данных: различия между версиями

Материал из Платформа Эра. Документации
Нет описания правки
Нет описания правки
 
(не показано 5 промежуточных версий этого же участника)
Строка 1: Строка 1:
  Предыдущая статья курса: [[Работа с внешними системами. Возможности интеграции]]
  Предыдущая статья курса: [[Задание 10. Обработка данных]]


= Общая информация =
= Общая информация =


'''Универсальный источник данных''' (dataSource) - это специализированная структура, описывающая способ получения данных для различных компонентов приложения.  
'''Универсальный источник данных''' (dataSource) - это специализированная структура, описывающая способ получения данных для элементов управления (Controls).
[[Файл:Использование dataSource на вкладке UI класса.png|мини|Использование dataSource на вкладке UI класса]]
Любой контрол (таблица, карточка график и т.д.) может получать данные для отображения не только из хранилища (используется по-умолчанию), но и из сторонних источников.  


Следующая статья курса: ''[[Задание 10. Обработка данных]]''
Примеры сторонних источников:  


  Предыдущая статья курса: [[Работа с внешними системами. Возможности интеграции]]
* '''class''' - набор сущностей класса. По факту является вариантом по-умолчанию
* '''enum''' - содержимое перечисления (раздел Enum в приложении Builder)
* '''data''' - явно заданный константный массив данных
* '''code''' - выполнение произвольного фрагмента кода, возвращающее коллекцию значений для отображения
* '''action''' - выполнение метода любого микросервиса
 
Кроме указания источника данных, dataSource также позволяет задать правила фильтрации данных, выводимых контролом.
 
Пример использования dataSource для доступа к данным класса с фильтрацией: <syntaxhighlight lang="json">
{
    "kind": "class",
    "class_fullMultiName": "creomate_tutorial/contact/Contacts",
    "selection": {
        "filter": [
            "or",
            ["isnull",["parameter","place"]],
            ["==",["property","place_id"],["parameter","place"]]
        ]
    }
}
</syntaxhighlight>
 
Пример использования dataSource для доступа к данным из перечисления: <syntaxhighlight lang="json">
{
    "kind": "enum",
    "enum_fullName": "crm/TaskPriority"
}
</syntaxhighlight>
 
Пример использования dataSource для обращения к данным микросервиса: <syntaxhighlight lang="json">
{
    "kind": "action",
    "action":{
 
        "service":"creomate_tutorial.Server2Service",
        "method":"Control_getData",
        "request":{
 
            "id":["parameter", "id"],
            "parameters":{
 
                "paramName1":["parameter", "timeStart"],
                "paramName2":["parameter", "timeFinish"],
 
            }
 
        },
        "responsePath":"data"
 
    }
}
</syntaxhighlight>В данном примере, в свойства id, paramName1 ичё paramName2 передаются значения параметров из контрола с помощью связи.
 
Свойство reponsePath задает имя свойства в JSON'е ответа, из которого необходимо вернуть коллекцию. Пример сервиса
 
= Обработчики в универсальном источнике данных =
Универсальный источник данных, кроме параметров получения выборки, также позволяет проводить простые операции над данными во время их получения. Для обработки данных существует три опциональных параметра:
 
* postProcessItemCode - содержит код, применяемый к каждому элементу выборки. Позволяет модифицировать значения свойств данных при получении
* postFilterCode - содержит код, применяемый к каждому элементу выборки. Позволяет фильтровать выбираемые значения, должен возвращать true или false
* postProcessCollectionCode - содержит код, исполняемый после загрузки всей коллекции значений
 
 
Пример обработки коллекции с помощью dataSource:<syntaxhighlight lang="json">
{
    "kind": "class",
    "class_fullMultiName": "creomate_tutorial/contact/Contacts",
    "selection": {
        "filter": [
            "or",
            ["isnull",["parameter","place"]],
            ["==",["property","place_id"],["parameter","place"]]
        ]
    },
    "postProcessItemCode":"this.caption = this.name + ' '+ this.registrationDate",
    "postFilterCode":"return this.isActive",
    "postProcessCollectionCode":"console.log(this.length)"
}
</syntaxhighlight>В данном примере для каждого элемента коллекции собирается поле caption, элементы коллекции где this.isActive=False фильтруются, а после обработки всей коллекции в консоль пишется её длина.
 
Для postProcessItem и postFilter в качестве this передаются элементы коллекции, к свойствам которых можно обратиться. Для postProcessCollection в качестве this передаётся вся коллекция.
 
= Работа сервиса с универсальным источником данных =
На примере вызова сервиса Server2Service разберем детали работы с запросами от dataSource.
 
Структура dataSource для получения данных из сервиса:<syntaxhighlight lang="json">
{
    "kind": "action",
    "action":{
 
        "service":"creomate_tutorial.Server2Service",
        "method":"Control_getData",
        "request":{
 
            "id":["parameter", "id"],
            "parameters":{
 
                "paramName1":["parameter", "timeStart"],
                "paramName2":["parameter", "timeFinish"],
 
            }
 
        },
        "responsePath":"data"
 
    }
}
</syntaxhighlight>
 
 
Данный dataSource обращается к сервису Server2Service и вызывает его метод Control_getData.
 
Так же в сервис передаются два параметра. В коде ниже рассмотрим код сервиса, который обработает данный запрос:<syntaxhighlight lang="typescript">
import { GlobalUtils, Converter, EraRequest  } from "./../../utils";
import { PlatformServices, Service } from "./../../platform/core";
import { ITicket, ITickets } from "../model";
import { Tickets } from "../classes";
import { IBaseEntity, IDataUpdateParams } from "../../base/model";
import { EraEnvironment } from "../../../lowlevel";
import { IInvocation } from "../../platform/model";
 
 
class Server2Service extends Service {
    private _tickets: ITickets; //свойство класса, через которое мы будем доступаться к коллекции Tickets
   
    constructor() {
        super("creomate_tutorial.Server2Service");
       
        // onCreateCode
        this._tickets = new Tickets(this.context); //инициализируем коллекцию Tickets
     
        this.load();
    }
 
    async Control_getData(invocation_: IInvocation){
 
        try{
            const timeStart = invocation_.request?.parameters.paramName1;
            const timeFinish = invocation_.request?.parameters.paramName2;
            return {data: [{id: "123", name:"Test 1"}, {id:"124", name:"Test 2"}]};
 
        }catch(e){
 
            this.log.exception("Control_getData", e);
 
        }
 
    }
 
}
export default Server2Service;
</syntaxhighlight>
 
 
 
Метод Control_getData в качестве параметра получает Invocation, который содержит все данные о запросе, включая набор переданных параметров. Сервис возвращает объект со свойством data, в котором лежит коллекция записей с полями id и name.
 
Соответственно, в контрол будет выведено две записи с такими полями, если не настроена какая-либо фильтрация на стороне dataSource или самого контрола. На свойство data также указывает параметр responsePath в самой структуре dataSource, это означает что контрол должен использовать свойство data в качестве коллекции значений при получении ответа от сервиса.
 
Следующая статья курса: [[Разработка отчётов]]
 
  Предыдущая статья курса: [[Задание 10. Обработка данных]]
[[Категория:Курс "Разработка приложений"]]
[[Категория:Курс "Разработка приложений"]]

Текущая версия от 12:43, 12 марта 2025

Предыдущая статья курса: Задание 10. Обработка данных

Общая информация

Универсальный источник данных (dataSource) - это специализированная структура, описывающая способ получения данных для элементов управления (Controls).

Использование dataSource на вкладке UI класса

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

Примеры сторонних источников:

  • class - набор сущностей класса. По факту является вариантом по-умолчанию
  • enum - содержимое перечисления (раздел Enum в приложении Builder)
  • data - явно заданный константный массив данных
  • code - выполнение произвольного фрагмента кода, возвращающее коллекцию значений для отображения
  • action - выполнение метода любого микросервиса

Кроме указания источника данных, dataSource также позволяет задать правила фильтрации данных, выводимых контролом.

Пример использования dataSource для доступа к данным класса с фильтрацией:

{
    "kind": "class",
    "class_fullMultiName": "creomate_tutorial/contact/Contacts",
    "selection": {
        "filter": [
            "or",
            ["isnull",["parameter","place"]],
            ["==",["property","place_id"],["parameter","place"]]
        ]
    }
}

Пример использования dataSource для доступа к данным из перечисления:

{
    "kind": "enum",
    "enum_fullName": "crm/TaskPriority"
}

Пример использования dataSource для обращения к данным микросервиса:

{
    "kind": "action",
    "action":{

        "service":"creomate_tutorial.Server2Service",
        "method":"Control_getData",
        "request":{

            "id":["parameter", "id"],
            "parameters":{

                "paramName1":["parameter", "timeStart"],
                "paramName2":["parameter", "timeFinish"],

            }

        },
        "responsePath":"data"

    }
}

В данном примере, в свойства id, paramName1 ичё paramName2 передаются значения параметров из контрола с помощью связи.

Свойство reponsePath задает имя свойства в JSON'е ответа, из которого необходимо вернуть коллекцию. Пример сервиса

Обработчики в универсальном источнике данных

Универсальный источник данных, кроме параметров получения выборки, также позволяет проводить простые операции над данными во время их получения. Для обработки данных существует три опциональных параметра:

  • postProcessItemCode - содержит код, применяемый к каждому элементу выборки. Позволяет модифицировать значения свойств данных при получении
  • postFilterCode - содержит код, применяемый к каждому элементу выборки. Позволяет фильтровать выбираемые значения, должен возвращать true или false
  • postProcessCollectionCode - содержит код, исполняемый после загрузки всей коллекции значений


Пример обработки коллекции с помощью dataSource:

{
    "kind": "class",
    "class_fullMultiName": "creomate_tutorial/contact/Contacts",
    "selection": {
        "filter": [
            "or",
            ["isnull",["parameter","place"]],
            ["==",["property","place_id"],["parameter","place"]]
        ]
    },
    "postProcessItemCode":"this.caption = this.name + ' '+ this.registrationDate",
    "postFilterCode":"return this.isActive",
    "postProcessCollectionCode":"console.log(this.length)"
}

В данном примере для каждого элемента коллекции собирается поле caption, элементы коллекции где this.isActive=False фильтруются, а после обработки всей коллекции в консоль пишется её длина.

Для postProcessItem и postFilter в качестве this передаются элементы коллекции, к свойствам которых можно обратиться. Для postProcessCollection в качестве this передаётся вся коллекция.

Работа сервиса с универсальным источником данных

На примере вызова сервиса Server2Service разберем детали работы с запросами от dataSource.

Структура dataSource для получения данных из сервиса:

{
    "kind": "action",
    "action":{

        "service":"creomate_tutorial.Server2Service",
        "method":"Control_getData",
        "request":{

            "id":["parameter", "id"],
            "parameters":{

                "paramName1":["parameter", "timeStart"],
                "paramName2":["parameter", "timeFinish"],

            }

        },
        "responsePath":"data"

    }
}


Данный dataSource обращается к сервису Server2Service и вызывает его метод Control_getData.

Так же в сервис передаются два параметра. В коде ниже рассмотрим код сервиса, который обработает данный запрос:

import { GlobalUtils, Converter, EraRequest  } from "./../../utils";
import { PlatformServices, Service } from "./../../platform/core";
import { ITicket, ITickets } from "../model";
import { Tickets } from "../classes";
import { IBaseEntity, IDataUpdateParams } from "../../base/model";
import { EraEnvironment } from "../../../lowlevel";
import { IInvocation } from "../../platform/model";


class Server2Service extends Service {
    private _tickets: ITickets; //свойство класса, через которое мы будем доступаться к коллекции Tickets
    
    constructor() {
        super("creomate_tutorial.Server2Service");
        
        // onCreateCode
        this._tickets = new Tickets(this.context); //инициализируем коллекцию Tickets
       
        this.load();
    } 

    async Control_getData(invocation_: IInvocation){

        try{
            const timeStart = invocation_.request?.parameters.paramName1;
            const timeFinish = invocation_.request?.parameters.paramName2;
            return {data: [{id: "123", name:"Test 1"}, {id:"124", name:"Test 2"}]};

        }catch(e){

            this.log.exception("Control_getData", e);

        }

    }

}
export default Server2Service;


Метод Control_getData в качестве параметра получает Invocation, который содержит все данные о запросе, включая набор переданных параметров. Сервис возвращает объект со свойством data, в котором лежит коллекция записей с полями id и name.

Соответственно, в контрол будет выведено две записи с такими полями, если не настроена какая-либо фильтрация на стороне dataSource или самого контрола. На свойство data также указывает параметр responsePath в самой структуре dataSource, это означает что контрол должен использовать свойство data в качестве коллекции значений при получении ответа от сервиса.

Следующая статья курса: Разработка отчётов
Предыдущая статья курса: Задание 10. Обработка данных