SSRS 2008 R2 - SSRS 2012 - ReportViewer: सफारी और क्रोम में रिपोर्ट रिक्त हैं


84

मैंने अपनी रिपोर्टिंग सेवाओं को 2008 के संस्करण से दूसरे सर्वर संस्करण 2008 R2 में स्थानांतरित कर दिया। संस्करण 2008 में रिपोर्ट सफारी पर ठीक काम करती है। नया संस्करण 2008 R2 रिपोर्ट बिल्कुल नहीं दिखाता है। मैं देख रहा हूं कि पैरामीटर खंड है और फिर रिपोर्ट रिक्त है। क्रोम में भी। माइक्रोसॉफ्ट सफारी के अनुसार यदि सीमित फैशन में है तो आईएस समर्थित है। रिपोर्ट जटिल नहीं हैं। वास्तव में मैंने एक रिपोर्ट बनाई थी जिसमें केवल इस पर एक पंक्ति थी कि यह देखने के लिए कि क्या यह सफारी में दिखाई देगा लेकिन नहीं, यह रिपोर्ट पूरी तरह से रिक्त है। क्या किसी ने 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;
 }

कारण

overflow:autoIE के संबंध में क्रोम और सफारी अलग-अलग तरीके से प्रस्तुत करते हैं ।

SSRS HTML, QuirksMode HTML है और IE 5.5 बग पर निर्भर करता है। गैर-IE ब्राउज़र में IE quirksmode नहीं है और इसलिए HTML को सही ढंग से प्रस्तुत करना है

HTML पृष्ठ SSRS 2008 R2 रिपोर्ट द्वारा उत्पादित एक होते हैं divजो overflow:autoशैली, और यह एक अदृश्य रिपोर्ट में रिपोर्ट बदल जाता है।

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

मैं क्रोम पर रिपोर्ट देख सकते हैं मैन्युअल रूप से बदलने के द्वारा overflow:autoकरने के लिए overflow:visibleChrome की देव उपकरण का उपयोग कर उत्पादन किया वेबपेज में ( F12)।


मुझे टिम का समाधान बहुत पसंद है , यह आसान और काम कर रहा है।

लेकिन अभी भी एक समस्या है: किसी भी समय उपयोगकर्ता परिवर्तन पैरामीटर (मेरी रिपोर्ट मापदंडों का उपयोग करता है!) AJAX div को ताज़ा करता है, अतिप्रवाह: ऑटो टैग को फिर से लिखा जाता है, और कोई स्क्रिप्ट इसे नहीं बदलती है।

यह तकनीकी विवरण बताता है कि समस्या क्या है:

ऐसा इसलिए होता है क्योंकि AJAX पैनलों के साथ बनाए गए पृष्ठ में, केवल AJAX पैनल पूरे पृष्ठ को ताज़ा किए बिना, अपनी स्थिति बदलते हैं। नतीजतन, OnLoadआपके द्वारा <body>टैग पर लागू की गई घटनाओं को केवल एक बार निकाल दिया जाता है: पहली बार जब आपका पृष्ठ लोड होता है। उसके बाद, किसी भी AJAX पैनल को बदलने से इन घटनाओं को ट्रिगर नहीं किया जा सकेगा।

उपयोगकर्ता einarq इस समाधान का सुझाव दिया :

एक अन्य विकल्प पेजलोड में अपने फ़ंक्शन का नाम बदलना है। इस नाम के साथ किसी भी कार्य को asp.net ajax द्वारा स्वचालित रूप से कहा जाएगा यदि यह पृष्ठ पर मौजूद है, प्रत्येक आंशिक अद्यतन के बाद भी। यदि आप ऐसा करते हैं तो आप बॉडी टैग से ऑनलोड विशेषता को भी हटा सकते हैं

इसलिए बेहतर स्क्रिप्ट लिखी जो समाधान में दिखाई गई है।


1
स्क्रिप्ट को ट्रिगर करने के लिए मैंने पेज_लोड को पेज_लोड किया। अन्यथा, यह क्रोम 13. में रेंडरिंग मुद्दों को हल करने के लिए लगता है। दुर्भाग्य से SSRS में बेसिक नॉर्थ सफारी 5.1 के साथ काम नहीं करता है, इसलिए मैं वहां सत्यापित नहीं कर सकता।
kermatt

इसका कारण गलत है। असली कारण, SSRS HTML QuirksMode HTML है और IE 5.5 बग पर निर्भर करता है। गैर-IE ब्राउज़र में IE quirksmode नहीं है और इसलिए HTML को सही ढंग से प्रस्तुत करना है। उन ब्राउज़रों के लिए जो अपने QuirksMode में IE 5.5 बग्स का अनुकरण नहीं करते हैं, इसमें टेबल की चौड़ाई निर्धारित करने का अभाव होता है ... यह IE 10 पर भी लागू होता है, क्योंकि इसमें एक नया डिफ़ॉल्ट- quirksmode मोड है।
स्टीफन स्टीगर

8
अच्छी तरह से काम। लेकिन SQL Server 2012 के लिए, अपमानजनक div आईडी है ctl32_ctl09
azzlack

3
id ctl32_ctl09 या जो कुछ भी उत्पन्न होता है, उसे खोजने के बजाय, प्रयास करें: document.querySelector ("[id ^ = VisibleReportContent]")।
पैरा

1
@JustinMangum - क्वेरीज़ेलेक्टर का उपयोग IE में संगतता दृश्य में विफल हो जाएगा, जो इंट्रानेट एसएसआरएस साइटों के लिए लगभग निश्चित रूप से सक्षम है। लक्षण यह है कि लोडिंग संवाद कभी बंद नहीं होगा, इसलिए उपयोगकर्ता किसी भी रिपोर्ट को देखने में असमर्थ होंगे।
माइक

27

बस SizeToReportContent="true"नीचे दिखाए अनुसार शामिल करें

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

4
मुझे नहीं पता कि यह एक के रूप में स्वीकृत समाधान क्यों नहीं है) यह ठीक काम करता है, और बी) यह समाधान में बनाया गया लगता है। रिपोर्टवॉकर को ठीक से काम करने के लिए हैक नहीं। ऐसा नहीं है कि यह काम करने के लिए ReportViewer को हैक करने में कुछ भी गलत है। पूरे रिपोर्टव्यूअर की तरह लगता है बड़े हैक पर है।
Raif

3
क्या यह समाधान केवल अनुप्रयोग में ReportViewer नियंत्रण को एम्बेड करने के लिए लागू नहीं होता है? यदि यह रिपोर्ट प्रबंधक पर लागू होता है और रिपोर्ट सर्वर URL से चलता है, तो कृपया निर्दिष्ट करें कि आपको इस संपादन को कहाँ शामिल करना है।
पंजीकृत उपयोगकर्ता

2
क्या आप निम्न पंक्ति का उल्लेख \ SQL \ MSRS11.MSSQLSERVER \ Reporting Services \ ReportServer \ Pages \ ReportViewer.aspx: <RS: ReportViewerHost ID = "ReportViewerColrol" runat = "server" />
पंजीकृत उपयोगकर्ता

1
यह ठीक काम कर सकता है, लेकिन अगर आपके पास एक रिपोर्ट पर बहुत सारी छवियां (संकेतक / स्पार्कलाइन) हैं, तो यह प्रतिपादन के समय को सावधानी से उड़ा देगा।
ट्रैब्स

1
यह SSRS 2012 में ReportViewer.aspx को संशोधित करते समय काम नहीं करता है।
कीथ

23

मैं SQL 2008 R2 SP1 के साथ क्रोम संस्करण 21 का उपयोग कर रहा हूं और उपरोक्त में से कोई भी सुधार मेरे लिए काम नहीं कर रहा है। नीचे वह कोड है जो काम करता था, जैसा कि अन्य उत्तरों के साथ मैंने "C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ ji \ 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
यह समाधान हमारे पर्यावरण में बहुत अच्छा काम कर रहा है। धन्यवाद माइक
विंस Perta

14

यह एक ज्ञात मुद्दा है । समस्या यह है कि एक div टैग में शैली "अतिप्रवाह: ऑटो" है जो जाहिरा तौर पर WebKit के साथ अच्छी तरह से लागू नहीं किया गया है जो कि सफारी और क्रोम द्वारा उपयोग किया जाता है (इमानुएल ग्रीको का जवाब देखें)। मुझे पता नहीं था कि RS: ReportViewerHost तत्व का उपयोग करने के लिए Emanuele के सुझाव का लाभ कैसे उठाया जाए, लेकिन मैंने जावास्क्रिप्ट का उपयोग करके हल किया।

मुसीबत

यहाँ छवि विवरण दर्ज करें

समाधान

चूंकि "ओवरफ़्लो: ऑटो" आईडी तत्व की शैली विशेषता में आईडी "ctl31_ctl10" के साथ निर्दिष्ट है, इसलिए हम इसे स्टाइलशीट फ़ाइल में ओवरराइड नहीं कर सकते हैं इसलिए मैंने जावास्क्रिप्ट का सहारा लिया। मैंने "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 के लिए एक समाधान प्रतीत होता है जिसे मैंने कोशिश नहीं की है लेकिन मुझे नहीं लगता कि यह SSRS 2008 के लिए लागू है क्योंकि मुझे "DocMapAndReportFrame" वर्ग नहीं मिल सकता है।


2
एक बात है जो मुझे समझ नहीं आ रही है। यदि आप in \ ReportingServices.js में कोड फ़ंक्शन FixSari लागू करते हैं, और फिर आप SSRS में रिपोर्ट प्रदर्शित करने के लिए कोड निष्पादित करते हैं, तो आप FixSafari के लिए स्रोत विधि कोड निष्पादित करने के लिए फ़ंक्शन कैसे लागू करते हैं? अगर मैं सही तरीके से समझूं, तो ReportingServices.js के लिए मूल कोड तैयार हो गया है और अंत में आप FixSafari कोड निष्पादित करते हैं?
व्हाट्सअप

12

ऊपर दिए गए विचारों के आधार पर मेरा समाधान।

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

यह एक निश्चित आईडी तक सीमित नहीं है, इसके लिए आपको किसी अन्य लाइब्रेरी जैसे jQuery को शामिल करने की आवश्यकता नहीं है।


लेकिन जो तत्व बाकी सभी को लक्षित कर रहे हैं, जैसे कि ctl31_ctl10 और इसके वेरिएंट, जरूरी नहीं कि उनमें _fixedTable हो। क्या मैं कुछ भूल रहा हूँ?
बोडाद

@ बोडाद - उपरोक्त समाधान सही डिव को खोजने के लिए चाइल्ड सिलेक्टर का उपयोग करता है। यह अधिक स्थिर आईडी विशेषता के साथ श्रृंखला के ऊपर एक आइटम के आधार पर शुरू होता है, फिर बच्चों को वांछित डिव के लिए पेड़ के नीचे चलता है। मैं पसंद करूंगा कि यह चर के लिए अधिक वर्णनात्मक, कम अतिभारित नाम का उपयोग करे, लेकिन यह एक अन्यथा उत्कृष्ट समाधान है। सुझाया गया नाम: reportPayloadElement।
ब्रायन स्विफ्ट

11

यहाँ समाधान है जो मैंने रिपोर्ट सर्वर 2008 R2 के लिए उपयोग किया था

यह रिपोर्ट के बिना काम करना चाहिए कि रिपोर्ट सर्वर तालिका के अपने "आईडी" विशेषता के उपयोग के लिए आउटपुट करेगा। मुझे नहीं लगता कि आप हमेशा मान सकते हैं कि यह "ctl31_fixedTable" होगा

मैंने ऊपर दिए गए सुझाव के मिश्रण का उपयोग किया और कुछ तरीके से जावास्क्रिप्ट पुस्तकालयों को जावास्क्रिप्ट पेज से एक पृष्ठ में गतिशील रूप से लोड करने के लिए यहां पाया गया

सर्वर पर निर्देशिका में जाएँ: 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) == 'अपरिभाषित'); गलत: true)
rmcsharry

4

आप इसे आसानी से jQuery के साथ ठीक कर सकते हैं - और थोड़ा बदसूरत हैक :-)

मेरे पास एक 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>

यह मानने से बेहतर है कि इसकी एक निश्चित आईडी है। आप जो भी चाहें टाइमर को समायोजित कर सकते हैं। मैंने इसे 1000 ms पर सेट किया है।


3

FYI करें - उपरोक्त में से कोई भी मेरे लिए 2012 SP1 में काम नहीं किया था ... सरल समाधान साझा डेटा स्रोत में क्रेडेंशियल्स को एम्बेड करना था और फिर सफारी को SSRS सर्वर साइट पर भरोसा करने के लिए कहना था। फिर यह महान काम किया! नीचे दिए गए समाधानों को देखने के लिए ऊपर के दिनों की तरह ही एकीकृत सुरक्षा का पता लगाने के लिए सफ़ारी पर मज़बूती से काम नहीं करेगा - आपको मैक पर किचेन में गड़बड़ करनी होगी और फिर भी मज़बूती से काम नहीं करना होगा।


2

इमानुएल द्वारा प्रदान किए गए समाधान ने मेरे लिए काम किया। मैं रिपोर्ट देख सकता था जब मैंने इसे सर्वर से सीधे एक्सेस किया था लेकिन जब मैंने अपने एस्पेक्स पेज पर एक रिपोर्ट व्यूवर नियंत्रण का उपयोग किया, तो मैं रिपोर्ट देखने में असमर्थ था। रेंडर किए गए HTML का निरीक्षण करने पर, मुझे आईडी "ReportViewerGeneral_ctl09" द्वारा एक div मिला ( ReportViewerGeneral रिपोर्ट व्यूअर कंट्रोल का सर्वर आईडी है) जिसके पास ऑटो के लिए ओवरफ्लो संपत्ति है।

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

मैंने इसे बदलने के लिए इमानुएल द्वारा बताई गई प्रक्रिया का उपयोग इस प्रकार किया कि यह निम्नानुसार दिखाई दे:

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

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

2

मैंने इसका उपयोग किया है। Report.aspx पृष्ठ पर jquery पर एक स्क्रिप्ट संदर्भ जोड़ें। JQuery को microsoft इवेंट से लिंक करने के लिए निम्नलिखित का उपयोग करें। ओवरफ्लो सेट करने के लिए एरिक के सुझाव का थोड़ा उपयोग किया।

$(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');
                    });
                });
            }
        });
    }
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.