SSRS 2008 R2 - SSRS 2012 - ReportViewer: Raporlar Safari ve Chrome'da boştur


84

Raporlama hizmetlerimizi 2008 sürümünden başka bir sunucu sürümü 2008 R2'ye taşıdım. 2008 sürümünde, raporlar Safari'de sorunsuz çalışıyor. Yeni 2008 R2 sürümünde raporlar hiç görünmüyor. Tek gördüğüm parametre bölümü ve ardından rapor boş. Chrome'da aynı. Microsoft Safari'ye göre sınırlı bir şekilde desteklenir. Raporlar karmaşık değil. Aslında, Safari'de görünüp görünmeyeceğini görmek için üzerinde yalnızca bir satır bulunan bir rapor oluşturdum, ancak hayır, bu rapor da tamamen boş. SSRS raporlarını Safari'de görüntülenebilir yapan var mı? Bir tür yapılandırma ayarıyla uğraşmak zorunda mıyım?


Yanıtlar:


109

Nihai çözüm (SSRS 2012'de de çalışır!)

Aşağıdaki komut dosyasını aşağıdaki dosyaya ekleyin (SSRS Sunucusunda)
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"; 
    }
}

Not : azzlak'ın belirttiği gibi, div'in adı her zaman değildir ctl31_ctl10. SQL 2012 için deneyin ctl32_ctl09ve 2008 R2 için deneyin ctl31_ctl09. Bu çözüm işe yaramazsa, betiğin overflow:autoözelliği olarak değiştirerek düzgün çalışıp çalışmadığını görmek için tarayıcınızdan HTML'ye bakın overflow:visible.


ReportViewer denetimi için çözüm

Bu stil çizgisini .aspxsayfaya (veya .cssvarsa bağlantılı bir dosyaya) ekle

#reportViewer_ctl09 {
  overflow:visible !important;
 }

Nedeni

Chrome ve Safari overflow:auto, IE'ye göre farklı bir şekilde işler.

SSRS HTML, QuirksMode HTML'dir ve IE 5.5 hatalarına bağlıdır. IE olmayan tarayıcılarda IE tuhaf mod yoktur ve bu nedenle HTML'yi doğru şekilde oluşturur

SSRS 2008 R2 raporlarının ürettiği HTML sayfası div, overflow:autostili olan bir içerir ve raporu görünmez bir rapora dönüştürür.

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

Ben elle değiştirerek Chrome'da raporları görebilir overflow:autoetmekoverflow:visible Chrome'un Dev Araçlar kullanılarak üretilen web sayfasında ( F12).


seviyorum Tim'in çözümünü , kolay ve çalışıyor.

Ancak yine de bir sorun var: Kullanıcı parametreleri her değiştirdiğinde (raporlarım parametreleri kullanır!) AJAX div'i yeniler, taşma: otomatik etiket yeniden yazılır ve onu hiçbir komut dosyası değiştirmez.

Bu teknik detay sorunun ne olduğunu açıklıyor:

Bunun nedeni, AJAX panelleri ile oluşturulmuş bir sayfada, tüm sayfayı yenilemeden yalnızca AJAX panellerinin durumlarını değiştirmesidir. Sonuç olarak, OnLoaduyguladığınız etkinlikler<body> etikete yalnızca bir kez tetiklenir: sayfanız ilk yüklendiğinde. Bundan sonra, AJAX panellerinden herhangi birini değiştirmek artık bu olayları tetiklemeyecektir.

Einarq kullanıcısı bu çözümü önerdi :

Diğer bir seçenek de işlevinizi pageLoad olarak yeniden adlandırmaktır. Bu ada sahip tüm işlevler, sayfada varsa, her kısmi güncellemeden sonra da asp.net ajax tarafından otomatik olarak çağrılacaktır. Bunu yaparsanız, onload niteliğini body etiketinden de kaldırabilirsiniz.

Böylece çözümde gösterilen geliştirilmiş komut dosyasını yazdı.


1
Komut dosyasını tetiklemek için page_load işlevini pageLoad olarak değiştirdim. Aksi takdirde, Chrome 13'teki işleme sorunlarını çözecek gibi görünüyor. Ne yazık ki SSRS'deki temel kimlik doğrulama, Safari 5.1 ile çalışmıyor, bu yüzden orada doğrulayamıyorum.
kermatt

Nedeni YANLIŞ. Bunun gerçek nedeni, SSRS HTML'nin QuirksMode HTML olmasıdır ve IE 5.5 hatalarına bağlıdır. IE olmayan tarayıcılarda IE tuhaf mod yoktur ve bu nedenle HTML'yi doğru şekilde oluşturur. QuirksMode'larında IE 5.5 hatalarını taklit etmeyen tarayıcılar için tablo genişliğini ayarlamaktan yoksundur ... Bu arada, yeni bir varsayılan-tuhaf mod moduna sahip olduğu için IE 10 için de geçerlidir.
Stefan Steiger

8
Mükemmel çalışıyor. Ancak SQL Server 2012 için sorun teşkil eden div kimliği ctl32_ctl09.
azzlack

3
ctl32_ctl09 kimliğini veya üretilen her şeyi aramak yerine şunu deneyin: document.querySelector ("[id ^ = VisibleReportContent]"). parentNode;
para

1
@JustinMangum - querySelector'ın kullanımı, intranet SSRS siteleri için neredeyse kesin olarak etkinleştirilen Uyumluluk Görünümünde IE'de başarısız olacaktır. Belirti, Yükleniyor iletişim kutusunun hiçbir zaman kapanmaması, dolayısıyla kullanıcıların herhangi bir raporu görüntüleyememesidir.
Mike

27

Sadece SizeToReportContent="true"aşağıda gösterildiği gibi ekleyin

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

4
Bunun neden kabul edilen çözüm olmadığını bilmiyorum, çünkü a) iyi çalışıyor ve b) yerleşik çözüm gibi görünüyor. Reportviewer'ın düzgün çalışmasını sağlamak için bir hack değil. ReportViewer'ı hacklemenin çalışmasını sağlamak için yanlış bir şey olduğundan değil. Görünüşe göre tüm muhabir büyük bir hack kullanıyor.
Raif

3
Bu çözüm yalnızca ReportViewer kontrolünü bir uygulamaya yerleştirmek için geçerli değil mi? Bu, Rapor Yöneticisi için geçerliyse ve raporlar Rapor Sunucusu URL'sinden çalıştırılıyorsa, lütfen bu düzenlemeyi nereye eklemeniz gerektiğini belirtin.
Kayıtlı Kullanıcı

2
\ SQL \ MSRS11.MSSQLSERVER \ Reporting Services \ ReportServer \ Pages \ ReportViewer.aspx: <RS: ReportViewerHost ID = "ReportViewerControl" runat = "server" />
Kayıtlı Kullanıcı

1
Bu olabilir cezası çalışır ancak bir varsa çok rapor üzerinde resim (göstergeler / Mini grafikler) arasında o acımasızca render zaman aşımına esecek.
Trubs

1
Bu, SSRS 2012'de ReportViewer.aspx'i değiştirirken çalışmaz.
Keith,

23

Chrome sürüm 21'i SQL 2008 R2 SP1 ile kullanıyorum ve yukarıdaki düzeltmelerden hiçbiri benim için işe yaramadı. Aşağıda, diğer yanıtlarda olduğu gibi, işe yarayan kod bulunmaktadır. Bu kod parçasını "C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js" (on SSRS Sunucusu):

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

1
Bu çözüm çevremizde çok iyi çalışıyor. Teşekkürler Mike
Vince Perta

14

Bu bilinen bir sorundur . Sorun şu ki, bir div etiketi Safari ve Chrome tarafından kullanılan WebKit ile iyi uygulanmayan "overflow: auto" stiline sahip olmasıdır (Emanuele Greco'nun cevabına bakın). Emanuele'in RS: ReportViewerHost öğesini kullanma önerisinden nasıl yararlanacağımı bilmiyordum, ancak JavaScript kullanarak çözdüm.

Sorun

görüntü açıklamasını buraya girin

Çözüm

"Ctl31_ctl10" kimliğine sahip div öğesinin style özniteliğinde "overflow: auto" belirtildiğinden, onu bir stil sayfası dosyasında geçersiz kılamadığımız için JavaScript'e başvurdum. Aşağıdaki kodu "C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js" dizinine ekledim

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

Not

SSRS 2005 için denemediğim bir çözüm var gibi görünüyor ama SSRS 2008 için geçerli olduğunu düşünmüyorum çünkü "DocMapAndReportFrame" sınıfını bulamıyorum.


2
Anlamadığım bir şey var. \ ReportingServices.js içinde FixSari kod işlevini uygularsanız ve daha sonra raporu SSRS'de görüntülemek için kodu yürütürseniz, FixSafari için kaynak yöntem kodunu yürütmek için işlevi nereye uygularsınız? Doğru anlarsam, ReportingServices.js için orijinal kod oluşturulur ve sonunda FixSafari kodunu çalıştırır mısınız?
What'sUP

12

Çözümüm yukarıdaki fikirlere dayanıyor.

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

Belirli bir kimlik ile sınırlı değildir, ayrıca jQuery gibi başka bir kitaplık eklemenize gerek yoktur.


Ancak, ctl31_ctl10 ve türevleri gibi herkesin hedeflediği öğeler, içlerinde mutlaka _fixedTable bulunmaz. Bir şey mi kaçırıyorum?
Baodad

@Baodad - Yukarıdaki çözüm, doğru div'i bulmak için Çocuk Seçiciyi kullanır. Daha statik bir kimlik özniteliğine sahip zincirin üst kısmındaki bir öğeyi temel alarak başlar, ardından çocukları ağaçtan aşağı doğru, istenen div'e götürür. Değişken için daha açıklayıcı, daha az aşırı yüklenmiş bir ad kullanılmasını tercih ederim, ancak bu başka türlü mükemmel bir çözüm. Önerilen ad: reportPayloadElement.
Brian Swift

11

İşte Rapor Sunucusu 2008 R2 için kullandığım çözüm

Rapor Sunucusunun tablonun "id" özniteliğinde kullanım için çıktı vereceğine bakılmaksızın çalışmalıdır. Her zaman "ctl31_fixedTable" olacağını varsayabileceğinizi sanmıyorum

Yukarıdaki önerinin bir karışımını ve jquery kitaplıklarını burada bulunan javascript dosyasından bir sayfaya dinamik olarak yüklemek için bazı yollar kullandım

Sunucuda şu dizine gidin: C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js

Jquery kitaplığı jquery-1.6.2.min.js'yi dizine kopyalayın

ReportingServices.js dosyasının yedek kopyasını oluşturun Dosyayı düzenleyin. Ve bunu altına ekleyin:

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

Yine de bir soru, sayfada birden fazla rapor tablosu varsa, bu, kontrollerin birden fazla yüklenmesine neden olmaz mı? Öyleyse, ilk satır şu şekilde değiştirilebilir: var jQueryScriptOutputted = ((typeof (jQueryScriptOutputted) == 'undefined')? False: true);
rmcsharry

4

Bunu jQuery ile kolayca düzeltebilirsiniz - ve biraz çirkin bir hack :-)

ReportViewer kullanıcı kontrolüne sahip bir asp.net sayfam var.

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

Belgeye hazır olma olayında daha sonra bir zamanlayıcı başlatırım ve taşma düzeltmesine ihtiyaç duyan öğeyi ararım (önceki gönderiler gibi):

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

Belirli bir kimliği olduğunu varsaymaktan daha iyidir. Zamanlayıcıyı istediğiniz gibi ayarlayabilirsiniz. Burada 1000 ms olarak ayarladım.


3

Bilginize - 2012 SP1'de yukarıdakilerden hiçbiri benim için işe yaramadı ... basit çözüm, kimlik bilgilerini paylaşılan veri kaynağına yerleştirmek ve ardından Safari'ye SSRS sunucu sitesine güvenmesini söylemekti. Sonra harika çalıştı! Yalnızca entegre güvenliğin Safari'de güvenilir bir şekilde çalışmayacağını öğrenmek için yukarıdaki gibi varsayılan çözümleri kovalamak günler sürdü - Mac'teki anahtar zinciriyle uğraşmanız gerekir ve sonra yine de güvenilir bir şekilde çalışmazsınız.


2

Emanuele'nin sağladığı çözüm benim için çalıştı. Raporu doğrudan sunucudan eriştiğimde görebiliyordum, ancak aspx sayfamda ReportViewer denetimi kullandığımda raporu göremedim. Oluşturulan HTML'yi inceledikten sonra, "ReportViewerGeneral_ctl09" ( ReportViewerGeneral , rapor görüntüleyici kontrolünün sunucu kimliğidir) kimliğine göre taşma özelliği otomatik olarak ayarlanmış bir div buldum .

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

Emanuele tarafından açıklanan prosedürü, bunu aşağıdaki gibi görünür hale getirmek için kullandım:

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

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

2

Bunu kullandım. Report.aspx sayfasında jquery'ye bir komut dosyası referansı ekleyin. JQuery'yi microsoft olaylarına bağlamak için aşağıdakileri kullanın. Taşmayı ayarlamak için Eric'in önerisinden biraz yararlandı.

$(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');
                    });
                });
            }
        });
    }
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.