PDA

View Full Version : آموزش: گزارش گیری از لیستی از آبجکتها در کریستال ریپورت (Entity Framework و LinqToSql و هر لیستی از اشیاء)



Mahmoud.Afrad
چهارشنبه 30 مرداد 1392, 12:32 عصر
سلام
در این تاپیک به گزارش گیری در کریستال ریپوتز که دیتاسورس آن لیستی از اشیاء است می پردازیم.


فرض کنید کلاسی به صورت زیر داریم

class ReportModel
{
public string PersonName { get; set; }
public string GroupName { get; set; }
}

میخواهیم از لیستی از این کلاس در کریستال ریپوتز گزارش تهیه کنیم.

1- از طریق منوی Project>>Add New Item یک گزارش کریستال ریپوتز(.rpt) به پروژه اضافه کنید.

2- در پنجره ظاهر شده نوع گزارش را انتخاب و next را انتخاب کنید.
109434

3- در پنجره جدید باید دیتاسورس را تعیین کنید. از Project Data ، زیر شاخه .Net Objects را گسترش دهید. حال از گره های آن ، کلاس مورد نظر را انتخاب کرده و اضافه کنید و با next به مرحله بعد بروید.
109435

4- حال باید پراپرتی هایی که میخواهید در گزارش باشند را انتخاب و اضافه کنید.
109436

5- مراحل بعدی طبق خواست شماست و از آن میگذریم و در آخر finish میکنیم.

6- در فرمی که میخواهیم گزارش نمایش داده شود(FrmReport) یک CrystalReportViewer اضافه کرده در همین فرم یک متد با سطح دسترسی مناسب ایجاد میکنیم. پارامتر ورودی این متد از نوع گزارشی است که قصد نمایش در این فرم را داریم.

internal void InitializeReportViewer(CrystalReport1 report)
{
this.crystalReportViewer1.ReportSource = report;
}



7- حالا در جایی که میخواهیم فرم گزارش را ایجاد کنیم باید ابتدا دیتاسورس که لیستی قابل شمارش از کلاس ReportModel است را داشته باشیم. فرقی نمیکنید این لیست چگونه تهیه میشود. میتوان در LinqToSql و یا EntityFramework دیتا را دریافت کرده و در سلکت، شئ جدیدی از کلاس ReportModel ایجاد و مقداردهی کنیم.

سه جدول زیر را در نظر بگیرید:
Person --> Id , Name
Group --> Id , Name
PersonInGroup --> Id , PersonId , GroupId
که در جدول PersonInGroup عضویت هر شخص در گروه های مختلف مشخص است. حال کوئری روی PersonInGroup مینویسیم که نام شخص و گروه هایی که در آن عضویت دارد را بدست آورد. هنگام سلکت، شئ جدیدی از ReportModel ایجاد میکنیم و پراپرتی های آن را مقداردهی میکنیم. (مدل توسط LinqToSql ساخته شده)

DataClasses1DataContext db = new DataClasses1DataContext();

var data =
(
from pg in db.PersonInGroups
select new ReportModel
{
PersonName = pg.Person.Name,
GroupName = pg.Group.Name
})
.Union(
from p in db.Persons
where !p.PersonInGroups.Any()
select new ReportModel
{
PersonName = p.Name,
GroupName = "------------------"
});


سپس یک شئ از گزارش کریستال ریپورتز ایجاد کرده و توسط متد SetDataSource لیست data را به آن پاس میدهیم.

CrystalReport1 report = new CrystalReport1();
report.SetDataSource(data);


در انتها فرم گزارش را ایجاد کرده و شئ گزارش را توسط متد InitializeReportViewer در reportviewer ست میکنیم و بعد فرم را نمایش میدهیم.

FrmReport frm = new FrmReport();
frm.InitializeReportViewer(report);
frm.ShowDialog();






نکته اینکه اگر خصوصیت Nullable تمام ستون های جدول مورد نظر false باشد و در سلکت نیازی به new کردن نیاشد، نیازی به کلاس واسطه ReportModel نیست و در مرحله 3 میتوان کلاسی که از روی جدول ایجاد شده است را به عنوان دیتاسورس انتخاب کنید. در این حالت نباید جلوی select شئ جدیدی new کنید.


نمونه پروژه را میتوانید دانلود کنید. (دات نت 3.5 و کریستال ریپورتز 13 و LinqToSql)