سؤال

نحن نستخدم إطار MVC (الإصدار 5) CrystalReportViewer التحكم في اظهار التقارير.لا أستطيع الحصول على أي من الأزرار الموجودة في الجزء العلوي من "عارض التقرير" السيطرة على العمل.

إذا أنا أعمل مع تقرير 'HoursSummary'.إذا كنت تحوم فوق أي زر من الأزرار على "عارض التقرير" في أي عرض الرابط في أسفل صفحات '../HoursSummary'.وهذا يخلق url 'http://localhost/HoursSummary'.ليس هناك 'HoursSummary' تحكم حتى أظل تلقي أخطاء 404.

  • وأعتقد أن كنت تريد إعادة توجيه إلى 'http://localhost/reports/HoursSummary منذ لدي تقارير المراقب المالي.إذا كان هذا هو الأسلوب الصحيح لا أحد يعرف الممتلكات التي يجب على CrystalReportViewer التحكم لتحقيق ذلك ؟
  • هناك طريقة أسهل للتعامل مع هذا الوضع ؟
هل كانت مفيدة؟

المحلول 2

كنا قادرين على الحصول على "عارض التقرير" أن العمل قد تم استخدامه في الأشهر القليلة الماضية في الإنتاج دون أي مشاكل.

  • لدينا تقارير تحكم قوائم روابط التقارير نريد تشغيل
  • النقر على أحد الروابط سيجعل اياكس دعوة إلى النهاية الخلفية و عودة جزئية الصفحة حيث يمكنك ملء جميع المعلمات علينا.
  • بعد المعلمات تمتلئ يجب إرسال النموذج إلى '\تقارير\اسم التقرير'.
  • مرة أخرى في التقارير تحكم نسميه SQL, عودة البيانات ، ومن ثم استدعاء وجهة نظر مختلفة تسمى 'تقرير كامل'
  • أن التقرير عرض فقط كريستال "عارض التقرير" السيطرة على ذلك حيث أنه يأخذ تلقائيا التقرير البيانات التي تمر من خلال ViewData ، بملء تقرير, يجعل, ويرسله إلى المستخدم

يبدو أن كل شيء يعمل كبيرة.

التحديث

لقد تم إضافة بعض التعليمات البرمجية و توضيح الخطوات أنا أصلا المذكورة أعلاه.مفتاح البند تركت كان هناك بعض التعليمات البرمجية خلف مع النهائي لذلك سوف تعمل مع تقارير Crystal.رمز وراء الحد الأدنى ، ولكن الحاجة.عن تقارير Crystal للعمل كنت تسير في نهاية المطاف مع الملفات التالية:

  • الملف layout.rpt حيث يمكنك تصميم التقرير
  • أ aspx الملف الذي يحمل تقارير Crystal تقرير الرقابة.هذا هو الملف الذي سوف يكون بعض التعليمات البرمجية خلف.

على تفاصيل حول كيفية إنشاء طريقة عرض التي سوف تعمل مع تقارير Crystal:

  • إنشاء تخطيط الخاصة بك التقرير استخدام تقارير Crystal مصمم.الملف الناتج سوف يكون .الملف rpt.لأجل هذا المثال, دعونا نسمي هذا الملف AllJobsSummaryReportLayout.rpt.
  • في حين تصميم التقرير الخاص بك ، 'حقول قاعدة البيانات' اختر واحدة من الكيانات التجارية أو DTOs أن يحمل نتائج عودته من SQL.
  • سريع جانبا ، لدينا عدد قليل من نقل بيانات كائنات (DTOs) في نظامنا التي تحتوي على لا شيء أكثر من القيم العددية و السلاسل, لا توجد أية معلومات في هذه DTOs.عندما تحكم يطلق عليه ، ويدعو نموذج, نموذج معظم هذه التقارير بإرجاع قائمة DTOs و من ثم تمرير الرأي أن تكون المقدمة.هذه DTOs لا أعرف كيفية الاستعلام أنفسهم ، عرض أنفسهم, إلا أنها تحتوي على القيم الفعلية عاد من SQL أن شخصا آخر ثم يجعل.
  • مرة واحدة تخطيط تقرير الكريستال الملف اكتمل ، AllJobsSummaryReportLayout.rpt, نحن تصميم وحدة التحكم لدينا.في وحدة تحكم نأخذ في أي المعلمات اللازمة لتشغيل التقرير استدعاء نموذج, نموذج عوائد لدينا قائمة من DTOs ، كما رأينا في المقتطف أدناه من المراقب المالي:

    var reportViewData = model.AllJobsSummaryQuery(startDate, endDate);
    if (0 != reportViewData.Count())
    {
        var report = new AllJobsSummaryReportLayout();
        report.SetDataSource(reportViewData);
        report.SetParameterValue("startDate", startDate);
        report.SetParameterValue("endDate", endDate);
        ViewData["ReportData"] = report;
        returnView = "AllJobsSummaryView";
    }
    else
        returnView = "noReportView";
    return View(returnView);
    
  • لاحظ اثنين من العناصر هنا, نحن خلق varible 'تقرير' هذا هو نوع من الكريستال تقرير تخطيط الملف ، AllJobsSummaryReportLayout.rpt أننا إنشاؤها أعلاه.

  • بمجرد إنشاء 'تقرير' متغير وضعنا مصدر البيانات والقيم أية معلمات نحتاج حزمة البند في ViewData.

  • الآن دعونا نلقي نظرة على AllJobsSummaryView.aspx.هذا الملف يحتوي على نموذج على ذلك مع تقارير Crystal المشاهد مدونة خلف الملف:

<%@ Page Title="All Jobs Summary Report" Language="C#" AutoEventWireup="true" CodeBehind="AllJobsSummaryView.aspx.cs" Inherits="V.Views.Reports.AllJobsSummaryView"%>     
<%@ Register Assembly="CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %> 
<form id="form1" runat="server">
<div>
<a href="/Reports" id="Report"><< Return to Report Main
    Page</a><br />
<CR:CrystalReportViewer ID="ReportViewer" runat="server" AutoDataBind="True" EnableDatabaseLogonPrompt="False"
    EnableParameterPrompt="False" HasCrystalLogo="False" DisplayGroupTree="False" 
    HasDrillUpButton="False" HasToggleGroupTreeButton="False" HasViewList="False" 
    HasSearchButton="False" EnableDrillDown="False" EnableViewState="True" 
    Height="50px" ReportSourceID="CrystalReportSource1" Width="350px" />    
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
    <Report FileName="AllJobsSummaryReportLayout.rpt">
    </Report>
</CR:CrystalReportSource>
</div>
</form>
  • وقانون خلف الملف:

     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Web;
     using System.Web.Mvc;
    
     namespace V.Views.Reports
     {
        public partial class AllJobsSummaryView : ViewPage
        {
            protected void Page_Init(object sender, EventArgs e)
            {
                ReportViewer.ReportSource = ViewData["ReportData"];
            }
    
            protected void Page_Unload(object sender, EventArgs e)
            {
                ((AllJobsSummaryReportLayout)ViewData["ReportData"]).Close();
                ((AllJobsSummaryReportLayout)ViewData["ReportData"]).Dispose();
            }
        }
     }
    
  • على Page_Unload هو المفتاح دون ذلك سوف يكون خطأ الناتجة عن تقارير Crystal 'لقد تجاوزت الحد الأقصى لعدد من التقارير التي وضعها المشرف.'

هذا الأسلوب لا يزال يعمل في بيئة الإنتاج لأكثر من عامين الآن.

نصائح أخرى

إذا كان هذا الخادم التحكم ، فإنه لن ينجح.ASP.NET MVC لا يستخدم أي postbacks ، لذلك معظم webforms خادم الضوابط لا تعمل.

ما يمكنك القيام به هو تضمين عارض التقرير في iFrame والإخراج في MVC.الإطار يمكن أن نشير إلى صفحة خارج من الاشياء MVC ، ويقول في مجلد فرعي يسمى إرث أو ما شابه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top