gpt4 book ai didi

reporting-services - 强制 SSRS 2008 使用 SSRS 2005 CSV 渲染

转载 作者:行者123 更新时间:2023-12-01 11:49:25 26 4
gpt4 key购买 nike

我们正在将报表服务器从 SSRS 2005 升级到 SSRS 2008 R2。
我对 SSRS 2008 的 CSV 导出呈现有问题,其中列的总和出现在 2008 年详细值的右侧,而不是像 2005 年那样出现在左侧,如下面的 block 所示。
117131 分别是 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 模式。但是这两种模式都无法解决这个问题。合规模式应该最接近 2005 年的模式,但显然对于我的情况来说还不够接近。

我的问题:
有没有办法强制 SSRS 2008 将报告回退到向后兼容模式,以便它导出为 2005 CSV 格式?

尝试过的解决方案:
a) 使用基于 2005 年的 CRI
基于this article on ExecutionLog2 ,如果 SSRS 2008 R2 遇到无法自动升级的报告(例如,使用基于 2005 的 CustomReportItem 控件构建的报告),这些特定报告将在“透明向后兼容模式”下使用旧 Yukon 引擎进行处理。

它似乎退回到了以前的版本模式 (2005) 并尝试渲染它。因此,我尝试使用基于 2005 的条码 CustomReportItem 并部署到 SSRS 2008 R2 报表服务器,但它显示的结果与以前相同,尽管它抑制了条码。这是因为 SSRS 2008 R2 找到了一种方法来抑制部分报告输出并显示其余部分。如果能找到一个基于 2005 的 CRI,使 SSRS 2008 R2 使用其旧的 Yukon 引擎对其进行处理,那就太好了。请注意,很有可能,即使它使用“旧的育空处理引擎”,它也可能仍然使用新的 CSV 渲染器,因此它显示相同的输出。如果这是真的,那么这个选项就没有实际意义了。

b) 使用 XML 渲染器
我们可以使用自定义 XML 呈现器,然后使用 XSLT 将 xml 转换为适当的 CSV,但这意味着我们需要转换所有 200 个报告。因此这是不可行的。

请注意,我们没有同时部署 SSRS 2005 和 SSRS 2008 R2 的选项。

最佳答案

你的问题促使我最终出去尝试 write a custom RenderingExtension .这里的答案是创建一个“包装”旧 SSRS 2005 CSV 呈现扩展的扩展,并使其在 SSRS 2008 中以新名称可用。

我当然认为可以做到这一点。不幸的是,我没有 2005 SSRS DLL,所以我通过创建一个包装 2008 CSV 渲染器的扩展来完成我的概念证明。经过相当大的努力,我终于让这个工作了。也许这个答案会帮助您类似地为 2005 CSV 渲染器实现这一点。

一些注意事项:

  • 所有 kudo 都应该转到“Broes”,他在他的博客上针对 PDF 水印的类似案例(part 1part 2)写了一篇优秀的教程,这对创建扩展非常宝贵。
  • Microsoft warns关于编写一个“编写自定义呈现扩展很困难”的扩展,即使他们谈论的是一个实际上某事的扩展(除了包装默认扩展) ,我发现让这件事正常工作也很痛苦。

基本步骤如下:

  1. 创建一个包含新类的新类库(.NET 3.5,而不是 4.0+)(参见下面的代码)。
  2. 添加一个引用到:
    1. Microsoft.ReportingServices.DataRendering(用于默认 CSV 渲染器)
    2. Microsoft.ReportingServices.Interfaces
    3. Microsoft.ReportingServices.ProcessingCore
  3. 创建一个 CsvReport 渲染器的私有(private)实例,在构造函数中对其进行初始化。
  4. 在您的类中实现 IRenderingExtension 接口(interface)。将所有 方法调用路由到包装渲染器的私有(private)实例。
  5. 将项目的属性编辑为sign it with a strong name .
  6. 编译
  7. 将 DLL 复制到 ReportServer bin。
  8. 编辑 rssrvpolicy.config 文件以包含您的程序集 in a CodeGroup element .
  9. 编辑rsreportserver.config 文件to include the extension .
  10. 重新启动 SSRS 服务。
  11. (可选)祈祷,或点燃蜡烛。
  12. 在报表管理器中打开一个报表,验证您的扩展程序在那里:

Screenshot of the renderer

这是包装默认 CSV 渲染器的类的代码 list :

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

就是这样。至少经过几个小时的反复试验,我仍然记得所有重要的内容。以最后一个音符结束:

  • 应用程序事件日志有时包含 SSRS 错误。其中之一是“SSRS 无法加载...扩展”。这是我清除的最后一个障碍,我通过将目标框架从 .NET 4.0 降低到 3.5 来清除它。

如果有人尝试使用实际的 2005 CSV 呈现 DLL 进行此操作:请通过评论或编辑答案告诉我们它是否成功。

关于reporting-services - 强制 SSRS 2008 使用 SSRS 2005 CSV 渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com