レポートサービスをバージョン2008から別のサーバーバージョン2008 R2に移行しました。バージョン2008では、レポートはSafariで正常に機能します。新しいバージョン2008 R2では、レポートはまったく表示されません。表示されるのはパラメータセクションのみで、レポートは空白です。 Chromeでも同じです。 Microsoft Safariによると、ISは限定的な方法でサポートされています。レポートは複雑ではありません。実際、Safariに表示されるかどうかを確認するための行のみを含むレポートを作成しましたが、そのレポートも完全に空白です。 SSRSレポートをSafariで表示できるようにしましたか?何らかの構成設定をいじる必要がありますか?
次のスクリプトを次のファイルに追加します(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
に変更して、スクリプトが適切に機能しているかどうかを確認してください。
このスタイル行を.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:auto
をoverflow:visible
に手動で変更すると、Chromeに関するレポートを表示できます(F12)。
Timのソリューション が大好きで、簡単で効果的です。
しかし、まだ問題があります:ユーザーがパラメーターを変更するたびに(私のレポートはパラメーターを使用します!)AJAXはdivを更新し、overflow:autoタグが書き換えられます、それを変更するスクリプトはありません。
このテクニカルノートの詳細 問題の説明:
これは、AJAXパネルで構築されたページでは、AJAXパネルのみがページ全体を更新せずに状態を変更するためです。そのため、
<body>
タグに適用したOnLoad
イベントは、ページが初めて読み込まれたときに1回だけ発生します。その後、AJAXパネルのいずれを変更しても、これらのイベントはトリガーされません。
ユーザーeinarqが提案 このソリューション :
別のオプションは、関数の名前をpageLoadに変更することです。この名前の関数は、ページ上に存在する場合、部分更新のたびにasp.net ajaxによって自動的に呼び出されます。これを行う場合は、bodyタグからonload属性を削除することもできます
そのため、ソリューションに示されている改善されたスクリプトを書きました。
以下に示すようにSizeToReportContent="true"
を含めるだけです
<rsweb:ReportViewer ID="ReportViewer1" runat="server" SizeToReportContent="True"...
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";
}
}
これは 既知の問題 です。問題は、divタグのスタイルが「overflow:auto」であり、SafariおよびChromeで使用されるWebKitでは明らかに実装されていないことです(Emanuele Grecoの回答を参照)。 RS:ReportViewerHost要素を使用するというEmanueleの提案を活用する方法を知りませんでしたが、JavaScriptを使用して解決しました。
問題
ソリューション
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に適用できるとは思いません。
上記のアイデアに基づいた私のソリューション。
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などの他のライブラリを含める必要もありません。
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();
これは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に設定します。
参考までに、2012 SP1では上記のいずれも機能しませんでした...簡単な解決策は、共有データソースに資格情報を埋め込み、SafariにSSRSサーバーサイトを信頼するように指示することでした。その後、それはうまくいきました!上記のような想定されるソリューションを追いかけて数日間かかっただけで、統合セキュリティはSafariでは確実に機能しません。Macのキーチェーンをいじる必要がありますが、それでも確実に機能しません。
エマヌエーレが提供するソリューションは私にとってはうまくいきました。サーバーから直接アクセスするとレポートを見ることができましたが、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";
}
}
これを使用しました。 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');
});
});
}
});
}
});