2009-11-30 9 views
0

Je génère un rapport Crystal Reports qui devra éventuellement être divisé en milliers de fichiers PDF. Ce qui serait idéal serait que Crystal Reports ait quelque chose comme un "saut de fichier", comme un saut de page, que vous pourriez insérer dans le fichier aux endroits appropriés.Crystal Reports "File Break"

Je vais avoir besoin d'un contrôle assez précis sur les noms de fichiers, ainsi .... quelque chose comme "fileName_ {CustomerId} _ {CustomerIsLocal} .pdf". Je suppose qu'un logiciel tiers sera probablement nécessaire. Pensées?

TIA.

Répondre

3

Je voulais documenter ce pour quelqu'un d'autre qui se présente à la recherche de la réponse:

private readonly CrystalReportViewer reportViewer = new CrystalReportViewer(); 
... 
this.reportViewer.ReportSource = @"C:\PathToReport\Report.rpt"; 

using (var crystalReport = new ReportDocument()) 
{ 
    foreach (DataRow row in dataSet.Tables[0].Rows) 
    { 
     var customerId = int.Parse(row["customerId"].ToString()); 
     var isCurrent = bool.Parse(row["isCurrent"].ToString()); 
     var totalSales = int.Parse(row["totalSales"].ToString()); 

     // generate the report for each row 
     this.CreateReport(customerId, isCurrent, totalSales, crystalReport); 
    } 
} 

private void CreateReport(int customerId, bool isCurrent, int totalSales, ReportDocument crystalReport) 
{ 
    crystalReport.Load(this.reportViewer.ReportSource.ToString()); 

    crystalReport.SetParameterValue("customerId", customerId); 
    crystalReport.SetParameterValue("isCurrent", isCurrent); 
    crystalReport.SetParameterValue("TotalSales", totalSales); 

    var fileName = string.Format("EndOfYear_{0}_{1}.pdf", customerId, isCurrent ? 1 : 0); 

    var outputPath = Path.Combine(this.txtOutputDirectory.Text, fileName); 

    crystalReport.ExportToDisk(ExportFormatType.PortableDocFormat, outputPath); 
} 

Références:

CrystalDecisions.CrystalReports.Design CrystalDecisions.CrystalReports.Engine

Ce code donne un nom de fichier comme ceci:

« EndOfYear_123456_1.pdf »

Il est certainement possible de générer l'objet de rapport pour chaque ligne, plutôt que de le passer, mais ralentit les choses un peu. Réutiliser le même objet de rapport n'a pas d'impact négatif autant que je puisse le voir, et fait avancer les choses dix fois plus vite. La seule autre chose dont vous avez besoin est de savoir comment préparer un rapport Crystal, ce qui dépasse la portée de ce tutoriel. Bonne chance!

+0

Cela semble être exactement ce que je cherche, mais qu'est-ce que vous construisez 'dataSet' de? Désolé si c'est une question idiote; Je suis un peu nouveau à ça. – Eiketsu

+0

Je viens de le construire à partir d'une requête ADO plain-vanilla ... si je le faisais aujourd'hui, j'aurais probablement une liste d'entités à la place. –

2

Je ne pense pas que Crystal supporte une telle fonctionnalité. Nous le gérons actuellement dans notre application, notamment lorsque le format de nom doit être personnalisé et que vos intentions sont d'exécuter le rapport pour un groupe de clients. Vous devrez regarder faire ce travail en utilisant du code (C# est ce que nous avons utilisé).

Si vous avez d'autres questions à ce sujet, n'hésitez pas à demander, afin que je puisse vous aider.

Adriaan

1

La fonctionnalité que vous cherchez est généralement appelé « éclatement ». Bien qu'il existe plusieurs outils tiers pour ce faire, Business Objects Enterprise peut également le faire (bien que Crystal Reports Server ne le puisse pas). Il pourrait être hors de votre gamme de prix, mais il est certainement intéressant de regarder pour la flexibilité qu'il vous donne dans la distribution du rapport ...