SSRS 2008 R2 - SSRS 2012 - ReportViewer: Báo cáo trong Safari / Chrome nhưng hoạt động tốt trong Firefox / Internet Explorer 8… tại sao?


83

Tôi có một số báo cáo đơn giản SSRS 2008 R2, nhưng chúng hoàn toàn không hiển thị trong Safari hoặc Chrome. Theo Sách trực tuyến của Microsoft, các trình duyệt này được hỗ trợ trong thời gian hạn chế. Tuy nhiên, tôi không thể nhìn thấy gì sau khi đồng hồ "Đang tải" dữ liệu hoàn tất. Thanh thông số và phần điều hướng vụn bánh mì ở đầu trang đều có ở đó. Ngoài ra, tôi có thể Lưu / Xuất sang bất kỳ định dạng nào trên Safari và Chrome. Nó chỉ không hiển thị phần báo cáo mà chỉ để trống.

Tôi có phải sử dụng chứng chỉ và kết nối bảo mật (hiện không được thiết lập với HTTPS, chỉ HTTP) không? Có bất kỳ cấu hình phía máy chủ nào cần được tinh chỉnh không? Có ai đã thành công khi hiển thị BẤT KỲ báo cáo nào trên Safari / Chrome bằng các phiên bản SSRS trước (2005) không?

Tôi đang sử dụng Safari 5.0.4Chrome 10.0.648.151. Tôi biết điểm giống nhau của hai trình duyệt này là cả hai đều dựa trên WebKit .

Báo cáo hiển thị thành công trên Internet Explorer 8 (tất nhiên) và Firefox 4.0.

Tôi thực sự sẽ đánh giá cao nó nếu ai đó có thể làm sáng tỏ điều này.



2
Greg H nhìn vào giải pháp của tôi và cho tôi biết nếu nó giải quyết vấn đề
Emanuele Greco

Câu trả lời:


94

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 " C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js " (trên Máy chủ SSRS):

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

Trên thực tế, tôi không biết nếu tên của div luôn luôn ctl31_ctl10: trong trường hợp của tôi là (thay vì tìm thấy trên SQL Server 2012 azzlak ctl32_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 tính tràn: tự động thành tràn: hiển thị .


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

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

#reportViewer_ctl09 {
  overflow:visible !important;
}

Lý do

Chrome và Safari hiển thị tràn: tự động theo cách khác với Internet Explorer.

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 div có kiểu tràn: auto , và nó biến báo cáo thành một báo cáo ẩn.

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

Thay đổi theo cách thủ công (sử dụng cửa sổ gỡ lỗi của Chrome) tràn HTML cuối cùng : tự động trong tràn: hiển thị Tôi có thể xem báo cáo trên Chrome.

Tôi thích giải pháp của Tim ; thật 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 sự kiện OnLoad mà bạn áp dụng trên 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.

Mr.einarq đã gợi ý cho tôi giải pháp ở đâ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 ASP.NET Ajax tự động gọi nếu nó tồn tại trên trang, 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, tôi đã viết kịch bản cải tiến được hiển thị trong giải pháp.


Thật tuyệt, tôi có thể xác nhận điều này cũng hiệu quả với tôi (SQL 2008 R2).
Vincent Vancalbergh

3
Cũng làm việc trong SSRS 2012. Trong trường hợp của tôi, div có id "ctl31_ctl09". Cảm ơn bạn!
Chris

Giải pháp do Emanuele cung cấp đã phù hợp với tôi nhưng tôi gặp sự cố khi xem báo cáo bằng cách sử dụng điều khiển ReportViewer trên trang aspx của mình. Vì vậy, tôi đã thêm một số mã trên trang aspx. Tôi đã đề cập đến nó ở đây
Samir K

Tôi không thể kích hoạt sự kiện "pageLoad", mặc dù tôi đã cắt và dán nó vào cuối tệp JS được chỉ ra trên máy chủ báo cáo SSRS của mình. Bất kỳ đề xuất nào về lý do tại sao điều đó có thể không diễn ra?
Ben Finkel

@BenFinkel "pageLoad () được gọi sau mỗi lần làm mới UpdatePanel" ( encosia.com/document-ready-and-pageload-are-not-the-same ) vì vậy có thể vấn đề là khác .. hãy thử gỡ lỗi cửa sổ trình duyệt xem có văn bản do bạn sửa đổi được liên kết và nếu có lỗi Javascript.
Emanuele Greco

43

Giải pháp dựa trên CSS

Tôi đã có thể thêm phần sau vào biểu định kiểu cho Dịch vụ báo cáo và nó đã sửa lỗi đó cho tôi trong Chrome.

Tuyên bố từ chối trách nhiệm: Điều này không được kiểm tra kỹ lưỡng về khả năng tương thích trên nhiều trình duyệt.

/ ************** CHROME BUG FIX ***************** /
div # ctl31_ctl09,
div # ctl31_ctl10
{
    tràn: hiển thị! quan trọng;
}
/ ********************************************* /

Thêm nó vào đầu ReportingServices.csstệp.

Đối với tôi, tệp đó được đặt tại:

C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\Styles\ReportingServices.css


3
+1 hoạt động giống như một sự quyến rũ trên tất cả các trình duyệt (Chrome, Safari, IE9, IE10) được thử nghiệm. Trên MAC OS X Chrome cũng vậy ...
YvesR

Nếu bạn không có quyền truy cập vào máy chủ để sửa đổi css cho tất cả người dùng, bạn có thể sử dụng CSS trong câu trả lời này với tiện ích mở rộng trình duyệt như Stylebot .
Mike Bockus

+1 Giải pháp tốt! Điều này rẻ hơn (hiệu suất khôn ngoan) so với sửa chữa bằng Javascript và không cần phải cập nhật mỗi khi bảng điều khiển AJAX cập nhật.
KyleMit

1
ồ! đây là vấn đề của tôi, tôi mới bắt đầu nghiên cứu triển khai báo cáo SSRS R2 và nó hiển thị trong IE nhưng không hiển thị trong chrome. có lời giải thích tại sao lại như vậy không? dù sao, cảm ơn Ryan!
Francis Saul

1
Của tôi được gắn nhãn là ctl32_ctl109 trong SSRS 2012. Sau khi tra cứu và sử dụng CSS của bạn với giá trị của tôi, nó hoạt động hoàn hảo.
Matt H

18

Đâ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 /programming/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ĩ rằng nó có thể áp dụng cho SSRS 2008 vì tôi không thể tìm thấy lớp "DocMapAndReportFrame".


7

Giải pháp toàn hệ thống dựa trên CSS

Điều này không yêu cầu bất kỳ khung JavaScript hoặc Ajax hoặc bất kỳ trình bao bọc nào khác. Nó đã được thử nghiệm trên Internet Explorer, Firefox, Safari và Chrome.

Điều này có thể được khắc phục ở cấp Style Sheet trong Máy chủ Báo cáo.

Đầu tiên, điều hướng đến thư mục nơi dịch vụ báo cáo được cài đặt, trong trường hợp của tôi ( SQL Server 2012 SP1), đó là:

C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer

Trong thư mục đó, bạn sẽ tìm thấy một tệp có tên là reporterver.config.

Xem Tùy chỉnh Biểu định kiểu cho Trình xem HTML và Trình quản lý Báo cáo .

Trong tệp đó, hãy chèn một dòng XML như (từ tài liệu trên):

<Configuration>
...
          <HTMLViewerStyleSheet>SafariChromeFix</HTMLViewerStyleSheet>
...
</Configuration>

Lưu vào đó.

Những gì họ không cho bạn biết trong liên kết trên là mục nhập này ghi đè hoàn toàn biểu định kiểu mặc định. Những nỗ lực đầu tiên của tôi để làm cho các báo cáo hiển thị hoạt động bằng cách thêm một biểu định kiểu div, mọi thứ khác đã bị hỏng. Khi tôi phát hiện ra rằng chỉnh sửa này đối với tệp reporserver.config không tăng thêm, nhưng thực sự thay thế biểu định kiểu mặc định, tôi đã sao chép vào biểu định kiểu mặc định và mọi thứ bắt đầu hoạt động.

Tiếp theo, đi xuống thư mục Styles ( C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\Styles).

Tạo một bản sao tệp có tên SP_Full.css và đặt tên cho bản sao là SafariChromeFix.css. Tại thời điểm này, SafariChromeFix.css phải giống với SP_Full.css.

Chỉnh sửa SafariChromeFix.css và thêm các dòng sau vào đầu:

div {
    overflow: visible !important;
}

Lưu nó.

Sau khi điều này được lưu, tất cả các báo cáo hiện có về phiên bản Dịch vụ báo cáo này sẽ hiển thị trên tất cả các trình duyệt bao gồm Chrome và Safari.

Xin lưu ý:

Nó không chỉ có thể xảy ra mà còn rất có thể là reporterver.config sẽ bị ghi đè lên các bản cập nhật cho các dịch vụ báo cáo, vì vậy bạn có thể phải thêm <HTMLViewerStyleSheet>SafariChrome</HTMLViewerStyleSheet>thẻ vào đó theo thời gian.

Điều này cũng cung cấp cho chúng tôi một nơi để đột nhập vào biểu định kiểu mặc định và thực hiện nhiều thay đổi tùy chỉnh khác bắt đầu từ một thứ đã hoạt động. Và vì nó không phải là biểu định kiểu mặc định nên tệp CSS tùy chỉnh mới của bạn không bị ghi đè trong quá trình nâng cấp và vá lỗi.


"Sau khi điều này được lưu, tất cả các báo cáo hiện có về phiên bản Dịch vụ báo cáo này sẽ hiển thị trên tất cả các trình duyệt bao gồm Chrome và Safari." - Đúng vậy, nhưng trông chúng vẫn sẽ rất kinh khủng.
Stefan Steiger,

4

Trong trường hợp của tôi, DIV vi phạm là "ctl31_ctl09", vì vậy nếu giải pháp trên không hiệu quả với bạn, hãy thử thay đổi var element = document.getElementById("ctl31_ctl10");thànhvar element = document.getElementById("ctl31_ctl09");


4

Giải pháp của tôi là thêm những thứ sau <script>vào:

Dịch vụ báo cáo \ ReportManager \ Pages \ Report.aspx

Tập lệnh nhắm mục tiêu trang gốc 1 của nội dung báo cáo hiển thị và đặt mỗi khi báo cáo tải 2- bao gồm phân trang thông qua báo cáo nhiều trang.style.overflow:visible

if (window.addEventListener && document.querySelector) window.addEventListener("load", function () {

    // drop out if Sys.Application.add_load is undefined
    if (!window.Sys || !Sys.Application || !Sys.Application.add_load) return;

    // register a function for when report data is loaded
    Sys.Application.add_load(function () {

        // get the report content control
        var n = document.querySelector("[id^=VisibleReportContent]");

        if (n) {

            // get the report content control's parent
            n = n.parentNode;

            if (n) {

                // revert overflow:hidden to "visible"
                n.style.overflow = "visible";

            }
        }

    });
});

1 Điều này có nghĩa là chúng ta không cần phải nhắm mục tiêu id tạo mà có xu hướng thay đổi, ví dụ: ctl31_ctl09, ctl31_ctl10, ctl32_ctl09vv
2 XemSys.Application.add_load()


1
Điều này hoạt động hoàn hảo đối với tôi trong SSRS 2008 R2. Đó là một phao cứu sinh cho một người dùng Mac của chúng ta (người không có cách nào dễ dàng để sử dụng IE.)
Lawson

2

Bản phát hành SQL Server 2014 của Dịch vụ báo cáo bổ sung hỗ trợ cho trình duyệt Google Chrome nhưng chưa có hỗ trợ cho iOS. Xem chi tiết tại đây .



2

Tôi phải truy cập vào Chrome với F12và nhận thấy rằng tôi đã có ctl32 _ctl09, không phải ctl31_ctl09 trong div của tôi.

Điều này dành cho Windows Server 2008 R2 64Bit với SQL Server 2012 . Nối tập lệnh và sau đó khởi động lại SSRS và xóa bộ nhớ cache của trình duyệt.

// Sửa lỗi để cho phép Chrome hiển thị Báo cáo SSRS

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

2

Thật không may, câu trả lời chính phá vỡ các cột nổi (vị trí tuyệt đối) trong báo cáo Internet Explorer. Do đó, tôi đã sửa đổi một chút nó, điều mà tôi không thích vì nó đặc biệt tìm kiếm WebKit, nhưng nó đang hoạt động:

//SSRS 2012 Chrome fix
function pageLoad() {
    var element = document.getElementById("ctl32_ctl09");
    var isWebKit = !!window.webkitURL;    // Chrome or safari really (WebKit browsers).
    // We don't want to do this fix in Internet Explorer, because it breaks floating columns
    if (element && isWebKit)
    {
        element.style.overflow = "visible";
    }
}


1

Để tránh phải mã hóa cứng ID phần tử, tôi đã chỉnh sửa tệp ReportingServices.js trên máy chủ RS @ [Drive]: \ Program Files \ Microsoft SQL Server \ [Reporting Services Instance] \ Reporting Services \ ReportManager \ js \ ReportingServices.js để bao gồm một số mã để tìm nạp jQuery, hãy tải nó vào trang, sau đó tìm tất cả các phần tử mà tràn được đặt thành tự động.

Chèn mã sau vào đầu tệp ReportingServices.js

var loadjQuery = function (cb) {
    if (typeof (jQuery) == 'undefined') {
        var scr = document.createElement('script');
        scr.setAttribute('type', 'text/javascript');
        scr.setAttribute('src', 'http://code.jquery.com/jquery-latest.js');

        if (scr.readyState) {
            scr.onreadystatechange = function () {
                if (scr.readyState === 'complete' || scr.readyState === 'loaded') {
                    scr.onreadystatechange = null;
                    if (typeof (cb) === 'function') {
                        args = [].slice.call(arguments, 1);
                        cb.apply(this, args);
                    }
                }
            };
        }
        else {
            scr.onload = function () {
                if (typeof (cb) === 'function') {
                    args = [].slice.call(arguments, 1);
                    cb.apply(this, args);
                }
            };
        }

        var head = document.getElementsByTagName('head')[0];
        head.insertBefore(scr, head.firstChild);
    }
}

Sau đó, dòng tiếp theo sau đó là những gì ban đầu trong tệp JS.

Sau đó, thêm mã sau

var _rmFixReady = false;
function pageLoad() {
    loadjQuery(function () {
        _rmFixReady = true;
    });
    if (_rmFixReady) {
        var overflowElements = $('div').filter(function () { return $(this).css('overflow') == 'auto'; });
        overflowElements.each(function () {
            $(this).css('overflow', 'visible');
        });
    }
}

Tôi vừa hoàn thành thử nghiệm này với Chrome 27 và IE 10 trên phiên bản RM2012 và nó hoạt động rất tốt.


1

Sự cố vẫn tồn tại trong Chrome 22.0.1229.79.

YMMV , nhưng tôi nhận thấy rằng việc xóa chiều cao khỏi thẻ ReportViewer sẽ khắc phục được sự cố này.

Tôi gặp sự cố này với báo cáo SSAS, nhưng không phải báo cáo SSRS. Tôi không thể hiểu tại sao cho đến khi tôi kiểm tra sự khác biệt trong các trang (một chuyên gia tư vấn đã thực hiện các báo cáo SSAS). Anh ấy đang đặt Chiều cao của Trình xem báo cáo = 60% và các báo cáo SSRS không chỉ định chiều cao.

Sau khi tôi loại bỏ Chiều cao, các báo cáo của tôi sẽ hiển thị.


1

Đối với SSRS 2012 trên Windows Server 2008 R2 x64, tập lệnh hoạt động là:

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

    if (window.addEventListener) // W3C standard
    {
         window.addEventListener('load', FixSafari, false); // NB **not** 'onload'
    }
    else
        if (window.attachEvent) // Microsoft
        {
            window.attachEvent('onload', FixSafari);
        }
}

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

Tất cả các phiên bản được đề xuất ở trên đều không hoạt động.


1

Một vấn đề với bản overflow:visiblesửa lỗi là tiêu đề nổi bị hỏng trên tất cả các trình duyệt. Tập lệnh sau sẽ để riêng Internet Explorer và chỉ áp dụng bản sửa lỗi cho các trình duyệt không phải Internet Explorer. Với điều này, tất cả chức năng được giữ lại cho người dùng Internet Explorer và các trình duyệt khác vẫn có thể xem báo cáo.

function pageLoad() {
    var eval = getInternetExplorerVersion();
    if (eval == -1)
    {
        var element = document.getElementById("ctl31_ctl09");
        if (element)
        {
            element.style.overflow = "visible";
        }
    }
}

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
    var rv = -1; // Return value assumes failure.
    if (navigator.appName == 'Microsoft Internet Explorer')
    {
        var ua = navigator.userAgent;
        var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat( RegExp.$1 );
    }
    return rv;
}

1

Tôi đã thử các cách tiếp cận và nó hiệu quả với tôi, nhưng quản trị viên hệ thống của chúng tôi nghi ngờ về những thay đổi này.

Thay vì đặt chiều cao thành 100% trên ReportViewer, tôi đã sử dụng chiều cao cố định và chiều cao này hoạt động trong ứng dụng của tôi cho Internet Explorer và Chrome.


1

Tôi chưa bao giờ gặp may mắn với việc hiển thị báo cáo trong Chrome. Hầu hết các tài liệu của Microsoft thậm chí không liệt kê nó, vì vậy tôi cho rằng Chrome phải gặp sự cố khi diễn giải điều gì đó trong ASP.

Xem Hỗ trợ của trình duyệt cho Dịch vụ báo cáo và Power View .

Tôi đang chạy Chrome 11 và gặp hành vi giống như bạn.


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.