문제

우리는 보고서를 표시하기 위해 MVC 프레임워크(릴리스 5)와 CrystalReportViewer 컨트롤을 사용하고 있습니다.보고서 뷰어 컨트롤 상단에 있는 버튼이 작동하지 않습니다.

'HoursSummary' 보고서로 작업하는 경우IE 보고서 뷰어의 버튼 위로 마우스를 가져가면 페이지 하단에 '../HoursSummary' 링크가 표시됩니다.그러면 '라는 URL이 생성됩니다.http://localhost/Hours요약'.'HoursSummary' 컨트롤러가 없어서 404 오류가 계속 발생합니다.

  • '로 리디렉션하고 싶습니다.http://localhost/reports/HoursSummary' 보고서 컨트롤러가 있기 때문입니다.이것이 올바른 방법이라면 CrystalReportViewer 컨트롤에서 어떤 속성을 설정해야 하는지 아는 사람이 있습니까?
  • 이 상황을 처리하는 더 쉬운 방법이 있습니까?
도움이 되었습니까?

해결책 2

우리는 보고서 뷰어를 작동시킬 수 있었고 지난 몇 달 동안 프로덕션에서 아무 문제 없이 사용해 왔습니다.

  • 실행하려는 보고서에 대한 링크를 나열하는 보고서 컨트롤러가 있습니다.
  • 링크 중 하나를 클릭하면 백엔드에 대한 ajax 호출이 이루어지고 필요한 모든 매개변수를 채울 수 있는 부분 페이지가 반환됩니다.
  • 매개변수를 입력한 후 ' eports ame of Report'에 양식을 제출합니다.
  • 보고서 컨트롤러로 돌아가서 SQL을 호출하고 데이터를 반환한 다음 '전체 보고서'라는 다른 보기를 호출합니다.
  • '전체 보고서' 보기에는 ViewData를 통해 전달된 보고서 데이터를 자동으로 가져와 보고서를 채우고 렌더링한 후 사용자에게 보내는 Crystal 보고서 뷰어 컨트롤만 있습니다.

모든 것이 잘 작동하는 것 같습니다.

업데이트

위에 원래 나열한 단계에 몇 가지 코드와 설명을 추가했습니다.제가 빠뜨린 핵심 항목은 최종 보기 뒤에 일부 코드가 있어서 Crystal Reports에서 작동한다는 것입니다.뒤에 숨겨진 코드는 최소한이지만 필요합니다.Crystal Reports가 작동하려면 다음 파일이 필요합니다.

  • 보고서를 디자인하는 레이아웃 파일.rpt
  • Crystal Reports 보고서 컨트롤이 포함된 aspx 파일입니다.이것은 뒤에 몇 가지 코드가 있는 파일입니다.

Crystal Reports에서 작동하는 뷰를 만드는 방법에 대한 세부 정보:

  • Crystal Reports Designer를 사용하여 보고서 레이아웃을 만듭니다.결과 파일은 .rpt 파일이 됩니다.이 예에서는 이 파일의 이름을 AllJobsSummaryReportLayout.rpt로 지정하겠습니다.
  • 보고서를 디자인하는 동안 '데이터베이스 필드'에 대해 SQL에서 반환되는 결과를 보유하는 비즈니스 엔터티 또는 DTO 중 하나를 선택합니다.
  • 간단히 말해서 우리 시스템에는 스칼라 값과 문자열만 포함하는 몇 가지 데이터 전송 객체(DTO)가 있으며 이러한 DTO에는 지능이 없습니다.컨트롤러가 호출되면 모델을 호출하고, 대부분의 보고서에 대한 모델은 렌더링할 뷰에 전달하는 DTO 목록을 반환합니다.이러한 DTO는 자신을 쿼리하고 표시하는 방법을 모르고 다른 사람이 렌더링하는 SQL에서 반환된 실제 값만 포함합니다.
  • 레이아웃 Crystal Report 파일인 AllJobsSummaryReportLayout.rpt가 완성되면 컨트롤러를 디자인합니다.컨트롤러에서 보고서를 실행하는 데 필요한 매개변수를 가져오고, 모델을 호출하면, 컨트롤러의 아래 스니펫에서 볼 수 있듯이 모델은 DTO 목록을 반환합니다.

    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);
    
  • 여기서 몇 가지 항목에 주목하세요. 위에서 만든 Crystal Report 레이아웃 파일인 AllJobsSummaryReportLayout.rpt의 유형인 변수 '보고서'를 만들고 있습니다.

  • '보고서' 변수를 생성한 후에는 데이터 소스 값과 필요한 매개변수를 설정하고 해당 항목을 ViewData에 묶습니다.

  • 이제 AllJobsSummaryView.aspx를 살펴보겠습니다.이 파일에는 Crystal Reports Viewer 및 파일 숨김 코드가 포함된 양식이 있습니다.

<%@ 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 Reports에서 '관리자가 설정한 최대 보고서 수를 초과했습니다.'라는 오류가 발생합니다.

이 방법은 현재 2년이 훨씬 넘게 프로덕션 환경에서 여전히 작동하고 있습니다.

다른 팁

이것이 서버 컨트롤 인 경우 작동하지 않습니다. ASP.NET MVC는 Postbacks를 사용하지 않으므로 대부분의 WebForms 서버 컨트롤이 작동하지 않습니다.

당신이 할 수있는 일은 보고서 뷰어를 iframe에 포함시키고 MVC보기에 출력하는 것입니다. iframe은 페이지를 가리킬 수 있습니다 밖의 MVC 물건 중에서 레거시 또는 무언가라는 하위 폴더에서 말합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top