Здравствуйте.
Делаю отчет средствами BPMonlineReportDesigner
Возникла необходимость написать сложный запрос где EntitySchemaQuery не подойдет,
но можно использовать класс Select
как мне загрузить его в дата сет
ds.Tables["Facility"].Load(report.UserConnection, query, false);
и второй более важный как можно использовать пользовательский дата сет. Который сформирован под нужный мне запрос из БД ?
Нравится
Если я правильно понимаю вопрос, то:
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
В качестве примера можете посмотреть файл данных стандартного отчета "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]