AZykov (обсуждение | вклад) Нет описания правки |
AZykov (обсуждение | вклад) Нет описания правки |
||
(не показано 5 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
Предыдущая статья курса: [[ | Предыдущая статья курса: [[Задание 10. Обработка данных]] | ||
= Общая информация = | = Общая информация = | ||
'''Универсальный источник данных''' (dataSource) - это специализированная структура, описывающая способ получения данных для | '''Универсальный источник данных''' (dataSource) - это специализированная структура, описывающая способ получения данных для элементов управления (Controls). | ||
[[Файл:Использование dataSource на вкладке UI класса.png|мини|Использование dataSource на вкладке UI класса]] | |||
Любой контрол (таблица, карточка график и т.д.) может получать данные для отображения не только из хранилища (используется по-умолчанию), но и из сторонних источников. | |||
Примеры сторонних источников: | |||
Предыдущая статья курса: [[ | * '''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).

Любой контрол (таблица, карточка график и т.д.) может получать данные для отображения не только из хранилища (используется по-умолчанию), но и из сторонних источников.
Примеры сторонних источников:
- 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. Обработка данных