2013-05-19 1 views
1

Я раньше не использовал хрустальный отчет. Но для проекта мне нужно использовать его вместо fastreport из-за проблем с печатью. Я пытаюсь решить мою проблему в течение многих часов, но пока не нашел решения.Как использовать пользовательские несколько объектов в Crystal Report

Ну, у меня есть два классы для использования в хрустальном отчете. Я хочу создать отчет о счете.

Я организовал некоторые данные из своей базы данных и поместил их в мои классы.

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; } 

} 

Как вы видите, есть один законопроект класса (информация отчета), а также список для продуктов (отчет producs) в классе reportinfo ..

Я хочу, чтобы создать отчет, который будет некоторое значение (номер счета, дата ...) на заголовке и некоторое значение (информация о продукте) в области сведений.

здесь я сделал это за один счет (Кроме того, я не знаю, как поставить счета в viewert отчет)

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 (п);

Я знаю, что это выглядит несправедливо, но я не знаю, как реализовать две таблицы для моего отчета о кристалле. когда я добавить оба класса в кристаллическом пересаживать это выглядит, что

crystal report

Я сделал это один к одному классу и его OK. но этот tutoraial не говорит о нескольких объектах данных.

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

пс: с использованием против 2012 и Fw 4.0 и установленного отчета SAP Crystal.

ответ

1

Я решил свою проблему. Хорошо, во-первых, я добавил значение int, которое связано с отношением между законопроектом и продуктами и удаленным публичным списком продуктов {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(); 

и новая форма показывает зрителю Crystal Report

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(); 

    } 

и вот мой кристалл отчетный проект

crystal report design

и это результат

the result