работа с BPMonlineReportDesigner

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

 

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


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

 

Нравится

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

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

1.

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

2.

report.DataSource = ds;

То есть грубо говоря я могу написать

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;

Я могу тогда как то свой Dataset построить не прибегая к использованию имеющихся и привязных к таблицам в БД
см. Скрин.

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

DevExpress_Community_1

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

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

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

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

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

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

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

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

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

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

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

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);

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

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

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

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

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

Вот запрос.

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]

Ниже таблица которую я использовал.

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]
Показать все комментарии