Дополнительные действия
AZykov (обсуждение | вклад) Нет описания правки |
AZykov (обсуждение | вклад) |
||
(не показано 5 промежуточных версий этого же участника) | |||
Строка 15: | Строка 15: | ||
#Создать контрол необходимого для отчёта типа. '''Выбрать controlMode = Custom.''' Настроить у контрола dataSource с необходимым способом получения данных, фильтрами и обработками. Удобнее всего начать с контрола с типом table, даже если целевой отчёт не должен быть таблицей. В таблице удобно протестировать создаваемый отчет, его фильтры и обработки. Уже после тестирования можно создать новый контрол другого типа и перенести все настройки в него | #Создать контрол необходимого для отчёта типа. '''Выбрать controlMode = Custom.''' Настроить у контрола dataSource с необходимым способом получения данных, фильтрами и обработками. Удобнее всего начать с контрола с типом table, даже если целевой отчёт не должен быть таблицей. В таблице удобно протестировать создаваемый отчет, его фильтры и обработки. Уже после тестирования можно создать новый контрол другого типа и перенести все настройки в него | ||
#Произвести мелкие настройки контрола, например разрешить или запретить сортировку и изменение состава колонок. Этот этап в целом является опциональным, перечень параметров, доступных для настройки можно найти в [[Отображение данных. Таблицы и карточки#Табличный контрол|статье по контролам]]. Обращаем внимание, что особые настройки контрола становятся доступными после сохранения контрола с определенным типом. Тип контрола после сохранения изменять нельзя. | #Произвести мелкие настройки контрола, например разрешить или запретить сортировку и изменение состава колонок. Этот этап в целом является опциональным, перечень параметров, доступных для настройки можно найти в [[Отображение данных. Таблицы и карточки#Табличный контрол|статье по контролам]]. Обращаем внимание, что особые настройки контрола становятся доступными после сохранения контрола с определенным типом. Тип контрола после сохранения изменять нельзя. | ||
В общем виде любой сложный отчёт состоит из двух частей: | В общем виде любой сложный отчёт состоит из двух частей: | ||
Строка 24: | Строка 23: | ||
Для простых отчётов, сервис может отсутствовать, например если данные для отчёта получаются напрямую из объектов опредленного класса и не требуется какие-либо сложные операции. | Для простых отчётов, сервис может отсутствовать, например если данные для отчёта получаются напрямую из объектов опредленного класса и не требуется какие-либо сложные операции. | ||
= Пример вывода данных из сервиса в контрол = | |||
=== Настройки контрола === | |||
{| class="wikitable" | |||
!Свойство | |||
!Значение | |||
!Комментарий | |||
|- | |||
|controlKind | |||
|table | |||
|Используется тип контрола Таблица как стандартный способ вывода отчетов | |||
|- | |||
|controlMode | |||
|custom | |||
|Режим custom означает, что контрол не привязан к конкретному классу и использует собственные настройки для отображения. | |||
|- | |||
|dataSource | |||
|<syntaxhighlight lang="json"> | |||
{ | |||
"action": { | |||
"method": "Control_getData", | |||
"request": { | |||
"parameters": {} | |||
}, | |||
"responsePath": "", | |||
"service": "creomate_tutorial.Server2Service" | |||
}, | |||
"kind": "action" | |||
} | |||
</syntaxhighlight> | |||
|Универсальный источник данных, получающий данные из сервиса Server2Service. Отдельного внимания заслуживает пустое значение в responsePath. Это означает, что данные из сервиса передаются не обёрнутые в какой-либо объект. | |||
|- | |||
|allowExport | |||
|True | |||
|Данная настройка разрешает экспорт данных пользователем в Excel, CSV и JSON. Для табличных отчётов полезно оставлять включенной | |||
|- | |||
|showToolbar | |||
|True | |||
|Включает отображение панели инструментов с полем поиска и кнопками экспорта | |||
|- | |||
|allowShowCard | |||
|False | |||
|Данная настройка запрещает открытие карточек по ссылкам | |||
|- | |||
|allowColumnChoose | |||
|False | |||
|Данная настройка разрешает произвольный выбор колонки. Эта настройка остаётся на усмотрение разработчика | |||
|- | |||
|allowColumnReorder | |||
|True | |||
|Данная настройка разрешает изменение порядка колонок в контроле. Эта настройка остаётся на усмотрение разработчика | |||
|- | |||
|allowColumnResize | |||
|True | |||
|Настройка разрешает изменение ширины колонок | |||
|- | |||
|allowSearchPanel | |||
|True | |||
|Включает отображение поля поиска в панели инструментов. Поиск "из коробки" работает только при использовании класса как источника данных. При использовании сервиса необходимо на стороне метода получить из Invocation параметры поиска и отфильтровать содержимое выдачи в соответствии с ними, т.е. поиск остаётся на усмотрение разработчика. | |||
|- | |||
|allowRowNumbers | |||
|True | |||
|Настройка включает отображение номеров строк | |||
|- | |||
|pageSize | |||
|20 | |||
|Настройка задаёт ограничение по количеству строк на одной "странице" отчёта | |||
|- | |||
|customColumns | |||
|<syntaxhighlight lang="json"> | |||
[ | |||
{ | |||
"caption": "Имя", | |||
"propertyName": "name" | |||
}, | |||
{ | |||
"caption": "valuex", | |||
"propertyName": "valuex" | |||
}, | |||
{ | |||
"caption": "Идентификатор", | |||
"propertyName": "id" | |||
} | |||
] | |||
</syntaxhighlight> | |||
|JSON, описывающий колонки для отображения. В поле caption задаётся заголовок для отображения пользователю. В поле propertyName задается имя свойства элемента коллекции | |||
|- | |||
|wordWrap | |||
|True | |||
|Настройка разрешает перенос строк, если они не помещаются в ширину колонки | |||
|} | |||
=== Исходный код сервиса === | |||
<syntaxhighlight lang="typescript"> | |||
import { GlobalUtils, Converter } from "./../../utils"; | |||
import { Service } from "./../../platform/core"; | |||
import { IInvocation } from "../../platform/model"; | |||
class Server2Service extends Service { | |||
constructor() { | |||
super("creomate_tutorial.Server2Service"); | |||
// onCreateCode | |||
this.load(); | |||
} | |||
async Control_getData(invocation_: IInvocation){ | |||
this.log.debug("control get start"); | |||
try{ | |||
this.log.debug({data: [{id: "123", name:"Test 1"}, {id:"124", name:"Test 2"}]}); | |||
return [{name:"Test 1", valuex:"1", id:"223"}, {name:"Test 2", valuex:"2", id:"2345"} ]; | |||
}catch(e){ | |||
this.log.exception("Control_getData", e); | |||
} | |||
} | |||
async onInit() { | |||
await super.onInit(); | |||
try { | |||
// onInitCode | |||
} | |||
catch (e) { | |||
this.log.exception("onInit", e); | |||
} | |||
} | |||
async onTimer() { | |||
await super.onTimer(); | |||
try { | |||
// onTimerCode | |||
} | |||
catch (e) { | |||
this.log.exception("onTimer", e); | |||
} | |||
} | |||
// declarationsCode | |||
// functionsCode | |||
} | |||
export default Server2Service; | |||
</syntaxhighlight> | |||
=== Пример настроенного контрола === | |||
[[Файл:Пример контрола с получением данных из сервиса.png|центр|1051x1051px|безрамки]] | |||
Текущая версия от 18:40, 13 марта 2025
Предыдущая статья курса: Работа с универсальным источником данных
Общая информация
В качестве отчётов, в рамках приложений на платформе Эра, выступают особым образом настроеные контролы. В платформе изначально предусмотрен достаточно исчерпывающий перечень видов контролов, которые закрывают подавляющее большинство задач по разработке отчёта. Полный список базовых видов контролов можно посмотреть в статье этого курса, посвещенной контролам.
Общий алгоритм разработки отчёта следующий:
- Определение источников данных для отчёта. Это могут быть данные объектов, перечислений, информация из внешней системы, константы и т.д.
- Определение логики построения отчёта и выбор способа сбора данных. На этом этапе необходимо понять, как из исходных данных собрать целевой отчёт и какой из инструментов платформы подойдет для этого лучше. Выбранный источник данных должен быть настроен в соответствующем контроле с помощью универсального источника данных, рассмотренного в предыдущей статье. Возможные варианты:
- Получение данных классов напрямую из хранилища. Фильтрация, группировка и преобразование данных выполняется на уровне dataSource
- Разработка сервиса, подготавливающего данные для отчёта
- Использование внешнего источника данных (URL)
- Если на шаге 2 был выбран сервис, то данный сервис необходимо разработать и протестировать
- Создать контрол необходимого для отчёта типа. Выбрать controlMode = Custom. Настроить у контрола dataSource с необходимым способом получения данных, фильтрами и обработками. Удобнее всего начать с контрола с типом table, даже если целевой отчёт не должен быть таблицей. В таблице удобно протестировать создаваемый отчет, его фильтры и обработки. Уже после тестирования можно создать новый контрол другого типа и перенести все настройки в него
- Произвести мелкие настройки контрола, например разрешить или запретить сортировку и изменение состава колонок. Этот этап в целом является опциональным, перечень параметров, доступных для настройки можно найти в статье по контролам. Обращаем внимание, что особые настройки контрола становятся доступными после сохранения контрола с определенным типом. Тип контрола после сохранения изменять нельзя.
В общем виде любой сложный отчёт состоит из двух частей:
- Сервис, который принимает Invocation с параметрами, реализует логику построения отчёта, совершает внутренние и внешние вызовы для сбора данных, подготавливает данные в структуру JSON и возвращает их.
- Контрол необходимого для отчёта типа, с набором необходимых фильтров, набором настроек интерфейса, облегчающих работу с отчётом, а также dataSource, сконфигурированный для работы с созданным сервисом.
Для простых отчётов, сервис может отсутствовать, например если данные для отчёта получаются напрямую из объектов опредленного класса и не требуется какие-либо сложные операции.
Пример вывода данных из сервиса в контрол
Настройки контрола
Свойство | Значение | Комментарий |
---|---|---|
controlKind | table | Используется тип контрола Таблица как стандартный способ вывода отчетов |
controlMode | custom | Режим custom означает, что контрол не привязан к конкретному классу и использует собственные настройки для отображения. |
dataSource | {
"action": {
"method": "Control_getData",
"request": {
"parameters": {}
},
"responsePath": "",
"service": "creomate_tutorial.Server2Service"
},
"kind": "action"
}
|
Универсальный источник данных, получающий данные из сервиса Server2Service. Отдельного внимания заслуживает пустое значение в responsePath. Это означает, что данные из сервиса передаются не обёрнутые в какой-либо объект. |
allowExport | True | Данная настройка разрешает экспорт данных пользователем в Excel, CSV и JSON. Для табличных отчётов полезно оставлять включенной |
showToolbar | True | Включает отображение панели инструментов с полем поиска и кнопками экспорта |
allowShowCard | False | Данная настройка запрещает открытие карточек по ссылкам |
allowColumnChoose | False | Данная настройка разрешает произвольный выбор колонки. Эта настройка остаётся на усмотрение разработчика |
allowColumnReorder | True | Данная настройка разрешает изменение порядка колонок в контроле. Эта настройка остаётся на усмотрение разработчика |
allowColumnResize | True | Настройка разрешает изменение ширины колонок |
allowSearchPanel | True | Включает отображение поля поиска в панели инструментов. Поиск "из коробки" работает только при использовании класса как источника данных. При использовании сервиса необходимо на стороне метода получить из Invocation параметры поиска и отфильтровать содержимое выдачи в соответствии с ними, т.е. поиск остаётся на усмотрение разработчика. |
allowRowNumbers | True | Настройка включает отображение номеров строк |
pageSize | 20 | Настройка задаёт ограничение по количеству строк на одной "странице" отчёта |
customColumns | [
{
"caption": "Имя",
"propertyName": "name"
},
{
"caption": "valuex",
"propertyName": "valuex"
},
{
"caption": "Идентификатор",
"propertyName": "id"
}
]
|
JSON, описывающий колонки для отображения. В поле caption задаётся заголовок для отображения пользователю. В поле propertyName задается имя свойства элемента коллекции |
wordWrap | True | Настройка разрешает перенос строк, если они не помещаются в ширину колонки |
Исходный код сервиса
import { GlobalUtils, Converter } from "./../../utils";
import { Service } from "./../../platform/core";
import { IInvocation } from "../../platform/model";
class Server2Service extends Service {
constructor() {
super("creomate_tutorial.Server2Service");
// onCreateCode
this.load();
}
async Control_getData(invocation_: IInvocation){
this.log.debug("control get start");
try{
this.log.debug({data: [{id: "123", name:"Test 1"}, {id:"124", name:"Test 2"}]});
return [{name:"Test 1", valuex:"1", id:"223"}, {name:"Test 2", valuex:"2", id:"2345"} ];
}catch(e){
this.log.exception("Control_getData", e);
}
}
async onInit() {
await super.onInit();
try {
// onInitCode
}
catch (e) {
this.log.exception("onInit", e);
}
}
async onTimer() {
await super.onTimer();
try {
// onTimerCode
}
catch (e) {
this.log.exception("onTimer", e);
}
}
// declarationsCode
// functionsCode
}
export default Server2Service;
Пример настроенного контрола

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