SSST渲染在深奥的语境中失败

问题描述 投票:0回答:1

我在C#.net应用程序中使用ReportingService2005,该应用程序连接到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

除了在尝试渲染单元格时出现错误(这没有帮助,有页眉,页脚和单个tablix)时,似乎没有告诉我任何更多信息。

对于相同的参数,同样的报告将在Visual Studio,ReportViewer通过我们的网站,SSRS Web界面正常工作,即使我在此自定义程序中将文件呈现为Excel而不是PDF。 (通过其他接口生成PDF也可以正常工作。)我已经梳理了错误的Field!语句的报告代码,特别是在指定了上下文(例如另一个DataSet)的情况下,并没有发现任何问题。

我知道ReportingServices可以制作极其深奥的错误消息[1],所以很可能这与根本不存在的字段无关,但我无法弄清楚报告或方式可能有什么问题。我正在呼吁生成它。如果我使用稍微不同的参数集,参考日期范围而不是预定义的时间范围来获得相同的数据,它会生成良好的;在这种情况下,有一个列没有填写,这使它成为潜在的罪魁祸首,但我再也找不到任何错误。

有什么我想念的,或者我误解了错误信息?还有另一个地方会告诉我哪个frackin'单元有错误吗?报告问题的最后一个解决方案是从头开始重新创建它们,但我想避免这种情况,因为报告很复杂,有很多微小的细节。

此外,我注意到GetAlignmentRight在中途走了一半;这可能有助于调试吗?如果渲染调用右/中/左我可能非常痛苦地缩小有问题的单元格,如果有的话。不过,我试图将所有右对齐的单元格改为居中,并且跟踪没有改变。 编辑:不,导致问题的单元格是中心对齐的,所以在这种情况下这没有帮助。


[1]我在另一份报告中处理的另一条错误消息表示当实际问题由于渲染时间过长导致超时时,引用了一个不存在的ReportItem;我已经确认这不是问题所在

c# reporting-services ssrs-2016
1个回答
0
投票

这是一个引起这种情况的字段调用,但字段引用是正确的。在确定此调用之后,修复程序是完全删除单元格(在我的情况下,删除整行,因为它是该行上使用的唯一单元格)并重新创建它。


故障排除细节

我知道怎么做,但不知道为什么。决定解决这个问题,我制作了一份报告副本并慢慢删除了部分,直到问题停止。重置,删除包含该问题的该部分的子部分,重复。

我最终确定问题是单个单元格,并且仅在特定情况下:当=Fields!Level3Name.Value的值具有Non-Controllables的值时。仅删除表达式将允许报表呈现。将表达式修改为=Fields!Level3Name.Value & " "=CStr(Fields!Level3Name.Value)将允许生成报告,但此字段将显示#Error:

Error Example

该图像底部的总计行引用完全相同的字段。我尝试了一些其他的小改动,但他们要么导致#Error,要么我不喜欢这种解决方法,所以最后我尝试插入一个新行,手动重新创建单元格,然后删除旧行。现在这一代工作得很好(在测试中,敲木头。)

我最好的猜测是,-导致渲染器试图将结果视为等式。但是不同的params也会有这个或类似的Field3Name并且运行没有问题,而且只有当我尝试通过C#.net应用程序生成报告为PDF时才会出现这种情况。我分析了XML的“固定”TablixMember(代表整行)与“破坏”的,即使在调整使用完全相同的设置后,固定的仍然有效。所以,我不知道为什么会这样,但至少如果再次发生,我有办法追赶它。

© www.soinside.com 2019 - 2024. All rights reserved.