【问题标题】:How to use Crystal Reports without a tightly-linked DB connection?如何在没有紧密链接的数据库连接的情况下使用 Crystal Reports?
【发布时间】:2009-07-16 20:51:51
【问题描述】:

我正在学习使用 Crystal Reports(使用 VB 2005)。

到目前为止,我所看到的大部分内容都涉及直接从数据库中提取数据,如果您只想在报告中显示这些数据,这很好。

我的数据库有很多外键,所以我试图在我的应用程序中呈现实际信息时保持理智的方式是向我的对象添加额外的成员,这些成员包含外键所代表的字符串(描述)。喜欢:

Class AssetIdentifier

    Private ID_AssetIdentifier As Integer
    Private AssetID As Integer
    Private IdentifierTypeID As Integer
    Private IdentifierType As String
    Private IdentifierText As String

    ...

这里,IdentifierTypeID 是一个外键,我在另一个表中查找该值并将其放在 IdentifierType 中。这样我就可以在对象中添加文本描述,并且可以将它与其他东西一起随身携带。

那么,关于我的 Crystal Reports 问题。

Crystal Reports 似乎可以很容易地连接到特定表中的记录(尤其是专家),但这就是你所得到的。

理想情况下,我想列出我的课程,例如

Dim assetIdentifiers as New List(Of AssetIdentifier)

并将其传递给 Crystal Report,而不是与特定数据库建立紧密链接,为我完成大部分工作,但让我处理它不做的部分。到目前为止,我能看到的最接近的是 ADO.NET 数据集,但即便如此,它似乎也相去甚远。我自己已经很好地处理了查询:我有各种基于查询返回 List(Of What) 的函数。

有没有简单的方法可以做到这一点?

提前致谢!

更新:好的,我在这里找到了一些东西:

http://msdn.microsoft.com/en-us/library/ms227595(VS.80).aspx

但它似乎只为 Web 项目或 Web 应用程序提供此功能。如果我想集成到一个独立的应用程序中,我会不走运吗?

【问题讨论】:

    标签: visual-studio-2005 crystal-reports


    【解决方案1】:

    按照您发布的链接中的说明创建股票对象,并按照他们的指定创建报告 (StockObjectsReport)。在这个简化的示例中,我只是将报表查看器 (crystalReportViewer1) 添加到表单 (Form1),然后在 Form_Load 事件中使用以下代码。

    stock s1 = new stock("AWRK", 1200, 28.47);
    stock s2 = new stock("CTSO", 800, 128.69);
    stock s3 = new stock("LTWR", 1800, 12.95);
    
    ArrayList stockValues = new ArrayList();
    
    stockValues.Add(s1);
    stockValues.Add(s2);
    stockValues.Add(s3);
    
    ReportDocument StockObjectsReport = new StockObjectsReport();
    StockObjectsReport.SetDataSource(stockValues);
    
    crystalReportViewer1.ReportSource = StockObjectsReport;
    

    这应该使用 Windows 窗体中 stock 对象的 3 个值填充您的报告。

    编辑:抱歉,我刚刚意识到您的问题是在 VB 中,但我的示例是在 C# 中。你应该得到一般的想法。 :)

    【讨论】:

    • 谢谢!我必须超越本教程仅适用于网络应用的观念。
    • @Dusty 您的解决方案运行不正确。给出异常 StockObjectsReport.SetDataSource(stockValues);在这一行。
    • @AsifQadri 你解决过这个问题吗?我有同样的问题。
    • @AsifQadri 十年后,我确信不再是问题,但请查看我发布的答案,因为您可能遇到了与我在单个对象中遇到的相同问题,而 Crystal Report 似乎想要一个列表。
    【解决方案2】:

    我正在按文件名加载报告,它运行良好:

    //........
    
    ReportDocument StockObjectsReport;
    
    string reportPath = Server.MapPath("StockObjectsReport.rpt");
    
    StockObjectsReport.Load(reportPath);
    
    StockObjectsReport.SetDataSource(stockValues);
    
    //Export PDF To Disk
    
    string filePath = Server.MapPath("StockObjectsReport.pdf");
    
    StockObjectsReport.ExportToDisk(ExportFormatType.PortableDocFormat, filePath);
    

    【讨论】:

      【解决方案3】:

      @Dusty 有。但是在我的情况下,事实证明您必须将对象包装在一个列表中,即使它是一个项目,然后我才能打印它。查看完整代码示例:

      string filePath = null;
      string fileName = null;
      
      ReportDocument newDoc = new ReportDocument();
      // Set Path to Report File
      fileName = "JShippingParcelReport.rpt";
      filePath = func.GetReportsDirectory();
      
      // IF FILE EXISTS... THEN
      string fileExists = filePath +@"\"+ fileName;
      if (System.IO.File.Exists(fileExists))
      {
          // Must Convert Object to List for some crazy reason?
          // See: https://stackoverflow.com/a/35055093/1819403
          var labelList = new List<ParcelLabelView> { label };
          newDoc.Load(fileExists);
          newDoc.SetDataSource(labelList);
      
          try
          {
              // Set User Selected Printer Name
              newDoc.PrintOptions.PrinterName = report.Printer;
              newDoc.PrintToPrinter(1, false, 0, 0);  //copies, collated, startpage, endpage
              // Save Printing
              report.Printed = true;                                     
              db.Entry(report).State = System.Data.Entity.EntityState.Modified;
              db.SaveChanges();
          }
          catch (Exception e2)
          {
      
              string err = e2.Message;
          }
      
      }
      
                                     
      

      【讨论】:

        猜你喜欢
        • 2013-06-28
        • 2011-10-22
        • 2012-07-11
        • 1970-01-01
        • 2011-02-13
        • 2019-10-23
        • 2018-11-06
        • 2013-03-12
        • 2019-08-22
        相关资源
        最近更新 更多