2

以前はクリスタルレポートを使用していませんでした。しかし、プロジェクトでは、印刷の問題のために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 クリスタル レポートをインストールしました。

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

新しいフォームには Crystal Report Viewer が表示されます

    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 に答える