web-dev-qa-db-ja.com

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

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

84
Anita C

究極のソリューション(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の場合はtryctl32_ctl09、2008 R2の場合はctl31_ctl09をお試しください。このソリューションが機能しない場合は、ブラウザのHTMLを見て、overflow:autoプロパティをoverflow:visibleに変更して、スクリプトが適切に機能しているかどうかを確認してください。


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

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

#reportViewer_ctl09 {
  overflow:visible !important;
 }

理由

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

SSRS HTMLはQuirksMode HTMLであり、IE 5.5のバグに依存しています。 IE以外のブラウザにはIE quirksmodeがないため、HTMLを正しくレンダリングします

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

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

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


Timのソリューション が大好きで、簡単で効果的です。

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

このテクニカルノートの詳細 問題の説明:

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

ユーザーeinarqが提案 このソリューション

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

そのため、ソリューションに示されている改善されたスクリプトを書きました。

107
Emanuele Greco

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

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

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";         
    } 
}
23
Michael Brown

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

問題

enter image description here

ソリューション

Idがctl31_ctl10のdiv要素のstyle属性で「overflow:auto」が指定されているため、スタイルシートファイルでオーバーライドできないため、JavaScriptに頼りました。 「C:\ Program Files\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に適用できるとは思いません。

14
Tim Partridge

上記のアイデアに基づいた私のソリューション。

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などの他のライブラリを含める必要もありません。

12
Jim Bauwens

Report Server 2008 R2に使用したソリューションは次のとおりです。

レポートサーバーがテーブルの「id」属性で使用するために出力するものに関係なく動作するはずです。 「ctl31_fixedTable」であると常に仮定できるとは思わない

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

サーバーで、ディレクトリ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();
11
Eric Weiss

これは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 msに設定します。

4
henebb

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

3
Gary Melhaff

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

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

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

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

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

これを使用しました。 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');
                    });
                });
            }
        });
    }
});
2
MeyC