Приложение Asp.Net в VS2017 с ошибкой Crystal Reports «Неверное имя подотчета» - PullRequest
0 голосов
/ 28 декабря 2018

Мне дали устаревшее приложение ASP.Net, написанное в vs2005 с CR 8. В настоящее время я использую vs2017 и CR 13.0.22.

Приложение взаимодействует с большим количеством различных данных и показывает несколько отчетов.и меня попросили изменить один из них, который является родительским отчетом с 5 подотчетами.Когда я впервые начал работу, я запустил проверку базы данных в родительском отчете, и мне было предложено подключиться, используя файлы схемы / XML, которые не были преобразованы в базу сохраненного кода и теперь потеряны.

Я заново создал6 наборов данных / соединений, которые подключаются к хранимым процедурам для данных и реорганизовали / перепроектировали все 6 отчетов для повторного подключения к новым наборам данных.

Теперь, когда я запускаю приложение, я получаю вышеупомянутую ошибку: Неверное имя подотчета

Вот метод, который генерирует ошибку:

public void GenerateReport(List<Report> Reports, CrystalReportViewer Viewer)
{
int rptcount;
Report mainreport;

// make sure there is only one main report in the list
rptcount = 0;
mainreport = null;
foreach (Report report in Reports)
{
if (report.IsSubReport == false)
{
rptcount = rptcount + 1;
mainreport = report;
}
}
if (rptcount != 1)
throw new Exception("ReportWriter.GenerateReport: There was more than one main report found in the list of reports. " +
"Only one can be the main report. The other reports have to be subreports.");

// generate the report
checkReportFile(mainreport.ReportName);
document = new ReportDocument();
document.Load(mainreport.ReportName);
document.SetDataSource(mainreport.DataSet);

/* Previously the next line was a call to setReportParameters and the code errored with the Invalid Subreport Name call. I moved that line of code to after the For Each and now the error occurs within the foreach loop on the first iteration. */

// attach sub reports to the main report
foreach (Report report in Reports)
{
if (report.IsSubReport == true)

/* This line throws the error */
document.OpenSubreport(report.ReportName).SetDataSource(report.DataSet);
}
/* This is the previously failing line that I moved to here */
setReportParameters(document, mainreport.ReportParameters);
Viewer.ReportSource = document;
}

Я запустил код в отладчике и остановил выполнение до ошибки.Затем я выполнил фрагмент «document.OpenSubreport (report.ReportName)» в строке сбоя в ближайшем окне, и это именно то место, где выдается ошибка.Тип / объект ReportDocument является частью библиотеки Crystal Decisions, и невозможно углубиться в этот код, поэтому у меня нет данных, чтобы точно определить, что именно не работает.Я просматривал все преобразованные подотчеты снова и снова, и все они выглядят идеально в дизайне.Как я могу определить, что действительно терпит неудачу здесь?Есть ли способ проанализировать файл .rpt, чтобы увидеть, есть ли в нем какой-то устаревший мусор, который нужно удалить?Если я не могу найти ответ, мне придется начинать все с нуля ...

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я воспользовался советом компетентным_техником, но он не решил мою проблему.В итоге я установил полное приложение Crystal Reports (к сожалению, 2008 г.) и открыл отчет в этой IDE.IDE дал мне гораздо больше информативных ошибок.Проблема заключалась в том, что в полях формул и группировке для родительского отчета и нескольких вложенных отчетов были пропущены ошибки замены объектов.Я также переместил setReportParameters обратно в исходную вызываемую позицию.Было здорово иметь более подробное описание, и я рекомендую переключаться между дизайном Visual Studio CR и автономным дизайном CR, чтобы изолировать ошибки.

0 голосов
/ 28 декабря 2018

Вместо того, чтобы использовать OpenSubReport, я предлагаю вам использовать коллекцию подотчетов в основном отчете, проверяя на ноль.Затем вы можете сказать звонящему, что он запросил неправильное имя подотчета, если оно не существует.

Что-то вроде

foreach (Report report in Reports)
{
    if (!report.IsSubReport)
    {
        continue;
    }
    var subReport = document.SubReports[report.ReportName];
    if (subReport == null) {
        throw new Exception($"Subreport {report.ReportName} not found");
    }
    subReport.SetDataSource(report.DataSet);
}

И использование коллекции SubReports также позволит вам точно определить, какие именноПодотчеты были загружены.Вполне возможно, что есть тонкая опечатка или даже регистр, который может иметь значение.

...