SSRS 2008 R2-SSRS 2012-ReportViewer:SafariとChromeではレポートが空白です


84

レポートサービスをバージョン2008から別のサーバーバージョン2008R2に移行しました。バージョン2008では、レポートはSafariで正常に機能します。新しいバージョン2008R2のレポートは、まったく表示されません。私が見るのはパラメータセクションだけで、レポートは空白です。Chromeでも同じです。Microsoftによると、Safariは限定的な方法でサポートされています。レポートは複雑ではありません。実際、Safariに表示されるかどうかを確認するための行だけが含まれるレポートを作成しましたが、そのレポートも完全に空白です。SSRSレポートをSafariで表示できるようにした人はいますか?ある種の構成設定をいじる必要がありますか?


回答:


109

究極のソリューション(SSRS 2012でも機能します!)

次のスクリプトを次のファイル(SSRSサーバー上)に追加します
C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js

function pageLoad() {    
    var element = document.getElementById("ctl31_ctl10");
    if (element) 
    {
        element.style.overflow = "visible"; 
    }
}

:azzlakが指摘したように、divの名前は必ずしもctl31_ctl10。ではありません。SQL 2012の場合は試してctl32_ctl09、2008R2の場合は試してくださいctl31_ctl09。このソリューションが機能しない場合は、ブラウザからHTMLを調べて、overflow:autoプロパティをに変更してスクリプトが適切に機能したかどうかを確認してくださいoverflow:visible


ReportViewerコントロールのソリューション

このスタイルラインを.aspxページ(または.css可能な場合はリンクされたファイル)に挿入します

#reportViewer_ctl09 {
  overflow:visible !important;
 }

理由

ChromeとSafariはoverflow:auto、IEに関して異なる方法でレンダリングします。

SSRSHTMLはQuirksModeHTMLであり、IE5.5のバグに依存しています。非IEブラウザにはIEquirksmodeがないため、HTMLを正しくレンダリングします

SSRS 2008 R2レポートによって生成されたHTMLページには、スタイルのdivあるが含まれておりoverflow:auto、レポートが非表示のレポートに変わります。

<div id="ctl31_ctl10" style="height:100%;width:100%;overflow:auto;position:relative;">

Chromeの開発ツール()を使用して、作成されたWebページで手動でに変更overflow:autoするoverflow:visibleと、Chromeに関するレポートを表示できますF12


私はティムのソリューションが大好きです。それは簡単で機能します。

しかし、まだ問題があります。ユーザーがパラメーターを変更するたびに(私のレポートはパラメーターを使用します!)、AJAXはdivを更新し、overflow:autoタグが書き換えられ、スクリプトはそれを変更しません。

この技術ノートの詳細は、問題が何であるかを説明しています。

これは、AJAXパネルで構築されたページでは、ページ全体を更新せずに、AJAXパネルのみが状態を変更するために発生します。したがって、タグにOnLoad適用したイベントは<body>、ページが最初に読み込まれたときに1回だけ発生します。その後、AJAXパネルを変更しても、これらのイベントはトリガーされなくなります。

ユーザーeinarqはこの解決策を提案しました

もう1つのオプションは、関数の名前をpageLoadに変更することです。この名前の関数は、部分的に更新されるたびに、ページに存在する場合はasp.netajaxによって自動的に呼び出されます。これを行うと、bodyタグからonload属性を削除することもできます

そこで、ソリューションに示されている改善されたスクリプトを作成しました。


1
スクリプトをトリガーするために、関数page_loadをpageLoadに変更しました。それ以外の場合は、Chrome 13のレンダリングの問題を解決しているようです。残念ながら、SSRSの基本認証はSafari 5.1で機能しないようであるため、そこで確認することはできません。
kermatt 2011

理由は間違っています。本当の理由は、SSRSHTMLはQuirksModeHTMLであり、IE5.5のバグに依存しているためです。非IEブラウザにはIEquirksmodeがないため、HTMLを正しくレンダリングします。QuirksModeでIE5.5のバグをエミュレートしないブラウザーの場合、テーブル幅の設定が不足しています...ちなみに、これはIE 10にも当てはまります。これは、新しいdefault-quirksmodeモードがあるためです。
Stefan Steiger

8
完璧に動作します。ただし、SQL Server 2012の場合、問題のdividはctl32_ctl09です。
azzlack 2013年

3
id ctl32_ctl09または生成されたものを検索するのではなく、次を試してください。document.querySelector( "[id ^ = VisibleReportContent]")。parentNode;
パラ

1
@ JustinMangum-互換表示のIEでquerySelectorの使用が失敗します。これは、ほぼ確実にイントラネットSSRSサイトで有効になっています。症状は、[読み込み中]ダイアログが閉じないため、ユーザーがレポートを表示できなくなることです。
マイク

27

SizeToReportContent="true"以下に示すように含めるだけです

<rsweb:ReportViewer ID="ReportViewer1" runat="server" SizeToReportContent="True"...

4
a)正常に動作し、b)組み込みのソリューションのようであるため、これが受け入れられたソリューションではない理由はわかりません。reportviewerを適切に機能させるためのハックではありません。ReportViewerをハッキングして機能させることに何か問題があるわけではありません。reportviewer全体が大騒ぎしているようです。
Raif 2013年

3
このソリューションは、ReportViewerコントロールをアプリケーションに埋め込む場合にのみ適用されませんか?これがレポートマネージャーに適用され、レポートがReportServer URLから実行される場合は、この編集を含める必要がある場所を指定してください。
登録ユーザー

2
\ SQL \ MSRS11.MSSQLSERVER \ Reporting Services \ ReportServer \ Pages \ ReportViewer.aspxの次の行を参照していますか?<RS:ReportViewerHost ID = "ReportViewerControl" runat = "server" />
登録ユーザー

1
これは、こと細かに動作しますが、あなたが持っている場合は、多くのレポートに画像(指標/スパークライン)のそれはatrociouslyレンダリング時間を吹き出します。
トラブ2015年

1
SSRS 2012年にReportViewer.aspxを変更するとき、これは動作しません
キース・

23

SQL 2008 R2 SP1でChromeバージョン21を使用していますが、上記の修正はどれも機能しませんでした。以下は、機能したコードです。他の回答と同様に、このコードを「C:\ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js」に追加しました(上SSRSサーバー):

//Fix to allow Chrome to display SSRS Reports
function pageLoad() { 
    var element = document.getElementById("ctl31_ctl09");
    if (element) 
    {
        element.style.overflow = "visible";         
    } 
}

1
このソリューションは、私たちの環境で非常にうまく機能しています。おかげでマイク
ヴィンスPerta

14

これは既知の問題です。問題は、divタグのスタイルが「overflow:auto」であるということです。これは、SafariとChromeで使用されるWebKitではうまく実装されていないようです(EmanueleGrecoの回答を参照)。RS:ReportViewerHost要素を使用するというEmanueleの提案を利用する方法がわかりませんでしたが、JavaScriptを使用して解決しました。

問題

ここに画像の説明を入力してください

解決

「overflow:auto」はid「ctl31_ctl10」のdiv要素のstyle属性で指定されているため、スタイルシートファイルでオーバーライドできないため、JavaScriptを使用しました。「C:\ ProgramFiles \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js」に次のコードを追加しました

function FixSafari()
{    
    var element = document.getElementById("ctl31_ctl10");
    if (element) 
    {
        element.style.overflow = "visible";  //default overflow value
    }
}

// Code from http://stackoverflow.com/questions/9434/how-do-i-add-an-additional-window-onload-event-in-javascript
if (window.addEventListener) // W3C standard
{
    window.addEventListener('load', FixSafari, false); // NB **not** 'onload'
} 
else if (window.attachEvent) // Microsoft
{
    window.attachEvent('onload', FixSafari);
}

注意

あるように見えるSSRS 2005のためのソリューション、私は試していないが、私は、私は「DocMapAndReportFrame」クラスを見つけることができないので、それはSSRS 2008には適用されないと思うこと。


2
わからないことが一つあります。\ ReportingServices.jsでコード関数FixSariを適用してから、SSRSでレポートを表示するコードを実行する場合、FixSafariのソースメソッドコードを実行する関数をどこに適用しますか?私が正しく理解していれば、ReportingServices.jsの元のコードが生成され、最終的にFixSafariコードを実行しますか?
What'sUP 2013年

12

上記のアイデアに基づく私の解決策。

function pageLoad() {
    var element = document.querySelector('table[id*=_fixedTable] > tbody > tr:last-child > td:last-child > div');
    if (element) {
        element.style.overflow = "visible";
    } 
}

特定のIDに限定されず、jQueryなどの他のライブラリを含める必要はありません。


ただし、ctl31_ctl10やそのバリアントなど、他のすべての要素が対象としている要素には、必ずしも_fixedTableが含まれているとは限りません。私は何かが足りないのですか?
Baodad 2016

@ Baodad-上記のソリューションは、子セレクターを使用して正しいdivを見つけます。これは、より静的なid属性を持つチェーンの上位のアイテムに基づいて開始し、次に子をツリーを下って目的のdivまでウォークダウンします。変数に、より説明的でオーバーロードの少ない名前を使用することをお勧めしますが、それ以外の点では優れたソリューションです。推奨される名前:reportPayloadElement。
ブライアンスウィフト

11

これが私がReportServer 2008R2に使用したソリューションです

レポートサーバーがテーブルの「id」属性で使用するために出力する内容に関係なく機能するはずです。「ctl31_fixedTable」になるとは限らないと思います

上記の提案といくつかの方法を組み合わせて、ここにあるjavascriptファイルからjqueryライブラリをページに動的にロードしました。

サーバーで、次のディレクトリに移動します:C:\ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js

jqueryライブラリjquery-1.6.2.min.jsをディレクトリにコピーします

ファイルReportingServices.jsのバックアップコピーを作成します。ファイルを編集します。そして、これをその下部に追加します。

var jQueryScriptOutputted = false;
function initJQuery() {

    //if the jQuery object isn't available
    if (typeof(jQuery) == 'undefined') {


        if (! jQueryScriptOutputted) {
            //only output the script once..
            jQueryScriptOutputted = true;

            //output the script 
            document.write("<scr" + "ipt type=\"text/javascript\" src=\"../js/jquery-1.6.2.min.js\"></scr" + "ipt>");
         }
        setTimeout("initJQuery()", 50);
    } else {

        $(function() {     

        // Bug-fix on Chrome and Safari etc (webkit)
        if ($.browser.webkit) {

            // Start timer to make sure overflow is set to visible
             setInterval(function () {
                var div = $('table[id*=_fixedTable] > tbody > tr:last > td:last > div')

                div.css('overflow', 'visible');
            }, 1000);
        }

        });
    }        
}

initJQuery();

ただし、ページに複数のレポートテーブルがある場合、これによってコントロールが複数回読み込まれることはありませんか?その場合、最初の行を次のように変更できます。varjQueryScriptOutputted =((typeof(jQueryScriptOutputted)== 'undefined')?false:true);
rmcsharry 2012年

4

これはjQueryで簡単に修正できます-そして少し醜いハック:-)

ReportViewerユーザーコントロールを備えたasp.netページがあります。

 <rsweb:ReportViewer ID="ReportViewer1" runat="server"...

ドキュメント準備完了イベントで、タイマーを開始し、オーバーフロー修正が必要な要素を探します(以前の投稿のように)。

 <script type="text/javascript">
    $(function () {
        // Bug-fix on Chrome and Safari etc (webkit)
        if ($.browser.webkit) {
            // Start timer to make sure overflow is set to visible
             setInterval(function () {
                var div = $('#<%=ReportViewer1.ClientID %>_fixedTable > tbody > tr:last > td:last > div')
                div.css('overflow', 'visible');
            }, 1000);
        }
    });
</script>

特定のIDを持っていると仮定するよりも優れています。タイマーはお好きなように調整できます。ここでは1000ミリ秒に設定しました。


3

参考までに-2012SP1では上記のどれもうまくいきませんでした...簡単な解決策は、共有データソースに資格情報を埋め込み、SafariにSSRSサーバーサイトを信頼するように指示することでした。それからそれはうまくいきました!統合されたセキュリティがSafariで確実に機能しないことを見つけるためだけに、上記のような想定されるソリューションを追いかけるのに何日もかかりました-Macのキーチェーンをいじる必要があり、それでも確実に機能しません。


2

Emanueleによって提供されたソリューションは私のために働いた。サーバーから直接アクセスするとレポートを表示できましたが、aspxページでReportViewerコントロールを使用すると、レポートを表示できませんでした。レンダリングされたHTMLを調べたところ、オーバーフロープロパティがautoに設定されているID「ReportViewerGeneral_ctl09」(ReportViewerGeneralはレポートビューアコントロールのサーバーID)のdivが見つかりました。

<div id="ReportViewerGeneral_ctl09" style="height: 100%; width: 100%; overflow: auto; position: relative; ">...</div>

Emanueleが説明した手順を使用して、これを次のように表示に変更しました。

function pageLoad() {
    var element = document.getElementById("ReportViewerGeneral_ctl09");

    if (element) {
        element.style.overflow = "visible";
    }
}

2

私はこれを使用しました。Report.aspxページでjqueryへのスクリプト参照を追加します。以下を使用して、JQueryをMicrosoftイベントにリンクします。オーバーフローを設定するために、Ericの提案を少し使用しました。

$(document).ready(function () {
    if (navigator.userAgent.toLowerCase().indexOf("webkit") >= 0) {        
        Sys.Application.add_init(function () {
            var prm = Sys.WebForms.PageRequestManager.getInstance();
            if (!prm.get_isInAsyncPostBack()) {
                prm.add_endRequest(function () {
                    var divs = $('table[id*=_fixedTable] > tbody > tr:last > td:last > div')
                    divs.each(function (idx, element) {
                        $(element).css('overflow', 'visible');
                    });
                });
            }
        });
    }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.