2

我以前没用过水晶报表。但是对于一个项目,由于打印问题,我需要使用它而不是 fastreport。我已经尝试解决我的问题好几个小时,但还没有找到任何解决方案。

好吧,我有两个类可以用于水晶报表。我想创建一个账单报告。

我从我的数据库中组织了一些数据并将它们放入我的这些类中。

public class ReportInfo
{
    public DateTime Date { get; set; }
    public string BillNumber { get; set; }
    public string Address { get; set; }
    public string BillAddress { get; set; }
    public string BillOwner { get; set; }
    public string TaxNumberIDNumber { get; set; }
    public List<ReportProduct> Products { get; set; }
    public string PaymentType { get; set; }
    public string MoneyWithText { get; set; }

}

public class ReportProduct
{                          
    public string ProductInfo { get; set; }
    public double Amount { get; set; }
    public string ProductCode { get; set; }
    public double Tax { get; set; }
    public double Price { get; set; }

}

如您所见,reportinfo 类中有一个账单类(报告信息)和一个产品列表(报告产品)。

我想创建一个报告,该报告将在标题上具有某些值(账单编号、日期...),在详细信息区域具有某些值(产品信息)。

在这里,我为一张账单做了这件事(我也不知道如何将账单放在报告查看器中)

var serialID = Convert.ToInt32(dgBillSerials.SelectedRows[0].Cells[0].Value);
var bills= BillsFromDatabase.Bills.Where(b => b.BillSerialID == serialID && (b.BillNumber>=txtFirstBillNumber.Value && b.BillNumber<=txtLastBillNumber.Value)).ToList();

var products = BillsFromDatabase.Products.Where(p => p.BillID == bills[0].ID).ToList();
ReportInfo ri = new ReportInfo();
ri.Address = bills[0].Address;
ri.BillAddress = bills[0].BillAddress;
ri.BillNumber =bills[0].SerialNumber + bills[0].BillNumber.ToString();
ri.BillOwner = bills[0].OwnerType == "sirket" ? bills[0].PersonTitle : bills[0].Name;
ri.Date = bills[0].BillDate;
ri.MoneyWithText = "deneme";
ri.PaymentType = bills[0].PaymentType;
ri.TaxNumberIDNumber=bills[0].OwnerType=="sirket"?bills[0].TaxDepartment + " " + bills[0].TaxNumber:bills[0].NationalID;
ri.Products = new List<ReportProduct>();
double sum=0;

foreach (var product in products)
{
 sum += product.Price;
 ri.Products.Add(new ReportProduct()
 {
   Price = product.Price,
   ProductCode = product.ProductCode,
   ProductInfo = product.ProductInfo,
   Amount = Math.Round((product.Price/118)*100,2),
   Tax =Math.Round( product.Price -((product.Price / 118) * 100),2)
 });

}

 ri.MoneyWithText = Utils.MoneyToText(sum);

 ReportDocument crystalReport  = new ReportDocument();

 crystalReport.Load(@"..my path....\BillCrystalReport.rpt");

 crystalReport.SetDataSource(ri);

crystalReportViewer1.ReportSource = crystalReport;

当我运行该代码时,在 crystalReport.SetDataSource(ri) 上抛出“源对象无效”的异常;

我知道这看起来不公平,但我不知道如何在我的水晶报告中实现两个表格。当我将我的两个类都添加到水晶报告中时,它看起来像这样

水晶报告

我为一节课做了这个,还可以。但是这个教程没有谈论多个数据对象。

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

ps:使用vs 2012和fw 4.0并安装sap水晶报告。

4

1 回答 1

3

我解决了我的问题。首先我添加了一个关于账单和产品之间关系的 int 值,并删除了 public List Products { get; 放; } ReportInfo 中的那个属性

public class ReportInfo
{
    public DateTime Date { get; set; }
    public string BillNumber { get; set; }
    public string Address { get; set; }
    public string BillAddress { get; set; }
    public string BillOwner { get; set; }
    public string TaxNumberIDNumber { get; set; }
    public string PaymentType { get; set; }
    public string MoneyWithText { get; set; }
    public int OrderId { get; set; }
}

public class ReportProduct
{                          
    public string ProductInfo { get; set; }
    public double Amount { get; set; }
    public string ProductCode { get; set; }
    public double Tax { get; set; }
    public double Price { get; set; }
    public int OrderId { get; set; }

}

这是获取账单和产品并打开一个新表格

  var serialID = Convert.ToInt32(dgBillSerials.SelectedRows[0].Cells[0].Value);
               var bills= BillsFromDatabase.Bills.Where(b => b.BillSerialID == serialID && (b.BillNumber>=txtFirstBillNumber.Value && b.BillNumber<=txtLastBillNumber.Value)).ToList();


              var reportInfoList = new List<ReportInfo>();
               var reportProductList = new List<ReportProduct>();
               var tmp1 =new ReportInfo();
               var tmp2 = new ReportProduct();
               foreach (var bill in bills)
               {

                   tmp1= new ReportInfo()
                       {
                           Address = bill.Address,
                           BillAddress = bill.BillAddress,
                           BillNumber =bill.SerialNumber + bill.BillNumber.ToString(),
                           BillOwner = bill.OwnerType == "sirket" ? bill.PersonTitle : bill.Name,
                        //   Date = bill.BillDate,
                           MoneyWithText = "deneme",
                           PaymentType = bill.PaymentType,
                           TaxNumberIDNumber=bill.OwnerType=="sirket"?bill.TaxDepartment + " " + bill.TaxNumber:bill.NationalID,
                           OrderId = bill.ID,
                           Date = bill.BillDate
                       };

                   var products = BillsFromDatabase.Products.Where(p => p.BillID == bill.ID).ToList();
                   double sum = 0;
                   foreach (var product in products)
                   {
                       sum += product.Price;
                       reportProductList.Add(new ReportProduct()
                                             {  
                                                 Price = product.Price,
                                                 ProductCode = product.ProductCode,
                                                ProductInfo = product.ProductInfo,
                                                Amount = Math.Round((product.Price/118)*100,2),
                                                Tax =Math.Round( product.Price -((product.Price / 118) * 100),2),
                                                OrderId = product.BillID

                                             });  
                   }

                   tmp1.MoneyWithText = Utils.MoneyToText(sum); 
                   reportInfoList.Add(tmp1);
               }

               FrmReportPreview preview = new FrmReportPreview(reportInfoList,reportProductList);
               preview.Show();

新表格显示水晶报表查看器

    private List<ReportInfo> _reportInfoList;
    private List<ReportProduct> _reportProductList;

    public FrmReportPreview(List<ReportInfo> reportInfoList, List<ReportProduct> reportProductList)
    {
        InitializeComponent();
        _reportInfoList = reportInfoList;
        _reportProductList = reportProductList;

    }

    private void FrmReportPreview_Load(object sender, EventArgs e)
    {
        LoadReport();
    }

    private void LoadReport()
    {

        ReportDocument crystalReport = new ReportDocument();                      

        crystalReport.Load(@"...mypath\BillCrystalReport.rpt");


        crystalReport.Database.Tables[0].SetDataSource(_reportInfoList);
        crystalReport.Database.Tables[1].SetDataSource(_reportProductList);


        crystalReportViewer1.ReportSource = crystalReport;

        crystalReportViewer1.RefreshReport();

    }

这是我的水晶报表设计

水晶报表设计

这就是结果

结果

于 2013-05-19T14:17:15.513 回答