我们正在将报告服务器从SSRS 2005升级到SSRS 2008 R2
我对SSRS 2008的CSV导出渲染存在问题,其中列的SUM出现在2008年的细节值的右侧,而不是像2005年那样出现在左侧,如下面的块所示。
117
和131
分别是Column2和Column3的总和。
SSRS 2005 CSV输出
Column2_1,Column3_1,Column2,Column3
117,131,1,2
117,131,1,2
117,131,60,23
117,131,30,15
117,131,25,89
SSRS 2008 CSV输出
Column2,Column3,Column2_1,Column3_1
1,2,117,131
1,2,117,131
60,23,117,131
30,15,117,131
25,89,117,131
我理解CSV renderer has gone through major changes in SSRS 2008 R2支持图表和仪表,更重要的是它提供了2种模式:默认Excel
模式和Compliant
模式。但这两种模式都无法解决这个问题。 Compliant模式应该与2005年最接近,但显然它与我的情况不太接近。
我的问题:
有没有办法强制SSRS 2008将报告回退到向后兼容模式,以便导出为2005 CSV格式?
已尝试解决方案:
a)使用基于2005的CRI
根据{{3}},如果SSRS 2008 R2遇到无法自动升级的报告(例如,使用基于2005的CustomReportItem控件构建的报告),那些特定报告将使用旧的Yukon引擎处理“透明的向后兼容模式“。
似乎它回退到之前的版本模式(2005)并尝试渲染它。 所以我尝试使用基于2005的条形码CustomReportItem并部署到SSRS 2008 R2报表服务器,但它显示了与之前相同的结果,但它抑制了条形码。这是因为SSRS 2008 R2找到了一种方法来抑制部分报告输出并显示其余部分。 很高兴找到一个基于2005的CRI,让SSRS 2008 R2用它的旧Yukon引擎处理它。 请注意,很可能,即使它使用“旧的Yukon处理引擎”,它仍然可以使用新的CSV渲染器,因此它显示相同的输出。如果这是真的,那么这个选项没有实际意义。
b)使用XML渲染器
我们可以使用自定义XML渲染器,然后使用XSLT将xml转换为适当的CSV,但这意味着我们需要转换所有200个报告。因此这是不可行的。
请注意,我们无法并排部署SSRS 2005和SSRS 2008 R2。
答案 0 :(得分:5)
你的问题让我终于出去尝试write a custom RenderingExtension。这里的答案是创建一个“包装”旧SSRS 2005 CSV呈现扩展的扩展,并使其在SSRS 2008中以新名称提供。
我当然认为这样做是可能的。不幸的是,我没有2005 SSRS DLL,所以我通过创建一个包装 2008 CSV渲染器的扩展来完成我的概念验证。经过相当的斗争,我终于得到了这个工作。也许这个答案将帮助您类似地实现2005 CSV渲染器。
前面有几点说明:
以下是基本步骤:
rssrvpolicy.config
文件以包含您的程序集in a CodeGroup element。rsreportserver.config
文件to include the extension。
以下是包装默认CSV渲染器的类的代码清单:
using Microsoft.ReportingServices.Interfaces;
using Microsoft.ReportingServices.OnDemandReportRendering;
namespace Ssrs2005CsvRenderingExtension
{
public class Csv2005Renderer : IRenderingExtension
{
private IRenderingExtension oldskoolCsvRenderer;
public Csv2005Renderer()
{
oldskoolCsvRenderer = new Microsoft.ReportingServices.Rendering.DataRenderer.CsvReport();
}
public void GetRenderingResource(CreateAndRegisterStream createAndRegisterStreamCallback,
System.Collections.Specialized.NameValueCollection deviceInfo)
{
oldskoolCsvRenderer.GetRenderingResource(createAndRegisterStreamCallback, deviceInfo);
}
public bool Render(Microsoft.ReportingServices.OnDemandReportRendering.Report report,
System.Collections.Specialized.NameValueCollection reportServerParameters,
System.Collections.Specialized.NameValueCollection deviceInfo,
System.Collections.Specialized.NameValueCollection clientCapabilities,
ref System.Collections.Hashtable renderProperties,
CreateAndRegisterStream createAndRegisterStream)
{
return oldskoolCsvRenderer.Render(report,
reportServerParameters,
deviceInfo,
clientCapabilities,
ref renderProperties,
createAndRegisterStream);
}
public bool RenderStream(string streamName,
Microsoft.ReportingServices.OnDemandReportRendering.Report report,
System.Collections.Specialized.NameValueCollection reportServerParameters,
System.Collections.Specialized.NameValueCollection deviceInfo,
System.Collections.Specialized.NameValueCollection clientCapabilities,
ref System.Collections.Hashtable renderProperties,
CreateAndRegisterStream createAndRegisterStream)
{
return oldskoolCsvRenderer.RenderStream(streamName,
report,
reportServerParameters,
deviceInfo,
clientCapabilities,
ref renderProperties,
createAndRegisterStream);
}
public string LocalizedName
{
get { return "Oldskool CSV renderer"; }
}
public void SetConfiguration(string configuration)
{
oldskoolCsvRenderer.SetConfiguration(configuration);
}
}
}
这是添加到rsreportserver.config
:
<Extension Name="OLDSKOOLCSV" Type="Ssrs2005CsvRenderingExtension.Csv2005Renderer,Ssrs2005CsvRenderingExtension"/>
这是我用rssrvpolicy.config
的配置xml:
<CodeGroup
class="UnionCodeGroup"
version="1"
PermissionSetName="FullTrust"
Name="OldskoolCsvGroup"
Description="Code group for oldskool csv extension">
<IMembershipCondition
class="UrlMembershipCondition"
version="1"
Url="C:\Program Files\Microsoft SQL Server\MSRS10.SQLSERVER\Reporting Services\ReportServer\bin\Ssrs2005CsvRenderingExtension.dll"
/>
</CodeGroup>
一个脚本对于快速测试非常有用,如果事情有效(主要是因为它涉及大量的试验和错误),我使用RS Utility执行:
Public Sub Main()
Dim items() As Extension
items = rs.ListExtensions(1)
For Each item As Extension In items
Console.WriteLine(item.Name)
Next item
End Sub
就是这样。至少这是我经过几个小时的反复试验后仍能记住的所有重要内容。完成最后一个注释:
如果有人使用实际的2005 CSV渲染DLL尝试此操作:请告诉我们是否通过评论或编辑答案是否成功。