3

レポートサーバーをSSRS2005からSSRS2008R2にアップグレードしています。
以下のブロックに示すように、列の合計が2005年のように左側ではなく、2008年の詳細値の右側に表示される、SSRS2008のCSVエクスポートレンダリングに問題があります。
117および131は、それぞれColumn2とColumn3の合計です。

SSRS2005CSV出力

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

SSRS2008CSV出力

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レンダラーは、チャートとゲージのサポートによりSSRS 2008 R2で大きな変更が加えられExcel、さらに重要なことに、デフォルトモードとモードの2つのモードを提供することを理解していCompliantます。ただし、どちらのモードもこの問題の修正には役立ちません。準拠モードは2005年のモードに最も近いはずでしたが、私の場合は明らかに十分に近いものではありません。

私の質問:
SSRS 2008を強制的に下位互換モードにフォールバックして、2005 CSV形式にエクスポートする方法はありますか?

試行した解決策:
a)2005ベースのCRIの使用
ExecutionLog2 に関するこの記事に基づいて、SSRS 2008 R2で自動アップグレードが不可能なレポート(たとえば、2005ベースのCustomReportItemコントロールで作成されたレポート)が検出された場合、それらの特定のレポートは次のようになります。 「透過的な下位互換性モード」で古いYukonエンジンを使用して処理されます。

以前のバージョンモード(2005)にフォールバックして、レンダリングしようとしているようです。そこで、2005ベースのバーコードCustomReportItemを使用して、SSRS 2008 R2レポートサーバーに展開しようとしましたが、バーコードを抑制したにもかかわらず、以前と同じ結果が表示されます。これは、SSRS 2008 R2がレポート出力の一部を抑制し、残りを表示する方法を見つけたためです。SSRS2008R2に古いYukonエンジンで処理させる2005ベースのCRIを見つけるのは素晴らしいことです。「古いYukon処理エンジン」を使用している場合でも、新しいCSVレンダラーを使用している可能性があるため、同じ出力が表示される可能性があることに注意してください。それが本当なら、このオプションは無意味です。

b)XMLレンダラー
の使用カスタムXMLレンダラーを使用してからXSLTを使用してxmlを適切なCSVに変換できますが、これは200個のレポートすべてを変換する必要があることを意味します。したがって、これは実行可能ではありません。

SSRS2005とSSRS2008R2を並べて展開するオプションはありません。

4

1 に答える 1

5

あなたの質問がきっかけで、ついに外に出て、カスタムのRenderingExtensionを書こうとしました。ここでの答えは、古いSSRS 2005 CSVレンダリング拡張機能を「ラップ」し、SSRS2008で新しい名前で使用できるようにする拡張機能を作成することです。

私は確かにこれを行うことが可能だと思います。残念ながら、私は2005 SSRS DLLを持っていないので、2008CSVレンダラーをラップする拡張機能を作成して概念実証を行いまし。かなり苦労した後、私はついにこれを機能させることができました。たぶん、この答えは、2005年のCSVレンダラーにこれを同様に実装するのに役立ちます。

前もっていくつかのメモ:

  • すべての工藤は、拡張機能の作成に非常に貴重なPDF透かし(パート1パート2 )に関する同様のケースについて、ブログに優れたチュートリアルを書いた「 B​​roes 」に行く必要があります。
  • Microsoftは、 「カスタムレンダリング拡張機能を作成するのは難しい」という拡張機能の作成について警告してます。実際に何かを実行する拡張機能について話している場合でも(デフォルトの拡張機能をラップする以外に)、機能させるだけでもかなりの可能性があることがわかりました。痛みも。

したがって、基本的な手順は次のとおりです。

  1. 新しいクラス(以下のコードを参照)を使用して、新しいクラスライブラリ(4.0以降ではなく.NET 3.5)を作成します。
  2. 次への参照を 追加します。
    1. Microsoft.ReportingServices.DataRendering(デフォルトのCSVレンダラー用)
    2. Microsoft.ReportingServices.Interfaces
    3. Microsoft.ReportingServices.ProcessingCore
  3. CsvReportレンダラーのプライベートインスタンスを作成し、コンストラクターで初期化します。
  4. クラスにIRenderingExtensionインターフェースを実装します。すべてメソッド呼び出しを、ラップされたレンダラーのプライベートインスタンスにルーティングします。
  5. プロジェクトのプロパティを編集して、厳密な名前で署名します。
  6. コンパイルします。
  7. DLLをReportServerビンにコピーします。
  8. rssrvpolicy.configファイルを編集して、アセンブリをCodeGroup要素に含めます。
  9. rsreportserver.configファイルを編集して拡張子を含めます。
  10. SSRSサービスを再起動します。
  11. (オプション)祈るか、ろうそくに火をつけます。
  12. レポートマネージャでレポートを開き、拡張機能がそこにあることを確認します。

レンダラーのスクリーンショット

デフォルトの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>

物事がうまくいったかどうかをすばやくテストするのに非常に役立つ1つのスクリプト(主に多くの試行錯誤が含まれていたため)。これはRSユーティリティで実行します。

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 

以上です。少なくとも、数時間の試行錯誤の末に私が覚えている重要なことはすべてです。最後の1つのメモで終了するには:

  • アプリケーションイベントログにSSRSエラーが含まれることがあります。それらの1つは、「SSRSは...拡張機能をロードできません」でした。これが私がクリアした最後のハードルであり、ターゲットフレームワークを.NET4.0から3.5に変更することでクリアしました。

誰かが実際の2005CSVレンダリングDLLでこれを試みた場合:コメントまたは回答の編集で成功したかどうかをお知らせください。

于 2012-10-24T21:13:27.883 に答える