SSRS 2008 R2 - SSRS 2012 - Trình xem báo cáo: Báo cáo trống trong Safari và Chrome


84

Tôi đã di chuyển dịch vụ báo cáo của chúng tôi từ phiên bản 2008 sang phiên bản máy chủ khác 2008 R2. Trong phiên bản 2008, các báo cáo hoạt động tốt trên Safari. Phiên bản mới 2008 R2 các báo cáo hoàn toàn không hiển thị. Tất cả những gì tôi thấy là phần tham số và sau đó là báo cáo trống. Tương tự trong Chrome. Theo Microsoft Safari IS được hỗ trợ nếu trong thời gian hạn chế. Các báo cáo không phức tạp. Trên thực tế, tôi đã tạo một báo cáo chỉ có một dòng trên đó để xem liệu nó có hiển thị trong Safari hay không nhưng không, báo cáo đó cũng hoàn toàn trống. Có ai làm cho báo cáo SSRS có thể xem được trên Safari không? Tôi có phải bối rối với một số loại cài đặt cấu hình không?


Câu trả lời:


109

Giải pháp cuối cùng (cũng hoạt động trong SSRS 2012!)

Nối tập lệnh sau vào tệp sau (trên Máy chủ 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"; 
    }
}

Lưu ý : Như azzlak đã lưu ý, tên của div không phải lúc nào cũng vậy ctl31_ctl10. Đối với SQL 2012 hãy thử ctl32_ctl09và đối với 2008 R2 hãy thử ctl31_ctl09. Nếu giải pháp này không hoạt động, hãy xem HTML từ trình duyệt của bạn để xem liệu tập lệnh có hoạt động đúng cách hay không khi thay đổi thuộc overflow:autotính thành overflow:visible.


Giải pháp kiểm soát ReportViewer

Chèn vào .aspxtrang (hoặc vào một .csstệp được liên kết , nếu có) dòng kiểu này

#reportViewer_ctl09 {
  overflow:visible !important;
 }

Lý do

Chrome và Safari hiển thị overflow:autotheo cách khác với IE.

SSRS HTML là HTML QuirksMode và phụ thuộc vào lỗi IE 5.5. Các trình duyệt không phải IE không có mã quirksmode của IE và do đó hiển thị HTML một cách chính xác

Trang HTML được tạo bởi các báo cáo SSRS 2008 R2 chứa một trang divoverflow:autokiểu dáng và nó biến báo cáo thành một báo cáo vô hình.

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

Tôi có thể xem các báo cáo trên Chrome bằng cách chuyển overflow:autosang overflow:visibletrang web được tạo theo cách thủ công bằng Công cụ dành cho nhà phát triển của Chrome ( F12).


Tôi thích giải pháp của Tim , nó dễ dàng và hiệu quả.

Nhưng vẫn còn một vấn đề: bất cứ khi nào người dùng thay đổi tham số (báo cáo của tôi sử dụng tham số!) AJAX làm mới div, thẻ tràn: tự động được viết lại và không có tập lệnh nào thay đổi nó.

Chi tiết kỹ thuật này giải thích vấn đề là gì:

Điều này xảy ra bởi vì trong một trang được xây dựng bằng bảng AJAX, chỉ có bảng AJAX thay đổi trạng thái của chúng mà không làm mới toàn bộ trang. Do đó, các OnLoadsự kiện bạn đã áp dụng trên <body>thẻ chỉ được kích hoạt một lần: lần đầu tiên trang của bạn tải. Sau đó, việc thay đổi bất kỳ bảng AJAX nào sẽ không kích hoạt các sự kiện này nữa.

Người dùng einarq đã đề xuất giải pháp này :

Một tùy chọn khác là đổi tên hàm của bạn thành pageLoad. Bất kỳ hàm nào có tên này sẽ được gọi tự động bởi asp.net ajax nếu nó tồn tại trên trang, cũng như sau mỗi lần cập nhật một phần. Nếu bạn làm điều này, bạn cũng có thể xóa thuộc tính onload khỏi thẻ body

Vì vậy, đã viết kịch bản cải tiến được hiển thị trong giải pháp.


1
Tôi đã thay đổi hàm page_load thành pageLoad để kích hoạt tập lệnh. Nếu không, nó dường như giải quyết các vấn đề hiển thị trong Chrome 13. Rất tiếc, xác thực cơ bản trong SSRS dường như không hoạt động với Safari 5.1, vì vậy tôi không thể xác minh ở đó.
kermatt

Lý do là SAI. Lý do thực sự là, SSRS HTML là HTML QuirksMode và phụ thuộc vào lỗi IE 5.5. Các trình duyệt không phải IE không có mã quirksmode của IE và do đó hiển thị HTML chính xác. Đối với các trình duyệt không mô phỏng lỗi IE 5.5 trong QuirksMode của họ, nó thiếu thiết lập chiều rộng bảng ... Nhân tiện, điều này cũng áp dụng cho IE 10, vì nó có chế độ quirksmode mặc định mới.
Stefan Steiger

8
Hoạt động hoàn hảo. Nhưng đối với SQL Server 2012, id div vi phạm là ctl32_ctl09.
azzlack

3
thay vì tìm kiếm id ctl32_ctl09 hoặc bất cứ thứ gì được tạo, hãy thử: document.querySelector ("[id ^ = VisibleReportContent]"). parentNode;
Para

1
@JustinMangum - việc sử dụng querySelector sẽ không thành công trong IE trong Chế độ xem tương thích, gần như chắc chắn đã được bật cho các trang SSRS của mạng nội bộ. Dấu hiệu là hộp thoại Đang tải sẽ không bao giờ đóng, vì vậy người dùng sẽ không thể xem bất kỳ báo cáo nào.
Mike

27

Chỉ cần bao gồm SizeToReportContent="true"như hình dưới đây

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

4
Tôi không biết tại sao đây không phải là giải pháp được chấp nhận vì a) nó hoạt động tốt, và b) nó có vẻ là giải pháp tích hợp sẵn. Không phải là một hack để làm cho người xem báo cáo hoạt động bình thường. Không có gì sai khi hack ReportViewer để làm cho nó hoạt động. Có vẻ như toàn bộ người xem báo cáo đang bị tấn công lớn.
Raif

3
Không phải giải pháp này chỉ áp dụng cho việc nhúng điều khiển ReportViewer trong một ứng dụng? Nếu điều này áp dụng cho Trình quản lý báo cáo và các báo cáo chạy từ URL Máy chủ báo cáo, thì vui lòng chỉ định nơi bạn cần bao gồm chỉnh sửa này.
Người dùng đã đăng ký

2
Bạn đang đề cập đến dòng sau trong \ SQL \ MSRS11.MSSQLSERVER \ Reporting Services \ ReportServer \ Pages \ ReportViewer.aspx: <RS: ReportViewerHost ID = "ReportViewerControl" runat = "server" />
Người dùng đã đăng ký

1
có thể hoạt động tốt, nhưng nếu bạn có nhiều hình ảnh (chỉ báo / Đường gấp khúc) trên một báo cáo, nó sẽ làm mất thời gian kết xuất một cách khủng khiếp.
Trubs

1
Điều này không hoạt động khi sửa đổi ReportViewer.aspx trong SSRS 2012.
Keith

23

Tôi đang sử dụng phiên bản Chrome 21 với SQL 2008 R2 SP1 và không có bản sửa lỗi nào ở trên phù hợp với tôi. Dưới đây là mã đã hoạt động, cũng như với các câu trả lời khác, tôi đã thêm đoạn mã này vào Nối vào "C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js" (trên Máy chủ SSRS):

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

1
Giải pháp này đang hoạt động rất tốt trong môi trường của chúng tôi. Cảm ơn Mike
Vince Perta

14

Đây là một vấn đề đã biết . Vấn đề là thẻ div có kiểu "tràn: tự động" dường như không được triển khai tốt với WebKit được Safari và Chrome sử dụng (xem câu trả lời của Emanuele Greco). Tôi không biết cách tận dụng gợi ý của Emanuele để sử dụng phần tử RS: ReportViewerHost, nhưng tôi đã giải quyết nó bằng JavaScript.

Vấn đề

nhập mô tả hình ảnh ở đây

Giải pháp

Vì "tràn: tự động" được chỉ định trong thuộc tính style của phần tử div với id "ctl31_ctl10", chúng tôi không thể ghi đè nó trong tệp biểu định kiểu nên tôi đã sử dụng JavaScript. Tôi đã thêm mã sau vào "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);
}

Ghi chú

Có vẻ như có một giải pháp cho SSRS 2005 mà tôi chưa thử nhưng tôi không nghĩ nó có thể áp dụng cho SSRS 2008 vì tôi không thể tìm thấy lớp "DocMapAndReportFrame".


2
Có một điều tôi không hiểu. nếu bạn áp dụng hàm mã FixSari trong \ ReportingServices.js và sau đó bạn thực thi mã để hiển thị báo cáo trong SSRS, thì bạn áp dụng hàm để thực thi mã phương thức nguồn cho FixSafari ở đâu? Nếu tôi hiểu đúng, mã gốc cho ReportingServices.js được tạo và cuối cùng bạn thực thi mã FixSafari?
What'sUP

12

Giải pháp của tôi dựa trên những ý tưởng trên.

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

Nó không giới hạn ở một id nhất định và bạn không cần phải bao gồm bất kỳ thư viện nào khác như jQuery.


Nhưng các phần tử mà mọi người khác đang nhắm mục tiêu, như ctl31_ctl10 và các biến thể của nó, không nhất thiết phải có _fixedTable trong đó. Tui bỏ lỡ điều gì vậy?
Baodad

@Baodad - Giải pháp trên sử dụng Bộ chọn con để tìm div chính xác. Nó bắt đầu dựa trên một mục cao hơn trong chuỗi với thuộc tính id tĩnh hơn, sau đó đưa con cái xuống cây đến div mong muốn. Tôi muốn nó sử dụng một tên mô tả hơn, ít quá tải hơn cho biến, nhưng đây là một giải pháp tuyệt vời. Tên đề xuất: reportPayloadElement.
Brian Swift

11

Đây là giải pháp tôi đã sử dụng cho Report Server 2008 R2

Nó sẽ hoạt động bất kể Máy chủ Báo cáo sẽ xuất ra để sử dụng cho thuộc tính "id" của bảng. Tôi không nghĩ rằng bạn luôn có thể cho rằng nó sẽ là "ctl31_fixedTable"

Tôi đã sử dụng kết hợp đề xuất ở trên và một số cách để tải động các thư viện jquery vào một trang từ tệp javascript được tìm thấy tại đây

Trên máy chủ, hãy chuyển đến thư mục: C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js

Sao chép thư viện jquery jquery-1.6.2.min.js vào thư mục

Tạo bản sao lưu của tệp ReportingServices.js Chỉnh sửa tệp. Và nối cái này vào dưới cùng của nó:

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();

Tuy nhiên, một câu hỏi đặt ra, nếu có nhiều hơn một bảng báo cáo trên trang, điều này sẽ không gây ra nhiều lần tải điều khiển? Nếu vậy thì dòng đầu tiên có thể được thay đổi thành: var jQueryScriptOutputted = ((typeof (jQueryScriptOutputted) == 'undefined')? False: true);
rmcsharry

4

Bạn có thể khắc phục điều này dễ dàng với jQuery - và một chút hack xấu xí :-)

Tôi có một trang asp.net với điều khiển người dùng ReportViewer.

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

Trong sự kiện đã sẵn sàng tài liệu, sau đó, tôi bắt đầu bộ đếm thời gian và tìm phần tử cần sửa lỗi tràn (như các bài viết trước):

 <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>

Tốt hơn là giả sử nó có một id nhất định. Bạn có thể điều chỉnh bộ hẹn giờ thành bất cứ điều gì bạn muốn. Tôi đặt nó thành 1000 ms ở đây.


3

FYI - không có cách nào ở trên phù hợp với tôi trong 2012 SP1 ... giải pháp đơn giản là nhúng thông tin đăng nhập vào nguồn dữ liệu được chia sẻ và sau đó yêu cầu Safari tin tưởng trang web máy chủ SSRS. Sau đó, nó hoạt động tuyệt vời! Đã mất nhiều ngày theo đuổi các giải pháp được cho là như trên chỉ để tìm ra bảo mật tích hợp sẽ không hoạt động đáng tin cậy trên Safari - bạn phải làm rối với chuỗi khóa trên mac và sau đó vẫn không hoạt động đáng tin cậy.


2

Giải pháp do Emanuele cung cấp đã hiệu quả với tôi. Tôi có thể xem báo cáo khi truy cập trực tiếp từ máy chủ nhưng khi tôi sử dụng điều khiển ReportViewer trên trang aspx của mình, tôi không thể xem báo cáo. Khi kiểm tra HTML được hiển thị, tôi tìm thấy một div theo id "ReportViewerGeneral_ctl09" ( ReportViewerGeneral là id máy chủ của điều khiển trình xem báo cáo) có thuộc tính tràn của nó được đặt thành tự động.

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

Tôi đã sử dụng quy trình được giải thích bởi Emanuele để thay đổi điều này thành hiển thị như sau:

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

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

2

Tôi đã sử dụng cái này. Thêm tham chiếu tập lệnh vào jquery trên trang Report.aspx. Sử dụng phần sau để liên kết JQuery với các sự kiện microsoft. Đã sử dụng một chút gợi ý của Eric để thiết lập phần tràn.

$(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');
                    });
                });
            }
        });
    }
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.