SSRS 2008 R2-SSRS 2012-ReportViewer : Safari / Chrome 보고서는 있지만 Firefox / Internet Explorer 8에서는 제대로 작동합니다. 왜 그런가요?


83

에 간단한 보고서가 SSRS 2008 R2있지만 Safari 또는 Chrome에는 전혀 표시되지 않습니다. Microsoft의 온라인 설명서에 따르면 이러한 브라우저는 제한된 방식으로 지원됩니다. 그러나 데이터 "로드 중"시계가 완료된 후에는 아무것도 볼 수 없습니다. 페이지 상단의 매개 변수 표시 줄과 이동 경로 탐색 섹션이 모두 있습니다. 또한 Safari 및 Chrome에서 모든 형식으로 저장 / 내보내기를 할 수 있습니다. 단지 비어있는 보고서 섹션 자체는 표시하지 않습니다.

인증서와 보안 연결을 사용해야합니까 (현재 HTTPS로 설정되지 않고 HTTP 만 사용)? 조정해야하는 서버 측 구성이 있습니까? 사람이 표시 성공했다 ANY 이전 SSRS 버전 (2005)를 사용하여 사파리 / 크롬에 대한 보고서를?

나는 Safari 5.0.4Chrome 10.0.648.151. 이 두 브라우저의 유사점은 둘 다 WebKit 기반이라는 것을 알고 있습니다.

이 보고서는 Internet Explorer 8 (물론) 및 Firefox 4.0에서 성공적으로 렌더링됩니다.

누군가가 이것에 대해 밝힐 수 있다면 정말 감사하겠습니다.



2
그렉 H는 내 솔루션을보고 나 문제가 해결되는지에 알려
에마 그레코에게

답변:


94

궁극적 인 솔루션 (SSRS 2012에서도 작동합니다!)

다음 스크립트를 " C : \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js "(SSRS 서버에서)에 추가합니다.

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

사실 div의 이름이 항상인지 모르겠습니다. ctl31_ctl10 . 제 경우에는 (대신 SQL Server 2012 azzlak found 이상 ctl32_ctl09)입니다.

이 솔루션이 작동하지 않으면 브라우저에서 HTML을보고 스크립트가 overflow : auto 속성을 overflow : visible로 변경하여 제대로 작동하는지 확인합니다 .


ReportViewer 제어를위한 솔루션

이 스타일 라인을 .aspx페이지 (또는 .css가능한 경우 링크 된 파일)에 삽입합니다.

#reportViewer_ctl09 {
  overflow:visible !important;
}

이유

Chrome 및 Safari 렌더링 오버플로 : Internet Explorer와 다른 방식으로 자동 .

SSRS HTML은 QuirksMode HTML이며 IE 5.5 버그에 의존합니다. 비 IE 브라우저에는 IE 쿼크 모드가 없으므로 HTML을 올바르게 렌더링합니다.

SSRS 2008 R2 보고서에서 생성 된 HTML 페이지 에는 overflow : auto 스타일 이 있는 div 가 포함되어 있으며 보고서를 보이지 않는 보고서로 변환합니다.

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

수동으로 변경 (Chrome의 디버그 창 사용) final HTML overflow : auto in overflow : visible Chrome에서 보고서를 수 있습니다.

나는 Tim의 솔루션을 좋아 합니다 . 쉽고 작동합니다.

그러나 여전히 문제가 있습니다. 사용자가 매개 변수를 변경할 때마다 (내 보고서는 매개 변수를 사용합니다!) AJAX가 div를 새로 고치면 overflow : auto 태그가 다시 작성되고 스크립트가 변경되지 않습니다. 이 기술 노트 세부 사항 은 문제점에 대해 설명합니다.

이는 AJAX 패널로 빌드 된 페이지에서 전체 페이지를 새로 고치지 않고 AJAX 패널 만 상태를 변경하기 때문에 발생합니다. 따라서 태그에 적용한 OnLoad 이벤트는 페이지가 처음로드 될 때 한 번만 실행됩니다. 그 후에 AJAX 패널을 변경해도 더 이상 이러한 이벤트가 트리거되지 않습니다.

einarq 씨는 여기 에서 해결책을 제안 했습니다 .

또 다른 옵션은 함수의 이름을 pageLoad로 바꾸는 것입니다.

이 이름을 가진 모든 함수는 페이지에있는 경우 ASP.NET Ajax에 의해 자동으로 호출되며 각 부분 업데이트 이후에도 호출됩니다. 이렇게하면 body 태그에서 onload 속성을 제거 할 수도 있습니다.

그래서 솔루션에 표시된 개선 된 스크립트를 작성했습니다.


이게 저에게도 효과가 있음을 확인할 수 있습니다 (SQL 2008 R2).
Vincent Vancalbergh

3
또한 SSRS 2012에서 작업합니다. 제 경우에는 div에 "ctl31_ctl09"ID가 있습니다. 감사합니다!
크리스

Emanuele에서 제공 한 솔루션이 저를 위해 일했지만 aspx 페이지에서 ReportViewer 컨트롤을 사용하여 보고서를 보는 데 문제가있었습니다. 그래서 aspx 페이지에 코드를 추가했습니다. 나는 그것을 언급 한 여기
사미르 K에게

SSRS보고 서버에 표시된 JS 파일의 맨 아래에 잘라내어 붙여 넣었지만 "pageLoad"이벤트를 실행할 수 없습니다. 왜 그렇게되지 않을지에 대한 제안이 있습니까?
Ben Finkel 2012 년

@BenFinkel "pageLoad ()는 UpdatePanel을 새로 고칠 때마다 호출됩니다."( encosia.com/document-ready-and-pageload-are-not-the-same ) 문제가 다를 수 있습니다. 브라우저의 디버그 창을 사용하여 확인하십시오. 귀하가 수정 한 텍스트는 링크되어 있으며 Javascript 오류가 있습니다.
Emanuele Greco

43

CSS 기반 솔루션

Reporting Services의 스타일 시트에 다음을 추가 할 수 있었고 Chrome에서 수정되었습니다.

면책 조항 : 이것은 브라우저 간 호환성에 대해 철저히 테스트되지 않았습니다.

/ ************** 크롬 버그 수정 ***************** /
div # ctl31_ctl09,
div # ctl31_ctl10
{
    오버플로 : 보이는! 중요한;
}
/ ********************************************* /

ReportingServices.css파일 시작 부분에 추가 하십시오.

저에게 해당 파일은 다음 위치에 있습니다.

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


3
+1은 테스트 된 모든 브라우저 (Chrome, Safari, IE9, IE10)에서 매력처럼 작동합니다. MAC OS X Chrome에서 동일 ...
YvesR

모든 사용자의 CSS를 수정하기 위해 서버에 액세스 할 수없는 경우이 답변에서 Stylebot 과 같은 브라우저 확장과 함께 CSS를 사용할 수 있습니다 .
Mike Bockus 2014 년

+1 멋진 솔루션! 이것은 Javascript로 수정하는 것보다 저렴하며 (성능면에서) AJAX 패널이 업데이트 될 때마다 업데이트 할 필요가 없습니다.
KyleMit 2014 년

1
와! 이것이 내 문제였습니다. 방금 SSRS R2 보고서 배포를 연구하기 시작했으며 IE에는 표시되지만 크롬에는 표시되지 않습니다. 그 이유에 대한 설명이 있습니까? 어쨌든, 감사합니다 Ryan!
프랜시스 사울

1
내 값은 SSRS 2012에서 ctl32_ctl109로 분류되었습니다. 그것을 찾아보고 내 가치와 함께 CSS를 사용한 후에는 완벽하게 작동했습니다.
Matt H

18

이것은 알려진 문제 입니다. 문제는 div 태그에 "overflow : auto"스타일이 있다는 것입니다. 이는 분명히 Safari 및 Chrome에서 사용되는 WebKit에서 잘 구현되지 않는 것 같습니다 (Emanuele Greco의 답변 참조 ). RS : ReportViewerHost 요소를 사용하라는 Emanuele의 제안을 활용하는 방법을 몰랐지만 JavaScript를 사용하여 해결했습니다.

문제

여기에 이미지 설명 입력

해결책

"overflow : auto"는 id가 "ctl31_ctl10"인 div 요소의 스타일 속성에 지정되어 있으므로 스타일 시트 파일에서 재정의 할 수 없으므로 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 /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);
}

노트

시도하지 않은 SSRS 2005 솔루션 이있는 같지만 "DocMapAndReportFrame"클래스를 찾을 수 없기 때문에 SSRS 2008에 적용 할 수 없다고 생각합니다.


7

CSS 기반 시스템 전체 솔루션

여기에는 JavaScript 나 Ajax 프레임 또는 기타 래퍼가 필요하지 않습니다. Internet Explorer, Firefox, Safari 및 Chrome에서 테스트되었습니다.

이는 보고서 서버의 스타일 시트 수준에서 수정할 수 있습니다.

먼저보고 서비스가 설치된 디렉터리로 이동합니다. 제 경우에는 ( SQL Server 2012 SP1) 다음과 같습니다.

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

이 디렉토리에서 reportserver.config라는 파일을 찾을 수 있습니다.

HTML 뷰어 및 보고서 관리자 용 스타일 시트 사용자 정의를 참조하십시오 .

해당 파일에 (위 문서에서) 다음과 같은 단일 XML 행을 삽입하십시오.

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

저장하십시오.

그들이 하지 않는 것 위의 링크에서 당신에게하면이 항목이 완전히 기본 스타일 시트를 무시한다는 것입니다. div 스타일 시트를 추가하여 보고서를 렌더링하도록 처음 시도했지만 다른 모든 것은 손상되었습니다. reporserver.config 파일에 대한이 편집이 확장되지는 않았지만 실제로 기본 스타일 시트를 대체한다는 것을 알았을 때 기본 스타일 시트를 복사하고 모든 것이 작동하기 시작했습니다.

다음으로 Styles 디렉토리 ( C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\Styles) 로 내려갑니다 .

SP_Full.css라는 파일의 복사본을 만들고 복사본의 이름을 SafariChromeFix.css로 지정합니다. 이 시점에서 SafariChromeFix.css는 SP_Full.css와 동일해야합니다.

SafariChromeFix.css를 편집하고 맨 위에 다음 줄을 추가합니다.

div {
    overflow: visible !important;
}

저장해.

이 보고서가 저장되면이 Reporting Services 인스턴스에 대한 모든 기존 보고서가 Chrome 및 Safari를 포함한 모든 브라우저에서 렌더링됩니다.

참고 :

가능할뿐만 아니라 reportserver.config를보고 서비스에 대한 업데이트로 덮어 쓸 가능성이 매우 높으므로 <HTMLViewerStyleSheet>SafariChrome</HTMLViewerStyleSheet>시간이 지남에 따라 태그 를 추가해야 할 수 있습니다 .

이것은 또한 우리에게 기본 스타일 시트를 쪼개고 이미 작동하고있는 것에서 시작하여 많은 다른 사용자 정의 변경을 할 수있는 장소를 제공합니다. 기본 스타일 시트가 아니기 때문에 업그레이드 및 패치 중에 새 사용자 지정 CSS 파일을 덮어 쓰지 않습니다.


"이 정보가 저장되면이 Reporting Services 인스턴스에 대한 모든 기존 보고서가 Chrome 및 Safari를 포함한 모든 브라우저에서 렌더링됩니다." -예,하지만 여전히 끔찍해 보일 것입니다.
Stefan Steiger

4

내 경우에는 잘못된 DIV는 "ctl31_ctl09" 당신이 변경 시도에 대해 위의 솔루션은 작업을하지 않도록 경우 var element = document.getElementById("ctl31_ctl10");var element = document.getElementById("ctl31_ctl09");


4

내 해결책은 다음 <script>을 추가하는 것입니다.

Reporting Services \ ReportManager \ Pages \ Report.aspx

스크립트는 표시되는 보고서 콘텐츠의 상위 1을 대상 으로하고 보고서 가 여러 페이지 보고서를 통한 페이징을 포함 하여 2를 로드 할 때마다 설정합니다 .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 :이 방법 우리는 변화하는 경향, 즉,이 생성 된 식별자 대상이없는 ctl31_ctl09, ctl31_ctl10, ctl32_ctl09, 등
2 참조Sys.Application.add_load()


1
이것은 SSRS 2008 R2에서 완벽하게 작동했습니다. 그것은 우리의 맥 사용자를위한 생명의 은인이었다 (IE를 사용하는 쉬운 방법이 없습니다.)
로손



2

Chrome에 들어가야F12 했고 ctl32 가 있음을 알았습니다 . 내 div에 ctl31_ctl09가 아니라 ctl32 _ctl09 .

이것은 SQL Server 2012 가 포함 된 Windows Server 2008 R2 64Bit 용입니다 . 스크립트를 추가 한 다음 SSRS를 다시 시작하고 브라우저 캐시를 지 웁니다.

// Chrome에서 SSRS 보고서를 표시하도록 수정

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

2

안타깝게도 주요 답변은 Internet Explorer 보고서에서 부동 (절대 위치) 열을 분리합니다. 따라서 특별히 WebKit을 찾고 있기 때문에 좋아하지 않는 약간 수정했지만 작동 중입니다.

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

요소 ID를 하드 코딩해야하는 문제를 해결하기 위해 RS 서버 @ [Drive] : \ Program Files \ Microsoft SQL Server \ [Reporting Services Instance] \ Reporting Services \ ReportManager \ js \ ReportingServices.js 에서 ReportingServices.js 파일을 편집했습니다 . jQuery를 가져 오는 일부 코드를 포함하고 페이지에로드 한 다음 overflow가 auto로 설정된 모든 요소를 ​​찾습니다.

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

그 다음 줄은 원래 JS 파일에 있던 내용입니다.

그 후 다음 코드를 추가하십시오

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');
        });
    }
}

RM2012 인스턴스에서 Chrome 27 및 IE 10으로 테스트를 마쳤으며 훌륭하게 작동했습니다.


1

Chrome 22.0.1229.79에는 여전히 문제가 있습니다.

YMMV 이지만 ReportViewer 태그에서 높이를 제거하면이 문제가 해결되는 것으로 나타났습니다.

SSAS 보고서에서는이 문제가 발생했지만 SSRS 보고서에서는 발생하지 않았습니다. 페이지의 차이점을 확인하기 전까지는 이유를 알 수 없었습니다 (컨설턴트가 SSAS 보고서를 작성 했음). 그는 ReportViewer 높이를 60 %로 설정하고 SSRS 보고서에서 높이를 지정하지 않았습니다.

Height를 제거하면 보고서가 표시됩니다.


1

Windows Server 2008 R2 x64의 SSRS 2012의 경우 작동하는 스크립트는 다음과 같습니다.

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

위에 제안 된 모든 버전이 전혀 작동하지 않았습니다.


1

overflow:visible수정 사항의 한 가지 문제 는 플로팅 헤더가 모든 브라우저에서 손상된다는 것입니다. 다음 스크립트는 Internet Explorer를 그대로두고 Internet Explorer가 아닌 브라우저에만 수정 사항을 적용합니다. 이를 통해 Internet Explorer 사용자를위한 모든 기능이 유지되며 다른 브라우저에서 계속 보고서를 볼 수 있습니다.

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

접근 방식을 시도해 보았고 효과가 있었지만 시스템 관리자는 이러한 변화에 회의적이었습니다.

에서 높이를 100 %로 설정하는 대신 ReportViewer고정 높이를 사용했으며 Internet Explorer 및 Chrome 용 응용 프로그램에서 작동 할 수있었습니다.


1

Chrome에서 보고서를 표시하는 데 전혀 행운이 없었습니다. 대부분의 Microsoft 문서에는 목록이 나와 있지 않으므로 Chrome이 ASP에서 무언가를 해석하는 데 문제가 있다고 가정합니다.

Reporting Services 및 Power View에 대한 브라우저 지원을 참조하십시오 .

저는 Chrome 11을 실행하고 있으며 귀하와 동일한 동작을 경험합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.