Ошибка при компиляции отчета

Обсуждение Stimulsoft Reports.WEB
DmitryRu
Сообщения: 163
Зарегистрирован: 19 май 2014, 10:40

Ошибка при компиляции отчета

Сообщение DmitryRu »

Периодически на одном из тестовых стендов один отчет перестает работать.
При попытке его скомпилировать получаем исключение такого рода

Код: Выделить всё

Время: 2015-07-31 06:32:39.765
Категория: Exceptions
Тип: Error
An exception of type 'System.Exception' occurred and was caught.
----------------------------------------------------------------
Type : System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : c:\Windows\Temp\drbsw1bh.0.cs(1814,20) : error CS0103: Имя "Hour" отсутствует в текущем контексте
Source : Stimulsoft.Report
TargetSite : Void Compile(System.String, System.IO.Stream, Stimulsoft.Base.StiOutputType, Boolean, System.Object)
HResult : -2146233088
Stack Trace :    в Stimulsoft.Report.StiReport.Compile(String path, Stream stream, StiOutputType outputType, Boolean autoCreate, Object standaloneReportType)
   в Stimulsoft.Report.StiReport.Compile(String path, Stream stream, StiOutputType outputType, Boolean autoCreate)
   в Stimulsoft.Report.StiReport.Compile(String path, StiOutputType outputType, Boolean autoCreate)
"Hour" это имя вычисляемого поля (Calculated Column).
Код, вызывающий компиляцию:

Код: Выделить всё

            using (var report = new StiReport())
            {
                LoadFromDb(metadataId, report);
                _log.Write("Compiling report to {0}", fileName);
                var s = new Stopwatch();
                s.Start();
                report.Compile(fileName, StiOutputType.ClassLibrary);
                s.Stop();
                _log.Write("Report {0} compiled in {1} ms", metadataId, s.ElapsedMilliseconds);
            }
Отчеты хранятся в БД, как mrt файл в виде поля

Код: Выделить всё

	[ReportDefinition] [varbinary] (max) NULL 
Данный отчет в БД находится вроде бы в исправном состоянии - если подключиться к этой БД с другого компьютера, отчет нормально компилируется.
Прочие отчеты в это же время работают в этом же сайте.
Перезапуск проблемного сайта не помогает.
Помогает редеплоймент отчета в БД и перезапуск сайта, но все же на другой компьютер эта же БД отдает отчет в исправном состоянии.
Используемое ПО Reports.Web. 2015.1.11

Подскажите, куда копать?
Сейчас попробую обернуть вызов компиляции в try...catch, чтобы сбросить в лог текущий вид .mrt файла, как я его получил из БД
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Ошибка при компиляции отчета

Сообщение HighAley »

Здравствуйте.

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

Спасибо.
DmitryRu
Сообщения: 163
Зарегистрирован: 19 май 2014, 10:40

Re: Ошибка при компиляции отчета

Сообщение DmitryRu »

Проблема не в момент построения отчета, а при попытке скомпилировать отчет из .mrt в .cs, потому не очень понимаю, что означает "не может быть рассчитано".
В общем обернул код, вызывающий компиляцию в try...catch и написал в catch следующее:

Код: Выделить всё

                try
                {
                    report.Compile(fileName, StiOutputType.ClassLibrary);
                    var csName = fileName + "ok.cs";
                    _log.Write("Precompiled text saved to {0}", csName);
                    report.ScriptUpdate(false);
                    File.WriteAllText(csName, report.Script);
                }
                catch (Exception e)
                {
                    var mrtFileName = fileName + ".mrt";
                    var csFileName = fileName + ".cs";
                    _log.Write("Error compiling report with Identity='{0}'. Saving .mrt file as {1}, cs file as {2}. Error Text = {3}",
                        identity, mrtFileName, csFileName, e.Message);
                    report.Save(mrtFileName);
                    report.ScriptUpdate(false);
                    File.WriteAllText(csFileName, report.Script);
                    throw new MrtCompilationException(report, e);
                }
            }
Выяснилось следующее. В источнике данных у меня объявлено вычисляемое поле таким образом:
hour.png
hour.png (6.73 КБ) 6002 просмотра
Или, в виде .mrt:

Код: Выделить всё

      <ReportMH Ref="4" type="Stimulsoft.Report.Dictionary.StiSqlSource" isKey="true">
        <Alias>ReportMH</Alias>
        <Columns isList="true" count="7">
          <value>DT,System.DateTime</value>
          <value>V,System.Double</value>
          <value>S,System.Int32</value>
          <value>Hour,Hour,System.Int64,Hour_x0028_ReportMH.DT_x0029_</value>
        </Columns>
И на компьютере, на котором отчет нормально компилируется, это преобразуется в следующий .cs код:

Код: Выделить всё

        public long GetReportMH_Hour()
        {
            return Stimulsoft.Report.Dictionary.StiFunctionsDate.Hour(ReportMH.DT);
        }
А на компьютере, где отчет не компилируется (уже стабильно не компилируется, ничего не помогает) компилятору предлагается такой код .cs:

Код: Выделить всё

        public long GetReportMH_Hour()
        {
            return Hour(ReportMH.DT);
        }
И вот эта последняя строка не компилируется, похоже, на нее компилятор ругается "Имя "Hour" отсутствует в текущем контексте"
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Ошибка при компиляции отчета

Сообщение HighAley »

Здравствуйте.

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

Спасибо.
DmitryRu
Сообщения: 163
Зарегистрирован: 19 май 2014, 10:40

Re: Ошибка при компиляции отчета

Сообщение DmitryRu »

Можно ли уточнить, версия Stimulsoft.Reports.Web 2014.1.11. подвержена такой проблеме?
Других версий Reports.Web на проблемном компьютере не вижу.
Если данная версия проблеме не подвержена, то и обновлять ее на последнюю ничего не даст.
Да и не могу сейчас обновиться на 2015.1.14, из-за зависимости от MVC 4
DmitryRu
Сообщения: 163
Зарегистрирован: 19 май 2014, 10:40

Re: Ошибка при компиляции отчета

Сообщение DmitryRu »

До кучи замечу, что практика выбрасывания System.Exception порицается ведущими собаководами.
Так, например, при проблеме компиляции StiReport выбрасывает именно Exception.
Из-за этого я вынужден писать код

Код: Выделить всё

try{
...call Stimulsoft....
} catch(Exception e){
....
}
что тоже порицается собаководами.

Было бы культурнее, если бы Ваш код выбрасывал какой-то свой наследник от Exception.
Насколько я могу судить, вы такую практику не используете совсем, что несколько затрудняет интеграцию Ваших компонентов.
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Ошибка при компиляции отчета

Сообщение HighAley »

Здравствуйте.

Сегодня мы собрали следующий предрелизный билд.
Там мы исправили проблему несовместимости с MVC 3. Можете качать его с нашего сайта и пробовать.

Спасибо.
DmitryRu
Сообщения: 163
Зарегистрирован: 19 май 2014, 10:40

Re: Ошибка при компиляции отчета

Сообщение DmitryRu »

Установка Reports.Web версии 2015.1.16 решила проблемы с компиляцией отчета, спасибо.

Но все же прошу сообщить программистам, что выбрасывание System.Exception порицается в любом руководстве по программированию и затрудняет интеграцию Вашей библиотеки в приложения пользователей.
Я бы предложил создать для этих целей какой-нибудь StimulsoftException. Это не сломает никакого существующего кода.
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Ошибка при компиляции отчета

Сообщение HighAley »

Здравствуйте.

К сождалению, мы не можем сейчас делать такие глобальные изменения. У нас слишкрм много мест, где возникают исключения.
Это может стать причиной множества багов. Пока всё останется как есть.

Спасибо.
DmitryRu
Сообщения: 163
Зарегистрирован: 19 май 2014, 10:40

Re: Ошибка при компиляции отчета

Сообщение DmitryRu »

Здравствуйте.

Всегда думал, что замена конструкции
throw new Exception("Message");
на
throw new MyException("Message");
не может ничего сломать, потому что

Код: Выделить всё

public class MyException: Exception{
}
Закрыто