Из C# при вызове отчета SSRS только основной отчет отображает данные подотчета с ошибкой
Я разработал отчет SSRS, имеющий основной и 3 подчиненных отчета. Я звоню этот отчет из C#. Я только знаю, как связать основной rdlc с набором данных.
Я использую код ниже для этого
SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm);
dataAdapter.Fill(dataset);
this.reportViewer1.LocalReport.ReportPath = Application.StartupPath + "\\sale_dept.rdl";
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", dataset.Tables[0]));
this.reportViewer1.RefreshReport();
когда я запускаю exe, я получаю средство просмотра отчетов, заполненное основным отчетом, но в 3 подотчетах отображается ошибка, потому что я не указал DataSource для этих подотчетов
- Между основным и другими подотчетами нет передачи параметров
- Имя набора данных для основного и всех вложенных отчетов по умолчанию - DataSet1.
Помогите мне связать подотчеты с соответствующими таблицами наборов запросов. Я полностью застрял здесь.
отредактированный
Я изменил свой проект с 1 подотчетом.
В SSRS он работает нормально в редакторе (BIDS), но при вызове из C# выдает ошибку:
Не может быть найдено в указанном месте. Пожалуйста, проверьте, что подотчет был опубликован и что имя является правильным.
Мой код:
subreportevenhandler according to this question
вопрос для обработчика события подотчета
SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm);
dataAdapter.Fill(dataset);
this.reportViewer1.LocalReport.ReportPath = Application.StartupPath + "\\sale_dept.rdl";
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.SubreportProcessing +=
new SubreportProcessingEventHandler(addsubreport);
this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", dataset.Tables[0]));
this.reportViewer1.RefreshReport();
void addsubreport(object sender, SubreportProcessingEventArgs e)
{
SqlConnection conn = new SqlConnection(source);
DataSet dataset = new DataSet();
conn.Open();
SqlCommand sqlcomm = new SqlCommand( "Query for subreport", conn);
SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm);
dataAdapter.Fill(dataset);
e.DataSources.Add(new ReportDataSource("DataSet1", dataset.Tables[0]));
}
Тем не менее я получаю сообщение об ошибке для подотчета я переместил весь файл.rdl в папку C# bin..
Основной отчет показывает данные правильно. В ССРС это нормально..
1 ответ
Я выяснил проблему. Я отправляю это как ответ, потому что это может помочь кому-то в будущем.
SubreportProcessingEventHandler
будет уволен только за .rdlc
подотчеты. В моем проекте основной отчет и все подотчеты .rdl
расширение. Таким образом, единственное изменение, которое я сделал, пошло в командную строку и переименовало расширение подотчета .rdlc
например:- ren discount.rdl discount.rdlc
Затем прикрепите набор данных для подотчета соответственно.
Смотрите код как ниже
SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm);
dataAdapter.Fill(dataset);
this.reportViewer1.LocalReport.ReportPath = Application.StartupPath + "\\main_rpt.rdl";
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.SubreportProcessing +=
new SubreportProcessingEventHandler(addsubreport);
this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", dataset.Tables[0]));
this.reportViewer1.RefreshReport();
void addsubreport(object sender, SubreportProcessingEventArgs e)
{
SqlCommand sqlcomm = new SqlCommand();
SqlDataAdapter dataAdapter = new SqlDataAdapter();
DataSet dataset = new DataSet();
Switch(e.ReportPath)
{
case "subreport1":
sqlcomm = new SqlCommand( "Query for subreport one", conn);
dataAdapter = new SqlDataAdapter(sqlcomm);
dataAdapter.Fill(dataset);
e.DataSources.Add(new ReportDataSource("DataSet for subreport1", dataset.Tables[0]));
break;
case "subreport2":
sqlcomm = new SqlCommand( "Query for subreport two", conn);
dataAdapter = new SqlDataAdapter(sqlcomm);
dataAdapter.Fill(dataset);
e.DataSources.Add(new ReportDataSource("DataSet for subreport2", dataset.Tables[0]));
break;
case "subreport3":
sqlcomm = new SqlCommand( "Query for subreport three", conn);
dataAdapter = new SqlDataAdapter(sqlcomm);
dataAdapter.Fill(dataset);
e.DataSources.Add(new ReportDataSource("DataSet for subreport3", dataset.Tables[0]));
break;
}
}
Переключение необходимо, если у вас есть несколько подотчетов. Главное отметить
- Весь подотчет должен иметь расширение.rdlc
2.Если какой-либо параметр передается, убедитесь, что он также назван правильно.
- Укажите путь правильно. Основной отчет и вложенный отчет лучше поместить в одну папку.
Теперь запустите приложение C#, оно покажет основной отчет со всеми вложенными отчетами.