2015-07-20 1 views
0

J'ai une application MVC4 utilisant MVCReportViewer pour charger un rapport, mais le sous-état ne se charge pas et renvoie cette erreur:MVCReportViewer chargement d'erreur de sous-états

Data retrieval failed for the subreport, 'Actions', 
located at: C:\Projects\Report\ReportActions.rdlc. 
Please check the log files for more information. 

Voici mon code de vue:

@using Microsoft.Reporting.WebForms; 
@using MvcReportViewer; 
@using MvcReportViewer 
@model ViewReport 

@Html.MvcReportViewerFluent(Model.ReportPathTordlc).ProcessingMode(ProcessingMode.Local).LocalDataSource(Model.ReportDataSet, Model.Report).LocalDataSource(Model.ActionDataSet, Model.Actions).Attributes(new { Height = 900, Width = 800, style = "border: 2px solid #ddd" }).Method(FormMethod.Post); 

Le chemin d'accès aux deux fichiers .rdlc est correct car je le vérifie sur le contrôleur avant de charger la vue. Le rapport reportPathTordlc affiche right, J'ai un paramètre à vérifier, donc dans mon report.rdlc j'ai inséré un sous-rapport avec le paramètre. Sur le sous-rapport, j'ai créé un paramètre. mais toujours le sous-rapport ne montre pas.

Sur les fichiers journaux de C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\LogFiles ne montre aucune erreur, il n'affiche que: i INFO: Call to CleanBatch().

Rechercher partout et n'a pas encore eu de chance.

Projet de here

Toute aide serait appréciée.

Répondre

0

Après beaucoup de recherches, j'ai finalement trouvé une solution:

Son pas la façon la plus élégante, mais fonctionne très bien.

Alors pour se faire:

Contrôleur:

// Init new DataTable 
DataTable dt = new DataTable(); 
// Assign the data for Subreport 
dt = dataToLoadInSubReport(); 
// Place it in Session 
Session["dataToLoadInSubReport"] = dt; 

En Vue:

// Remove the subreport .LocalDataSource, keep the Parent Report 
@Html.MvcReportViewerFluent("~/Report/report.rdlc").ProcessingMode(ProcessingMode.Local).LocalDataSource("ReportDataSet", ReportDataTable).Method(FormMethod.Post); 

En MvcReportViewer:

// Html head (Added the script below) 
<script runat="server"> 
    void SubSubreportProcessing(object sender, SubreportProcessingEventArgs e) 
    { 
     // Check if Session is not null 
     if (Session["dataToLoadInSubReport"] != null) 
     { 
      // Get data in Session 
      System.Data.DataTable dt = Session["dataToLoadInSubReport"] as System.Data.DataTable; 
      // Convert to dataview to filter 
      System.Data.DataView dv = new System.Data.DataView(dt); 
      if (dv != null) 
      { 
       // Get Subreport parameter 
       var param1 = Convert.ToInt32(e.Parameters[0].Values[0]); 
       // Filter DataView 
       dv.RowFilter = "ID = " + param1; 
       // Add Filtered DataView to DataSource specified in the Subreport rdlc file 
       e.DataSources.Add(new ReportDataSource("DTSubReport", dv)); 
      }    
     } 
    } 

    protected void ReportViewer_PreRender(object sender, EventArgs e) 
    { 
     ReportViewer.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SubSubreportProcessing); 
    } 
</script> 
//Html body (add new attribute OnPreRender="") 
<rsweb:ReportViewer ID="ReportViewer" ClientIDMode="Predictable" runat="server" OnPreRender="ReportViewer_PreRender"></rsweb:ReportViewer> 

Le parent doit travailler décrire comme dans le MVCRepo rtViewer, c'est pour que le sous-rapport fonctionne ensemble.

Espérons que cela aidera quelqu'un là-bas.

Cheers