SSRS 2008 R2-SSRS 2012-ReportViewer : Safari 및 Chrome에서 보고서가 비어 있습니다.


84

보고 서비스를 버전 2008에서 다른 서버 버전 2008 R2로 마이그레이션했습니다. 2008 버전에서는 보고서가 Safari에서 제대로 작동합니다. 새 버전 2008 R2에서는 보고서가 전혀 표시되지 않습니다. 내가 보는 것은 매개 변수 섹션이고 보고서는 비어 있습니다. Chrome에서도 동일합니다. Microsoft Safari에 따르면 제한된 방식으로 지원됩니다. 보고서는 복잡하지 않습니다. 사실 Safari에 표시되는지 확인하기 위해 한 줄만있는 보고서를 만들었지 만 아니요, 해당 보고서도 완전히 비어 있습니다. 누구든지 Safari에서 SSRS 보고서를 볼 수 있도록 만들었습니까? 어떤 종류의 구성 설정을 엉망으로 만들어야합니까?


답변:


109

궁극적 인 솔루션 (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의 경우 시도 ctl32_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 쿼크 모드가 없으므로 HTML을 올바르게 렌더링합니다.

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

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

Chrome의 Dev Tools ( )를 사용하여 제작 된 웹 페이지에서 수동으로 변경 overflow:auto하여 Chrome에 대한 보고서를 볼 수 있습니다 .overflow:visibleF12


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

그러나 여전히 문제가 있습니다. 사용자가 매개 변수를 변경할 때마다 (내 보고서에서 매개 변수를 사용합니다!) AJAX가 div를 새로 고치고 overflow : auto 태그가 다시 작성되고 스크립트가 변경되지 않습니다.

이 기술 노트 세부 사항 은 문제점에 대해 설명합니다.

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

사용자 einarq 가이 솔루션을 제안 했습니다 .

또 다른 옵션은 함수의 이름을 pageLoad로 바꾸는 것입니다. 이 이름을 가진 모든 함수는 페이지에있는 경우 asp.net ajax에 의해 자동으로 호출되며 각 부분 업데이트 이후에도 호출됩니다. 이렇게하면 body 태그에서 onload 속성을 제거 할 수도 있습니다.

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


1
스크립트를 트리거하기 위해 page_load 함수를 pageLoad로 변경했습니다. 그렇지 않으면 Chrome 13에서 렌더링 문제를 해결하는 것 같습니다. 안타깝게도 SSRS의 기본 인증이 Safari 5.1에서 작동하지 않는 것 같아서 확인할 수 없습니다.
kermatt 2011 년

그 이유는 잘못되었습니다. 진짜 이유는 SSRS HTML이 QuirksMode HTML이고 IE 5.5 버그에 의존하기 때문입니다. 비 IE 브라우저에는 IE 쿼크 모드가 없으므로 HTML을 올바르게 렌더링합니다. QuirksMode에서 IE 5.5 버그를 에뮬레이트하지 않는 브라우저의 경우 테이블 너비를 설정하지 않습니다. 새로운 기본 쿼크 모드 모드가 있으므로 IE 10에도 적용됩니다.
Stefan Steiger 2013

8
완벽하게 작동합니다. 그러나 SQL Server 2012의 경우 문제가되는 div ID는 ctl32_ctl09.
azzlack 2013 년

3
id ctl32_ctl09 또는 생성 된 항목을 검색하는 대신 다음을 시도하십시오. document.querySelector ( "[id ^ = VisibleReportContent]"). parentNode;
Para

1
@JustinMangum-IE의 호환성보기에서 querySelector 사용이 실패합니다. 이는 인트라넷 SSRS 사이트에 대해 거의 확실하게 활성화됩니다. 증상은로드 중 대화 상자가 닫히지 않으므로 사용자가 보고서를 볼 수 없다는 것입니다.
Mike

27

SizeToReportContent="true"아래와 같이 포함하십시오.

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

4
a) 잘 작동하고 b) 기본 제공 솔루션 인 것 같아서 왜 이것이 허용되는 솔루션이 아닌지 모르겠습니다. reportviewer가 제대로 작동하도록 만드는 해킹이 아닙니다. ReportViewer를 해킹하여 작동시키는 데 문제가있는 것은 아닙니다. 전체 reportviewer가 큰 해킹에 처한 것 같습니다.
Raif

3
이 솔루션은 응용 프로그램에 ReportViewer 컨트롤을 포함하는 데만 적용되지 않습니까? 이것이 보고서 관리자에 적용되고 보고서가 ReportServer URL에서 실행되는 경우이 편집을 포함해야하는 위치를 지정하십시오.
등록 된 사용자

2
\ SQL \ MSRS11.MSSQLSERVER \ Reporting Services \ ReportServer \ Pages \ ReportViewer.aspx에서 다음 줄을 참조하고 있습니까? <RS : ReportViewerHost ID = "ReportViewerControl"runat = "server"/>
등록 된 사용자

1
그것은 잘 작동하지만,이 경우 많은 보고서에 이미지 (지표 / 스파크)의 그것은 atrociously 렌더링 시간을 날려 버릴 것입니다.
Trubs 2015 년

1
SSRS 2012에서 ReportViewer.aspx를 수정할 때는 작동하지 않습니다.
Keith

23

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

1
이 솔루션은 우리 환경에서 매우 잘 작동합니다. 감사합니다 Mike
Vince Perta 2012-08-22

14

이것은 알려진 문제 입니다. 문제는 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 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에 적용 할 수 없다고 생각합니다.


2
내가 이해하지 못하는 것이 하나 있습니다. \ ReportingServices.js에 코드 함수 FixSari를 적용한 다음 SSRS에 보고서를 표시하는 코드를 실행하는 경우 FixSafari의 소스 메서드 코드를 실행하는 함수를 어디에 적용합니까? 올바르게 이해하면 ReportingServices.js의 원본 코드가 생성되고 결국 FixSafari 코드를 실행합니까?
What'sUP 2013

12

위의 아이디어를 기반으로 한 내 솔루션.

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와 같은 다른 라이브러리를 포함 할 필요가 없습니다.


그러나 ctl31_ctl10 및 그 변형과 같이 다른 모든 사람이 대상으로하는 요소에는 반드시 _fixedTable이있는 것은 아닙니다. 내가 뭔가를 놓치고 있습니까?
Baodad

@Baodad-위의 솔루션은 올바른 div를 찾기 위해 Child Selector를 사용합니다. 더 정적 인 id 속성을 가진 체인의 상위 항목을 기반으로 시작한 다음 자식을 트리 아래로 원하는 div로 이동합니다. 변수에 대해보다 설명적이고 덜 오버로드 된 이름을 사용하는 것이 좋지만 다른 방법으로는 훌륭한 솔루션입니다. 제안 된 이름 : reportPayloadElement.
Brian Swift

11

다음은 Report Server 2008 R2에 사용한 솔루션입니다.

보고서 서버가 테이블의 "id"속성에 사용하기 위해 출력 할 내용에 관계없이 작동해야합니다. 항상 "ctl31_fixedTable"이 될 것이라고 생각할 수는 없습니다.

위의 제안과 여기에있는 javascript 파일의 페이지에 jquery 라이브러리를 동적으로로드하는 몇 가지 방법을 혼합하여 사용했습니다.

서버에서 다음 디렉터리로 이동합니다. 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();

하지만 한 가지 질문은 페이지에 보고서 테이블이 두 개 이상있는 경우 컨트롤이 여러 번로드되지 않습니까? 그렇다면 첫 번째 줄을 다음과 같이 변경할 수 있습니다. var jQueryScriptOutputted = ((typeof (jQueryScriptOutputted) == 'undefined')? false : true);
rmcsharry

4

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가 있다고 가정하는 것보다 낫습니다. 원하는대로 타이머를 조정할 수 있습니다. 여기서는 1000ms로 설정했습니다.


3

참고로 위의 어느 것도 2012 SP1에서 저에게 효과가 없었습니다 ... 간단한 해결책은 공유 데이터 원본에 자격 증명을 내장 한 다음 Safari에 SSRS 서버 사이트를 신뢰하도록하는 것입니다. 그런 다음 훌륭하게 작동했습니다! 통합 보안이 Safari에서 안정적으로 작동하지 않는다는 것을 알아 내기 위해 위와 같은 솔루션을 찾는 데 며칠이 걸렸습니다. Mac에서 키 체인을 엉망으로 만들어야하지만 여전히 안정적으로 작동하지 않습니다.


2

Emanuele에서 제공 한 솔루션이 저에게 효과적이었습니다. 서버에서 직접 보고서에 액세스하면 보고서를 볼 수 있지만 aspx 페이지에서 ReportViewer 컨트롤을 사용하면 보고서를 볼 수 없습니다. 렌더링 된 HTML을 검사 할 때 오버플로 속성이 auto로 설정된 ID "ReportViewerGeneral_ctl09"( ReportViewerGeneral 은 보고서 뷰어 컨트롤의 서버 ID)로 div를 찾았습니다 .

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

Emanuele가 설명하는 절차를 사용하여 다음과 같이 표시되도록 변경했습니다.

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

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

2

나는 이것을 사용했다. 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');
                    });
                });
            }
        });
    }
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.