Сбой рендеринга SSRS в эзотерическом контексте - PullRequest
0 голосов
/ 22 марта 2019

Я использую ReportingService2005 в приложении C # .net, которое обращается к серверу SSRS для создания нескольких отчетов в формате PDF и объединения их в один PDF.Это хорошо сработало для грубой внутренней программы, но я недавно развернул обновленные версии старых отчетов, чтобы сделать их более гибкими по некоторым параметрам.Эти отчеты были созданы путем копирования таблиц из старых версий для поддержания форматирования, а затем обновления выражений в соответствии с новой настройкой отчета.Один из этих отчетов, только в очень специфических контекстах, которые я могу повторить, если столкнусь (но не могу определить, что его вызовет), не будет отображаться в программе:

System.Web.Services.Protocols.SoapException - An error occurred during rendering of the report. --->
Microsoft.ReportingServices.ReportProcessing.UnhandledReportRenderingException: An error occurred during rendering of the report. ---> 
Microsoft.ReportingServices.OnDemandReportRendering.ReportRenderingException: An error occurred during rendering of the report. ---> 
Microsoft.ReportingServices.ReportProcessing.ReportProcessingException_NonExistingFieldReference: The expression referenced a non-existing field in the fields collection.

(добавлены разрывы строк, чтобы помочьс чтением.) Он не говорит, на какое поле ссылаются или какой элемент не работает, даже если я пытаюсь проанализировать исключение SoapException в отладке.Если я посмотрю на связанный журнал дампа на сервере SSRS, отчет будет выглядеть так:

library!ReportServer_0-113!248!03/21/2019-18:53:16:: e ERROR: Report server unique dump occured. Exception: Microsoft.ReportingServices.ReportProcessing.UnhandledReportRenderingException: An error occurred during rendering of the report. ---> Microsoft.ReportingServices.OnDemandReportRendering.ReportRenderingException: An error occurred during rendering of the report. ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException_NonExistingFieldReference: The expression referenced a non-existing field in the fields collection.
   at Microsoft.ReportingServices.ReportProcessing.OnDemandReportObjectModel.FieldsImpl.CheckedGetFieldByIndex(Int32 index)
   at Microsoft.ReportingServices.RdlExpressions.ReportRuntime.EvaluateSimpleFieldReference(Int32 fieldIndex, VariantResult& result)
   at Microsoft.ReportingServices.RdlExpressions.ReportRuntime.EvaluateSimpleExpression(ExpressionInfo expression, VariantResult& result)
   at Microsoft.ReportingServices.RdlExpressions.ReportRuntime.EvaluateTextRunValueExpression(TextRun textRun)
   at Microsoft.ReportingServices.ReportProcessing.OnDemandReportObjectModel.TextRunImpl.GetResult(IReportScopeInstance romInstance)
   at Microsoft.ReportingServices.OnDemandReportRendering.InternalTextRunInstance.EvaluateOriginalValue()
   at Microsoft.ReportingServices.OnDemandReportRendering.InternalTextRunInstance.get_OriginalValue()
   at Microsoft.ReportingServices.OnDemandReportRendering.TextBoxInstance.EvaluateOriginalValue()
   at Microsoft.ReportingServices.OnDemandReportRendering.TextBoxInstance.get_TypeCode()
   at Microsoft.ReportingServices.Rendering.HPBProcessing.TextBox.GetAlignmentRight(Style style, StyleInstance styleInstance)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.TextBox.InitParagraphs()
   at Microsoft.ReportingServices.Rendering.HPBProcessing.TextBox..ctor(TextBox source, PageContext pageContext)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.PageItem.Create(ReportItem source, Boolean tablixCellParent, Boolean ignoreKT, PageContext pageContext)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.Tablix.AddRowMember(TablixMember rowMember, Int32 colIndex, Int32 rowSpan, Int32 colSpan, LevelInfo childInfo, PageContext pageContext, Double updateWidth)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.Tablix.CreateRowMemberChildren(Tablix tablix, TablixMember rowMemberParent, Int32 defTreeLevel, Boolean parentBorderHeader, Int32 parentRowIndex, Int32 parentColIndex, Int32 sourceIndex, Boolean resetContext, Boolean parentHasFooters, LevelInfo parentLevelInfo, PageContext pageContext)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.Tablix.CreateDynamicRowMemberChildren(Tablix tablix, TablixMember rowMemberParent, Int32 defTreeLevel, Int32 sourceIndex, Int32 parentRowIndex, Int32 parentColIndex, Boolean parentHasFooters, LevelInfo parentLevelInfo, PageContext pageContext)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.Tablix.CreateTablixRows(Tablix tablix, TablixMember rowMemberParent, Int32 defTreeLevel, Boolean parentBord, Message: , Unhandled Exception: False

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

Этот же отчет, с теми же параметрами, будет отлично работать в Visual Studio, ReportViewer через наш веб-сайт, веб-интерфейс SSRS и дажеесли у меня есть файл рендеринга в этой пользовательской программе как Excel вместо PDF.(Генерация в формате PDF через другие интерфейсы также работает нормально.) Я прочесал код отчета для ошибочных операторов Field!, особенно там, где указан контекст (например, другой набор данных), и не нашел ничего плохого.

Я знаючто ReportingServices может создавать крайне эзотерические сообщения об ошибках [1], поэтому вполне возможно, что это вообще не связано с несуществующим полем, но я не могу понять, что может быть не так с отчетом или с тем, как яЯ звоню, чтобы сгенерировать это.Если я использую немного другой набор параметров, ссылаясь на диапазон дат вместо предварительно определенного периода времени, чтобы получить те же данные, он генерирует штраф;есть столбец, который не заполняется в этом случае, что делает его потенциальным виновником, но опять же я не могу найти ничего плохого.

Есть что-то, что я пропускаю, или я неправильно понимаю сообщение об ошибке?Есть ли другое место, которое на самом деле скажет мне, в какой ячейке Frackin 'есть ошибка?Последнее решение проблем с отчетами состояло в том, чтобы просто воссоздать их полностью с нуля, но я бы хотел этого избежать, так как отчет сложен с кучей мелких деталей.

Кроме того, я заметилGetAlignmentRight на полпути через след;это то, что может помочь с отладкой?При рендеринге вызовов вправо / в центр / влево я мог бы очень болезненно сузить ячейку, если она вообще есть.Я попытался изменить все мои выровненные по правому краю ячейки, однако, и след не изменился. Редактировать: Нет, ячейка, которая вызвала проблему, была выровнена по центру, так что это не помогло бы в этомcase.


[1] в другом сообщении об ошибке, о котором я говорил в другом отчете, говорится, что на несуществующий элемент ReportItem ссылаются, когда фактической проблемой был тайм-аут из-за слишком долгого рендеринга;Я подтвердил, что это не проблема здесь

1 Ответ

0 голосов
/ 23 марта 2019

Решение

Это было вызовом поля, вызвавшим это, но ссылка на поле была правильной.Исправление после идентификации этого вызова состояло в том, чтобы полностью удалить ячейку (в моем случае - удалить всю строку, потому что это была единственная ячейка, используемая в этой строке) и заново создать ее.


Устранение неполадокДетали

Я знаю, как, но не почему.Решив решить эту проблему, я сделал копию отчета и медленно удалял разделы, пока проблема не прекратилась.Сбросьте, удалите подраздел того раздела, который содержал проблему, повторите.

В конце концов я определил, что проблема была с одной ячейкой, и только в конкретном случае: когда значение =Fields!Level3Name.Value имелозначение Non-Controllables.Удаление только выражения позволит отчету визуализироваться.Изменение выражения на =Fields!Level3Name.Value & " " или =CStr(Fields!Level3Name.Value) позволит отчету сгенерировать, , но это поле будет отображать # Ошибка :

Error Example

Общая строка внизу этого изображения ссылается на точно такое же поле.Я попробовал несколько других небольших изменений, но они либо привели к #Error, либо мне не понравился обходной путь, поэтому в конце я попытался просто вставить новую строку, вручную заново создать ячейку и удалить старую.Теперь генерация работает просто отлично (в тестировании, стучите по дереву.)

Я думаю, что - заставило рендерер попытаться обработать результат как уравнение.Но другие параметры также имели бы это или подобное Field3Name и работали бы без проблем, и это опять же происходило бы только тогда, когда я пытался сгенерировать отчет в виде PDF-файла через приложение C # .net и нигде больше.Я проанализировал XML для «фиксированного» TablixMember (представляющего всю строку) по сравнению с «ломаным», даже после настройки на использование тех же настроек, что и фиксированный, все еще работал.Итак, я не знаю, почему это произошло, но, по крайней мере, если это случится снова, у меня есть способ отследить это.

...