PDA

View Full Version : حرفه ای: گزارشگیری master detail در fastreport



arshad89
سه شنبه 07 مرداد 1393, 18:26 عصر
سلام
توی برنامه یه جدول اشخاص دارم و 10 تا جدول که مشخصات آموزشی، سوابق بیماری و ............ نگهداری میشوند که همه به آی دی اشخاص موجود در جدول person ارتباط دارند. حالا میخوام گزارش تهیه کنم که هر شخصی با سوابق بیماری و ..... در یک گزارش چاپ بشه، میخوام دوستان راهنمایی کنند. برای گزارش از جدول به صورت تکی مشکل ندارم، مشکل با چگونگی اتصال سوابق بیماری و ... مرتبط هر شخص هست. نوع query که باید بفرستم سمت fastreport چی باید باشه؟؟ لطفا اساتید راهنمایی بفرمایید. متشکرم

من یه توضیحی بدم قبل از اینکه دوستان پاسخ بدند، من میتونم الان جدوال master detail رو هم نشون بدم ولی اشتباه نمایش میده یعنی مثلا برای تک تک آدم ها تمام جدول سوابق بیماری رو میاره ولی من میخوام سوابق بیماری شخص 1 رو برا خودش بیاره و سوابق شخص 50 رو برای خودش نمایش بده نه اینکه کل جدول detail رو برای همه اشخاص نمایش بده، دوستان لطفا راهنمایی کنید مهمه.

Mahmoud.Afrad
سه شنبه 07 مرداد 1393, 20:11 عصر
باید برای کوئری هات شرط بزاری تا اطلاعات شخص مورد نظرت رو دریافت کنی. کدت رو بزار.

khokhan
سه شنبه 07 مرداد 1393, 23:12 عصر
سلام
توی برنامه یه جدول اشخاص دارم و 10 تا جدول که مشخصات آموزشی، سوابق بیماری و ............ نگهداری میشوند که همه به آی دی اشخاص موجود در جدول person ارتباط دارند. حالا میخوام گزارش تهیه کنم که هر شخصی با سوابق بیماری و ..... در یک گزارش چاپ بشه، میخوام دوستان راهنمایی کنند. برای گزارش از جدول به صورت تکی مشکل ندارم، مشکل با چگونگی اتصال سوابق بیماری و ... مرتبط هر شخص هست. نوع query که باید بفرستم سمت fastreport چی باید باشه؟؟ لطفا اساتید راهنمایی بفرمایید. متشکرم

من یه توضیحی بدم قبل از اینکه دوستان پاسخ بدند، من میتونم الان جدوال master detail رو هم نشون بدم ولی اشتباه نمایش میده یعنی مثلا برای تک تک آدم ها تمام جدول سوابق بیماری رو میاره ولی من میخوام سوابق بیماری شخص 1 رو برا خودش بیاره و سوابق شخص 50 رو برای خودش نمایش بده نه اینکه کل جدول detail رو برای همه اشخاص نمایش بده، دوستان لطفا راهنمایی کنید مهمه.
ابتدا به تعداد جدولهای ذینفع کوئری بزن و نتیجه همه کوئری ها رو بریز داخل یه دیتاست
بعد از اینکه اطلاعات رو درون یه دیتاست واحد قرار دادی بر اساس فیلد مشترک میان جداول یک رابطه ایجاد کن و دیتا تیبل ها رو به هم رط بده
در این حال اگه دیتاست حاصل رو به فست ریپورت ارجاع بدی خواهی دید که همون ارتباط در گزارش نیز برقرار شده و خیلی آسون می تونی فیلدها رو توی گزارش قرار بدی و
رابطه پدر و فرزندی رو برقرار کنی

این هم کدی که می تونی به تعداد لازم دیتا تیبل به گزارش پاس بدی البته بعد از اینکه رابطه میانشون برقرار شد



report.GetDataSource("Country").Enabled = true;
report.GetDataSource("State").Enabled = true;





121711

arshad89
چهارشنبه 08 مرداد 1393, 18:18 عصر
ممنون که پاسخ دادید.
اگه میشه آقای khokhan نمونه کد کامل تری بذارید ممنون میشم. من کدی که الان استفاده میکنم در واقع دو تا query میزنم و به گزارش پاس میدم ولی قبلش گزارش رو ایجاد کردم و به یه کانکشن مرتبط کردمش و تو برنامه با کوئری خاص خودم فیلترش میکنم ولی از روش شما سر در نیاوردم. با روش من فقط میشه اطلاعات یه شخص خاص رو نمایش داد نه همه افراد رو.
اگر کد کامل تری بذارید یا یه نمونه بذارید ممنون میشم.
بازم از توجهتون ممنون

arshad89
پنج شنبه 09 مرداد 1393, 00:02 صبح
منتظر راهنمایی بیشتر شما هستم. ممنون

khokhan
پنج شنبه 09 مرداد 1393, 01:20 صبح
منتظر راهنمایی بیشتر شما هستم. ممنون
فرض رو بر این می گیریم که شما دو تا جدول توی بانک دارین یکی جدول کشور ها و دیگری جدول استانها .................. !!!! فیلد کد کشور، کلیداصلی جدول کشورها و در جدول استانها کلید خارجی است

121758

با این اوصاف بدون اینکه اقدام به ساخت فایل گزارش کنین در پروژه تون با دیتابیس ارتباط برقرار می کنین و مقادیر این دوجدول رو واکشی می کنین در محله بعد، همچنانکه قبلا نیز گفتیم

به تعداد جداول دیتاتیبل ایجاد کرده وبر اساس فیلد مشترک میان دوجدول یک ارتباط میانشان برقرار می کنین :


private void CreateDataSet2() {
FDataSet = new DataSet();
_connect.connString();
SqlDataAdapter adapter = new SqlDataAdapter(@"SELECT * FROM Country;
SELECT * FROM State ", _connect.conConnect);


adapter.TableMappings.Add("Table", "Country");
adapter.TableMappings.Add("Table1", "State");
adapter.Fill(FDataSet);
FDataSet.Relations.Add("Country_State", FDataSet.Tables["Country"].Columns["CountryCode"],
FDataSet.Tables["State"].Columns["CountryCode"]);




}

_._. * توجه داشته باشید که تا این مرحله ما هیچ فایل گزارشی نساختیم

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

بهتر است یه باتن مخصوص برای ورود به قسمت دیزاین قرار بدین و طراحی های لازم رو انجام بدین و فایل گزارش رو در پوشه اصلی برنامه ذخیره کنین :


private void button1_Click(object sender, EventArgs e) {
Report report = new Report();
report.RegisterData(FDataSet);
report.GetDataSource("Country").Enabled = true;
report.GetDataSource("State").Enabled = true;
report.Design();
report.Dispose();
}

این دکمه هیچ گزارشی براتون نمایش نمی ده و تنها شما رو به بخش طراحی گزارش هدایت می کنه

بخش طراحی :

در بخش طراحی گزارش ما درقسمت دیکشنری می تونیم دیتاتیبل هایی رو که فرستادیم رو مشاهده کنیم اما ارتباط میان آنها در حالت عادی نمایش داده نمی شه

و برای نمایان شدن اونها بایستی از منوی بالایی محیط گزارش و از گزینه " داده " ، روی عبارت "انتخاب داده های گزارش " کلیک کنین تا ارتباط میان جداول هم لحاظ گردند

121757

پس از این کار شما می توانید فیلدهای لازم برای گزارشتون رو از سمت راست پنجره کشده و روی گزارش رها کنین و بر اساس صلاحدید بچینن

ودر خاتمه گزارش ساخته شده رو در پوشه دیباگ پروژه ذخیره کنین و دفعات بعد که خواستین برای طراحی مجدده وارد همین گزارش شوید می تونین از این دکمه استفاده کنین

و یا اینکه بعد از اتمام کار دکمه طراحی رو حذف کنین

بخش نمایش گزارش :

این بخش نیز دستوراتش همانند بخش طراحی است با این تفاوت که به جای report.Design از گزینه report.Show استفاده می کنین

وهمچنین می توانید تنها یک دکمه قرار بدین و این دو قسمت رو باهمدیگر تلفیق کنین :


private void button2_Click(object sender, EventArgs e) {
Report report = new Report();
report.Load(@"" + Application.StartupPath + "/report.frx");
report.RegisterData(FDataSet);
report.Show();
report.Dispose();
}