ReportDesigner
C#
SQL
Технические вопросы
5.x

работа с BPMonlineReportDesigner

Здравствуйте.
Делаю отчет средствами BPMonlineReportDesigner
Возникла необходимость написать сложный запрос где EntitySchemaQuery не подойдет,
но можно использовать класс Select
как мне загрузить его в дата сет

 

DataSet ds = report.CreateDataSet();
ds.Tables["Facility"].Load(report.UserConnection, query, false);


и второй более важный как можно использовать пользовательский дата сет. Который сформирован под нужный мне запрос из БД ?

 

Нравится

11 комментариев

Если я правильно понимаю вопрос, то:

1. [csharp]
using (DBExecutor dbExecutor = report.UserConnection.EnsureDBConnection()) {
ds.Tables["Facility"].Load(select.ExecuteReader(dbExecutor));
}
[/csharp]

2. [csharp]
report.DataSource = ds;
[/csharp]

То есть грубо говоря я могу написать
[csharp]
Select select= Select(UserConnection)
select.Column("Id").Column("Name").From("Contact");
sing (DBExecutor dbExecutor = report.UserConnection.EnsureDBConnection()) {
ds.Tables["Facility"].Load(select.ExecuteReader(dbExecutor));
}
report.DataSource = ds;
[/csharp]
Я могу тогда как то свой Dataset построить не прибегая к использованию имеющихся и привязных к таблицам в БД
см. Скрин.

Если я не ошибаюсь можно, изменив ручками файл данных .xsd

DevExpress_Community_1

В качестве примера можете посмотреть файл данных стандартного отчета "ProcessReport". Там же можете найти как подгрузить CustomQuery например.

Есть еще другой вариант:

Возможно если у вас сложные связи и вы будете часто использовать такие данные, рациональнее было бы создать Представление (View) в БД, собирающее все необходимое.
Завести его как объект/представление в bpm'online. Тогда с ним было бы просто работать через ESQ и указать связи в "данных" отчета

[csharp]
select2.Column("SQUARE").From("Facility");
using (DBExecutor dbExecutor = report.UserConnection.EnsureDBConnection()) {
ds.Tables["TemplateByReport"].Load(select2.ExecuteReader(dbExecutor));
}

[/csharp]
Складывается впечатление что он считывает только первую строку

Здравствуйте, Рустам!

Попробуйте запрофайлить запрос, который идет в базу при построении отчета согласно инструкции:
http://www.community.terrasoft.ru/forum/topic/10810#comment-48856

Спасибо за совет Андрей.
Но SQL запрос я в сам отчет вывел, суть в том что этим селектом он должен выводить несколько строк, а на деле только первая выходит.

Возможно ли чистый SQL запрос использовать ?

Рустам, мне кажется, что проблема может быть в том как вы выводите данные на страницу отчета.
Данные выводятся в какую-то таблицу? Данные в таблице сгруппированы? Все ли свойства проставлены?

Все можно! Можно писать SQL код в виде текста. А одна строка у Вас считывалась потому что вы некорректно считывали :)
Вот примерчик.

[csharp]
const string sqlText = @"
select count(*) as TotalActivityCount,
(select count(*) from Activity where TypeId = '{some_id}') as CountOfTypeID1,
(select count(*) from Activity where TypeId = '{some_id2}') as CountOfTypeID3
from Activity
";
var resultQuery = new CustomQuery(userConnection, sqlText);
DataTable dt = new DataTable("Customers");
using (DBExecutor dbExecutor = userConnection.EnsureDBConnection()) {
using(var dr = resultQuery.ExecuteReader(dbExecutor)) {
dt.Load(dr);
}
}
ds.Tables.Add(dt);
[/csharp]

Только важно, чтобы имя DataTable созданной Вами в коде совпадало с именем таблицы, которую Вы добавили в источник данных в дизайнере. Т.е. грубо говоря выбираете таблицу Контактов, затем создаете таблицу с таким же именем в коде и закидываете её в датасет отчета. Также проследите, чтобы в текстовом запросе везде были проставлены псевдонимы колонок, которые совпадают с имена реальных колонок в выбранной таблице. Т.е. если вы в дизайнере выбрали таблицу контактов, и выбрали одно поле Name, то в коде в запросе должна выбираться также одна колонка и тоже с псевдонимом Name. В таком случае вы сможете затем перетягивать эту колонку уже в дизайн отчета, и в неё будут подтягиваться те данные, которые пришли с запросом.

Здравствуйте, Дмитрий.

Все равно показывает только первую строку.
К тому же
ds.Tables.Add(dt); выдает ошибку я удалил датасет что привязал после этого он стал принимать созданный скриптами. Но тут другая проблема как привязывать тогда поля датасета к таблицам и прочим элементам в отчете ?

Рустам, это нужно делать явно - путем одинакового именования колонок в "кстомном" запросе, и одинаковых имен таблиц датасета (скрипт) и таблиц датасета (дизайнер). Я об этом писал выше.

Дмитрий, спасибо вам за ваши ответы.
На счет того что выводит только одну строку я разобрался.
По поводу одинаковых имел, я это понял, так и сделал.

Вот запрос.
[sql]
SELECT COUNT(*) [ColumnInt_01]
, SUM([Facility].[SQUARE])[ColumnDecimal_01]
, SUM([Invoice].[PaymentAmount])[ColumnDecimal_02]
FROM [dbo].[Facility] [Facility]
LEFT OUTER JOIN(select [PaymentAmount],[FacilityId] from [dbo].[Invoice] where [PaymentStatusId] <>N'3FB932EA-F36B-1410-2691-00155D043205') as [Invoice]
ON ([Facility].[id] =[Invoice].[FacilityId])
WHERE [Facility].[ParentFacilityId] = N'5a6f5d1b-13f7-4f13-82d2-ade850456d3f'

GROUP BY [ParentFacilityId]
[/sql]
Ниже таблица которую я использовал.
[sql]
SELECT TOP 1000 [Id]
,[CreatedOn]
,[CreatedById]
,[ModifiedOn]
,[ModifiedById]
,[Name]
,[Description]
,[ProcessListeners]
,[ColumnInt_01]
,[ColumnDecimal_01]
,[ColumnDecimal_02]
,[ColumnDecimal_03]
,[ColumnDecimal_04]
FROM [Kronwerk].[dbo].[TemplateByReport]
[/sql]

Показать все комментарии