چگونگی گزارشگیری از Business Objects مانند List توسط StimulSoft
نویسنده: وریا کریمی
تاریخ: ۱۳۹۳/۰۳/۱۴ ۹:۱۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
میخواهیم از یک لیست در گزارش خود استفاده کنیم؛ بطور مثال وقتی در LINQ از دستور ToList استفاده میکنیم و میخواهیم آنرا بصورت مستقیم به Stimul بفرستیم. فرض بر این است که شما DLLهای Stimul را به پروژه اضافه کرده اید و آماده گزارشگیری هستید.
مثلا مدلی در Entity FrameWork با نام base_CenterType
public class base_CenterType
{
public int ID { get; set; }
public string Title { get; set; }
public string Dsc { get; set; }
}
و متدی بصورت ذیل:
public IList<base_CenterType> GetAll()
{
return _base_CenterType.ToList();
} طراحی گزارش برای این لیست به این صورت است:
1- اضافه کردن StiWebReport به فرم به نام StiWebReport1
2- با کلیک بر روی فلش سمت راست و بالای StiWebReport1 و انتخاب Design Report، وارد قسمت طراحی میشویم:
3- با راست کلیک بر روی Business Object و انتخاب New Business Object پنجره مربوطه باز میشود:
4- بعد از زدن OK پنجره زیر باز خواهد شد که باید در کادر Name نام Business Object را انتخاب کنیم که برای خوانایی بهتر است همان نام کلاس را برای آن انتخاب کنیم. چون Category نداریم پس باید کادر آن خالی بماند.
در قسمت Columns باید ستونهای هم نام و هم نوع با خواص کلاس base_CenterType را ایجاد کنیم.
و نهایتا Business Objectی به نام base_CenterType با سه ستون ایجاد خواهد شد.
حال میتوانید ستونهای مورد نظر را در گزارش بکار ببرید.
با فرض اینکه گزارش را طراحی کرده و آنرا در ریشه درایو C ذخیره کردهاید، از قطعه کد زیر برای ارسال لیست به گزارش و نمایش آن استفاده میکنیم.
StiReport mainreport = new StiReport();
mainreport.RegBusinessObject("base_CenterType", base_CenterTypeService.GetAll());
mainreport.Load("C:\\StiWebReport2.mrt");
mainreport.Show(); stiReportMain.Dictionary.Report.BusinessObjectsStore.Clear();
reportViewer.Report.BusinessObjectsStore.Clear();
stiReportMain.RegBusinessObject("MyCategory", "documents", list);
stiReportMain.Design(); stiReportMain.Dictionary.Report.BusinessObjectsStore.Clear();
reportViewer.Report.BusinessObjectsStore.Clear();
stiReportMain.RegBusinessObject("MyCategory", "documents", list);
stiReportMain.Dictionary.SynchronizeBusinessObjects();
stiReportMain.Compile();
stiReportMain.RenderWithWpf(true); //Or Render(); StiReport report = new StiReport();
var _context = new DBTestContext();
var model = _context.Books.ToList();
report.RegBusinessObject("Books", model);
report.Dictionary.SynchronizeBusinessObjects();
report.Dictionary.Synchronize();
report.DesignWithWpf(); انعطاف stimul بسیار بالاست
Stimulsoft.Report.StiReport stiReport = new Stimulsoft.Report.StiReport();
stiReport.Load("Reports//YourReportName.mrt"); stiReport.RegBusinessObject("Name1", List1);
stiReport.RegBusinessObject("Name2", List2);
stiReport.RegBusinessObject("Name3", List3); DataSet ds = new DataSet(); ds.Tables.Add(YourDataTable); stiReport.RegData(ds);
stiReport.Dictionary.Variables["Today"].Value = DateTime.Now.ToShortDateString();
stiReport.Design();
stiReport.Compile(); stiReport.Render(); stiViewer.Report = stiReport; stiViewer.Show();
Could not load file or assembly 'UsingBusinessObjects.dll' or one of its dependencies. The system cannot find the file specified.
سپس با استفاده از پنلهای تو در تو، این Business Objectها یا جداول را در کنار هم قرار میدهیم.
فقط دقت کنید که گزینههای Can Grow و Grow To Height فعال باشند تا در صورت وجود اطلاعات بیشتر در جدوال، تمام اطلاعات را نشان دهد.
در نهایت جداول یا business objectها را در پنلهای مربوطه قرار میدهیم.
موفق و موید باشید
هر بیزینس آبجکت داخلی رو بین یک GroupHeader و GroupFooter قرار دادم. من این بیزینس آبجکتهای داخلی رو با درگ کردن درون محیط دیزاین قرار دادم. مشکلی که وجود داره اینه که وقتی خروجی گزارش توی برنامه تکراری هست. یعنی اینکه اطلاعات بیزینس آبجکتهای LanguageCourses و... چند بار توی خروجی تکرار میشه. مشکل هم از پاس دادن اطلاعات توی اکشن نیست. اونجا اطلاعات درست پاس داده میشه. و جالب اینجاست که مثلا اگر من فقط دوتا بیزینس آبجکت LanguageCourses و Education رو توی گزارش بذارم اطلاعات این دوتا، دوبار تکرار میشه. اگه یه بیزینس آبجکت دیگه (مثلا TrainingCourses) رو هم بیارم تو گزارش، اطلاعات هر کدوم از این سه تا، سه بار تکرار میشه!
چند روز همین مشکل منو درگیر کرده و هنوز هم به نتیجه ای نرسیدم.
ممنون میشم دوستان راهنمایی کنند.
فایل گزارش: Report-9b7bd75b5286457a96f25f7ed37e45b6.mrt
public class Book
{
public string Title { get; set; }
public int Id { get; set; }
public Author Author { get; set; }
public Publisher Publisher { get; set; }
public IList<Book> GetBooks()
{
var books = new List<Book>();
for (int i = 0; i < 10; i++)
{
var book = new Book()
{
Id = i,
Title = $"Title {i}",
Author = new Author()
{
FirstName = $"Author {i} First Name",
LastName = $"Author {i} Last Name",
Person = new Person()
{
Type = $"Type {i}",
Value = $"Value {i}"
}
},
Publisher = new Report.Publisher()
{
Name = $"Publiser {i}"
}
};
books.Add(book);
}
return books;
}
}
public class Author
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Person Person { get; set; }
}
public class Person
{
public string Type { get; set; }
public string Value { get; set; }
}
public class Publisher
{
public string Name { get; set; }
}
و صفحه محصولات:
try
{
var mainReport = new StiReport();
var details = new List<Details>();
foreach (var item in Items)
{
details.Add(new Details
{
CarName = item.CarName,
});
}
mainReport.Load(CurrentDirectory() + @"\Rp.dll");
mainReport.RegBusinessObject("Print", details);
mainReport.Show();
}
catch (Exception ex)
{
MessageUtility.ErrorAlert(ex.GetOriginalException().Message);
} mainReport.Pages[0].Enabled = false; mainReport.Pages["PageName"].Enabled = false;
var mrtName = "";
object businessObject = new object();
if (cusomerReportCondition)
{
mrtName = "CustomersReport.mrt";
businessObject = getCustomerReportData();
}
else if (productsReportCondition)
{
mrtName = "ProductsReport.mrt";
businessObject = getProductsReportData();
}
//else if ...
mainReport.Load(mrtName);
mainReport.RegBusinessObject("businessObjectName", businessObject); 
Unable to load one or more requested types. Retrieve the LoaderExceptions property for more information.
Unable to load one or more of the requested types: Could not load file or assembly 'System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
var report = new StiReport(); report.Design();


namespace Models;
public class Order
{
public int OrderId { get; set; }
public string CustomerName { get; set; }
public List<OrderItem> Items { get; set; } = new();
}
public class OrderItem
{
public int Quantity { get; set; }
public Product Product { get; set; } = new();
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}var report = new StiReport();
report.RegBusinessObject("Model", new Order());
report.Dictionary.SynchronizeBusinessObjects(6); // عمق 6
report.Design();