以前はクリスタルレポートを使用していませんでした。しかし、プロジェクトでは、印刷の問題のためにfastreportの代わりにそれを使用する必要があります..私は何時間も問題を解決しようとしましたが、まだ解決策を見つけていません..
さて、Crystal Report で使用するクラスが 2 つあります。請求書を作成したい。
データベースからいくつかのデータを整理し、これらのクラスに配置しました。
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 クラスには 1 つの請求書クラス (レポート情報) と製品 (レポート製品) のリストがあります。
ヘッダーの値 (請求書番号、日付など) と詳細領域の値 (製品情報) になるレポートを作成したいと考えています。
ここで私は1つの請求書に対してそれを行いました(また、請求書をレポートビューアに入れる方法も知りません)
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); で「ソース オブジェクトが無効です」という例外がスローされます。
不公平に見えることはわかっていますが、クリスタル レポートに 2 つのテーブルを実装する方法がわかりません。両方のクラスをクリスタルレポに追加すると、次のようになります
これを1つのクラス用に作成しましたが、問題ありません。しかし、このチュートリアルでは、複数のデータ オブジェクトについては触れていません。
http://msdn.microsoft.com/en-us/library/ms227595(v=vs.80).aspx
ps: vs 2012 と fw 4.0 を使用し、sap クリスタル レポートをインストールしました。