PDA

View Full Version : سوال: گزارش به صورت پویا پیاده کنم | کاربر گزارش رو تایپ کنه...... (استراتژی می خوام)



samadblaj
یک شنبه 10 دی 1391, 11:57 صبح
سلام دوستان روز همگی بخیر

توی یه پروژه میخوام یه گزراش به این شکل طراحی کنم که کاربر کلمه مورد نظر رو توی یک text وارد کنه و برنامه گزارش مورد نظر رو فیلتر و نمایش بده...
چند تا جدول دارم باید فیلتر روی اطلاعات انجام بشه....

روشی که مد نظر خودم بود و تحلیل نشده است این بود که تمامی اطلاعات مثل "اطلاعات شخصی" اطلاعات شغلی" رو توی یک گرید بایند کنم و بعد کاربر کلمه مورد نظر رو روی اطلاعات فیلتر کنه و نمایش بده. آیا امکان پذیر هست؟

Mahmoud.Afrad
یک شنبه 10 دی 1391, 14:54 عصر
کدی که گرید را پر میکنید همراه نام فیلدها رو بزارید.

samadblaj
یک شنبه 10 دی 1391, 15:23 عصر
سلام ممنونم از پاسخت به این شکل پر میکنم :

testEntities db = new testEntities();


Join table1,table2,table3

dataGridView1.DataSource = db.Table1;

مثلا از جداول query میگیرم توی گرید به شکل زیر بایند میشه :

| امین | امینی | تهران | مذکر | 1360/05/12 | 23 (سال ) | 15 (امتیاز) | مهربان (خصیصه) | مجرد | بله (جمیل دارد) |

این یک نمونه هست اطلاعات توی پرانتز توضیحات است.

حالا راه مناسب برای انواع گزارش از این نوع روش که مورد نظرم هست چیه ؟

ممنون میشم راهنماییم کنید؟

Mahmoud.Afrad
یک شنبه 10 دی 1391, 21:21 عصر
برای اینکه مدام روی دیتابیس کوئری جدیدی اجرا نشه باید لیست اولیه را در ابتدا پر و بعدا فیلتر کنید.
برای این کار:
یک لیست قابل شمارش از آبجکت مورد نظر در سطح کلاس تعریف کنید(tbl نام جدول دیتابیس هست به جاش table1 بزارید).
IEnumerable<tbl> allRecords;
سپس در فرم لود این لیست را پر کنید(متد tolist لازمه). و بعد این لیست رو به گریدویو بایند کنید:

private void Form1_Load(object sender, EventArgs e)
{
using (Database1Entities2 context = new Database1Entities2())
{
allRecords = context.tbl.ToList();
dataGridView1.DataSource = allRecords;
}
}


سپس برای فیلتر کردن این لیست یک متد بنویسید و در اون یک لیست جدید(result) برای نتیجه تعریف کنید. و برحسب اینکه چه فیلدهایی پر شده فیلتر رو انجام بدید. این متد رو در هر رویدادی میتونید فراخوانی کنید:

private void filter()
{
IEnumerable<tbl> result = allRecords;

if (!string.IsNullOrEmpty(txtName.Text))
{
result = result.Where(item => item.name.StartsWith(txtName.Text));
}
if (!string.IsNullOrEmpty(txtLastName.Text))
{
result = result.Where(item => item.lastname.StartsWith(txtLastName.Text));
}
// ...

dataGridView1.DataSource = result.ToList();
}

samadblaj
یک شنبه 10 دی 1391, 21:56 عصر
ممنونم چقدر حرفه ای و کامل بود ببخشید شما اینو توی قالب پروژه نوشتید؟ لطفا اگه اینظوره برام پیوستش کنید چون مبتدیم... اگه نیست مشکلی نداری خودم روش کار میکنم و و به مشکل بر خوردم میگم...

IEnumerable<tbl> allRecords;
میشه لطف کنید این رو هم توضیح بدید کارش چیه ؟
و منظور از این چیه ؟


یک لیست قابل شمارش از آبجکت مورد نظر در سطح کلاس تعریف کنید.

Mahmoud.Afrad
دوشنبه 11 دی 1391, 00:40 صبح
ببینید اگر بخوام طبق کد خودتون بگم فقط کافیه به جای tbl نام جدول خودتون یعنی table1 و به جای name و lastname هم فیلدهای جدول خودتون رو بزارید. فیلدهای دیگر رو هم به همون صورت فیلتر کنید(منظورم if ها هستش).

نمونه هم توی امضام هست "جستجوی پیشرفته در Entity FrameWork". توی این مثال متد filterDgvAll به درد شما میخوره(بخش searchOnDataBase چون کوئری مجدد روی دیتابیس میزنه مناسب کار شما نیست).

samadblaj
سه شنبه 12 دی 1391, 16:39 عصر
ببینید اگر بخوام طبق کد خودتون بگم فقط کافیه به جای tbl نام جدول خودتون یعنی table1 و به جای name و lastname هم فیلدهای جدول خودتون رو بزارید. فیلدهای دیگر رو هم به همون صورت فیلتر کنید(منظورم if ها هستش).

نمونه هم توی امضام هست "جستجوی پیشرفته در Entity FrameWork". توی این مثال متد filterDgvAll به درد شما میخوره(بخش searchOnDataBase چون کوئری مجدد روی دیتابیس میزنه مناسب کار شما نیست).

دوباره تشکر میکنم بابت کدهاتون ولی ولی استفاده از کد شما نیاز هست برای هر گزارش یک تابع نوشت که باید فیلد ها رو تغییر داد....

این روش گزارش مد نظر من است : تمامی اطلاعات رو از جدول ها بایند کنم به یک گرید بعد عمل جستجو روی گرید و ایجاد گزارش...

با تشکر

Mahmoud.Afrad
سه شنبه 12 دی 1391, 17:35 عصر
من منظورم این بود که میشه دیتاسورس گریدویو رو فیلتر کرد(دیتاتیبل که راحته. در مورد EF هم مثال زدم). منظور شما چیه؟
اینکه میگید از همه جدول ها ، منظورتون join کردن هست؟ خوب در این صورت هم باز فرقی نمیکنه؟ مشخص کنید چی مد نظرتون هست؟

samadblaj
سه شنبه 12 دی 1391, 18:14 عصر
سلام ببخشید ؛

ببینید فرض میکنیم دو تا جدول داریم...

جدول اول :

|شماره|نام|نام خانوادگی|تاریخ تولد|

================================

جدول دوم :
|شماره| کتاب| امتیاز|

ما با join مثلا اطلاعات تمامی کاربر در همه ی جداول load کنیم به شکل زیر :

| 1 | علی | امیری | 1390/06/12 | فیزیک | 1390/06| 500 |

یه text تنها هم برای فیلتر.

و یک دکمه هم برای نمایش دانش آموز/دانش آموزان برای گزارش....

حالا به غیر از موارد خاص میشه به این شکل عمل کرد؟

Mahmoud.Afrad
چهارشنبه 13 دی 1391, 12:36 عصر
توصیه میکنم join را در دیتابیس به صورت یک view ذخیره کنید. بعد میتونید مدل EF را بروزرسانی کنید تا آبجکت view هم به مدل اضافه بشه. بعد خیلی راحت طبق مثال بالا عمل کنید(به جای نام تیبل نام view رو قرار بدید). یعنی به اینصورت که لیستی از نوع IEnumerable از شئ view میسازید و همه اطلاعات رو میریزید توش. بعد هم برای فیلتر کردن کافیه این لیست رو فیلتر کنید و در لیست دیگری بریزید و اونو به گریدویو بدید.
انجام بدید هر کجاش مشکل داشتید بپرسید.

samadblaj
چهارشنبه 13 دی 1391, 14:25 عصر
توصیه میکنم join را در دیتابیس به صورت یک view ذخیره کنید. بعد میتونید مدل EF را بروزرسانی کنید تا آبجکت view هم به مدل اضافه بشه. بعد خیلی راحت طبق مثال بالا عمل کنید(به جای نام تیبل نام view رو قرار بدید). یعنی به اینصورت که لیستی از نوع IEnumerable از شئ view میسازید و همه اطلاعات رو میریزید توش. بعد هم برای فیلتر کردن کافیه این لیست رو فیلتر کنید و در لیست دیگری بریزید و اونو به گریدویو بدید.
انجام بدید هر کجاش مشکل داشتید بپرسید.

نه روش ساده و خوبی بود راحت بدون هیچ کدی تونسم به سادگی join رو از طریق view انجام بدم.... اینجور سرعتشم به خاطر اینکه از طرف sql هست بالا میره یا بهتره از این روش view های گزارش رو کامل کنم بعد view رو به گزارش بفرستم....

testEntities db = new testEntities();
dataGridView1.DataSource = db.View1;

مرسی از لطفت واقعا ممنونم