PDA

View Full Version : کند عمل کردن استیمول سافت در هنگام گزارش گیری



samiasoft
شنبه 14 بهمن 1396, 18:15 عصر
سلام دوستان

نرم افزار من به روش انتیتی فریمورک با دیتابیس sql ارتباط دارد.

زمانی که میخواستم از جدول دیتاگرید یک گزارش با استیمول سافت تهیه کنم متاسفانه حدود 1 دقیقه باید منتظر بمونم تا گزارش رو انجام بده.

واقعا چرا اینقدر زمان صرف میشه؟ درحالی که اطلاعات زیادی هم ندارم ! فقط 5 تا رکورد هست!

کوئری آنچنان سنگینی هم ندارم فقط میخواستم برحسب کدپرسنلی اطلاعات را در بازه تاریخی fromDate و untilDate جستجو کنم.

StiReport report = new StiReport();

string fromDate = persianFromDate.Text;
string untilDate = persianUntilDate.Text;


int personelID;
int.TryParse(searchidreport.Text, out personelID);


var query = database.Tble_Attendance.SqlQuery("select * from Tble_Attendance where PersonelID_FK=@p0 AND AttendanceDate>=@p1 AND AttendanceDate<=@p2", personelID, fromDate, untilDate).ToList();
grd_AttendanceReport.DataSource = query;



report.Load(Application.StartupPath + @"\report\Report_Attendance.mrt");
report.RegData("reportAttendance", query);



report.Compile();
report.Show();

به نظرتون مشکل از نوع کوئری نیست که var انتخاب کردم؟البته از نوع لیست هم نوشتم اما تغییری نکرد

List<Tble_Attendance> query = database.Tble_Attendance.SqlQuery("select * from Tble_Attendance where PersonelID_FK=@p0 AND AttendanceDate>=@p1 AND AttendanceDate<=@p2", personelID, fromDate, untilDate).ToList();

ایا ممکن است این مشکل مربوط به نسخه استیمول سافت باشه؟
من نسخه 2016 retail رو استفاده کردم

samiasoft
یک شنبه 15 بهمن 1396, 00:44 صبح
دوستان نظری نداشتید؟


من پروژه رو هم در لینک زیر اپلود کردم ممنون میشوم یه نگاهی کنید...حتما قبلش دیتابیس رو اتچ کنید

http://s9.picofile.com/file/8318470450/project_stimol.rar.html

Mahmoud.Afrad
یک شنبه 15 بهمن 1396, 05:18 صبح
در گزارش، DataSource1 را حذف و یک BusinessObject ایجاد کنید با ستونهای مورد نظر. در برنامه به جای RegData از RegBusinessObject برای ارسال داده ها به گزارش استفاده کنید.


کوئری را هم میتونید به صورت linq بنویسید.

رامین مرادی
یک شنبه 15 بهمن 1396, 08:09 صبح
در گزارش، DataSource1 را حذف و یک BusinessObject ایجاد کنید با ستونهای مورد نظر. در برنامه به جای RegData از RegBusinessObject برای ارسال داده ها به گزارش استفاده کنید.


کوئری را هم میتونید به صورت linq بنویسید.

من اکثرا از دیتاتیبل ها استفاده میکنم این روش که معرفی کردین چه فرقی داره ؟ نیاز به کد نویسی خاصی داره یا عین همونه؟

محمد آشتیانی
یک شنبه 15 بهمن 1396, 09:46 صبح
سلام
نکات رو آقای افراد فرمودند ، حالا اگر میخواید دقیقا همین کاری رو که انجام دادید ادامه بدید از این متد استفاده کنید (این رو بنده ننوشتم https://stackoverflow.com/questions/18100783/how-to-convert-a-list-into-data-table)


public static DataTable ToDataTable<T>(List<T> items)
{
DataTable dataTable = new DataTable(typeof(T).Name);


//Get all the properties
PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo prop in Props)
{
//Defining type of data column gives proper data table
var type = (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType);
//Setting column names as Property names
dataTable.Columns.Add(prop.Name, type);
}
foreach (T item in items)
{
var values = new object[Props.Length];
for (int i = 0; i < Props.Length; i++)
{
//inserting property values to datatable rows
values[i] = Props[i].GetValue(item, null);
}
dataTable.Rows.Add(values);
}
//put a breakpoint here and check datatable
return dataTable;
}



کدتون به این شکل تغییر میکنه

StiReport report = new StiReport();


string fromDate = persianFromDate.Text;
string untilDate = persianUntilDate.Text;


int personelID;
int.TryParse(searchidreport.Text, out personelID);


var query = database.Tble_Attendance.SqlQuery("select * from Tble_Attendance where AttendanceID=@p0 AND AttendanceDate>=@p1 AND AttendanceDate<=@p2", personelID, fromDate, untilDate).ToList();
dataGridView1.DataSource = query;


report.Load(Application.StartupPath + @"\Report_Attendance.mrt");
report.RegData("reportAttendance", ToDataTable(query));


report.Compile();
report.Show();

samiasoft
یک شنبه 15 بهمن 1396, 11:54 صبح
واقعا سپاسگزارم از شما عزیزان


در گزارش، DataSource1 را حذف و یک BusinessObject ایجاد کنید با ستونهای مورد نظر. در برنامه به جای RegData از RegBusinessObject برای ارسال داده ها به گزارش استفاده کنید.


کوئری را هم میتونید به صورت linq بنویسید.

فقط جناب افراد حال که توانستیم مشکل رو با BusinessObject حل کنیم ایا امکانش هست توضیحی بدید که چرا این مشکل کندی در اون حالت رخ میداد؟

تفاوت دیتاسورس و BusinessObject در چی هستش؟

ایا اینکه درحالت کلی میتوان اینطور گفت:

اگر در دیتابیس جدول هایمان با هم ارتباطی ندارند > RegData و datasource

ولی اگر در دیتابیس جدول هایمان با همدیگر ارتباط دارند برای سرعت بیشتر از BusinessObject و RegBusinessObject استفاده کنیم؟


ایا این فرضیه درسته ؟