PDA

View Full Version : سوال: نحوه ی استفاده چند جدول در گزارش



zayens
جمعه 18 تیر 1389, 12:41 عصر
من نیاز دارم که در کریستال ریپورت برای گزارش گیری از دو جدول استفاده کنم
(منظورم اینه که در قسمت Database Field دو تابع یا جدول یا... را وارد کنم)
قبلا در فرم های گزارشم وقتی از یک جدول استفاده میکردم از کدی مثل زیر
استفاده می کردم و جواب میداد و هیچ مشکلی هم ایجاد نمیشد:


privatevoid showUsedFoodsHAME()
{
CrystalUsedFoodsHAME c = newCrystalUsedFoodsHAME();
DBRESTORANSDataSetTableAdapters.USEDFOODSselectAll ReportTableAdapter u1 = new RESTORANS.DBRESTORANSDataSetTableAdapters.USEDFOOD SselectAllReportTableAdapter();
u1.FillBy(this.dbDataSetUFSAllReport.USEDFOODSsele ctAllReport);
c.SetDataSource((DataTable)dbDataSetUFSAllReport.U SEDFOODSselectAllReport);
c.SetParameterValue("@PRINTDATE", frmReport.dateNow);
crystalReportViewer1.ReportSource = c;
}

این کد کریستال ریپورت CrystalUsedFoodsHAME را فراخوانی می کند و سپس دیتاست
لازم را به آن می فرستد
همونطور که در کد بالا مشهود است من در کریستال از استورپرسیجر USEDFOODSselectAllReport استفاده کردم که کوئری زیر را اجرا میکند:


select FOODNAME,sum(FOODNUM) as FOODNUM from USEDFOODS group by FOODNAME

که البته این که چی اجرا میشود زیاد مهم نیست.
/
/
/سوال اینجاست که:
من در یکی از گزارشاتم نیاز به دو تا استورپرسیجر (دو تا تابع یا دو تا جدول) دارم(فرق نمیکنه)
من از کد زیر استفاده کردم اما پس از اجرا، هیچ داده ای در کریستال نمایش داده نمیشه
این کدیه که به نظرم رسید و کار هم نمیکنه:
اگه ممکنه کد را اصلاج کنید.



public frmGozareshFac()
{
InitializeComponent();
//
CrystalsodurFac c = newCrystalsodurFac();
DBRESTORANSDataSetTableAdapters.SelectOneFactorTab leAdapter a =
new RESTORANS.DBRESTORANSDataSetTableAdapters.SelectOn eFactorTableAdapter();
DBRESTORANSDataSetTableAdapters.SelectOneSETFACTOR TableAdapter b =
new RESTORANS.DBRESTORANSDataSetTableAdapters.SelectOn eSETFACTORTableAdapter();
a.FillBy(this.mydbDataSetOnefac.SelectOneFactor, frmFac.crystalFACTORID);
b.FillBy(mydbDataSetSETFAC.SelectOneSETFACTOR, frmFac.crystalFACTORID);
c.SetDataSource((DataTable)mydbDataSetOnefac.Selec tOneFactor);
c.SetDataSource((DataTable)mydbDataSetSETFAC.Selec tOneSETFACTOR);
c.SetParameterValue("@PRINTDATE", frmFac.dateNow);
crystalReportViewer1.ReportSource = c;
}

ممنون

zayens
یک شنبه 20 تیر 1389, 12:10 عصر
با سلام.. مشکله این کدی که شما برای واردکردن اطلاعات از دو جدول نوشتین اینه که
شما برای مثال دوبار دیتاسورس CrystalSodourFac رو مقداردهی کردین و این یعنی اینکه دومی overwrite
میشه.. من خودم واسه تست یه برنامه نوشتم و مثه شما عمل کردم اما با این تفاوت که در دستوراتی که
برای CrystalSodourFacدوبار دیتاسورس رو مقداردهی کردین،من یبار اینکارو کردم و بجای آدرس دادن
جدول، کل دیتاست رو بهش دادم ..
درضمن دیدم شما از دوتا دیتاست استفاده کردین و این لازم نیست،کافیه یبار یه دیتاست بسازین و کل
جداول رو در اون وارد کنین و کارتون راحت میشه.. درضمن در این مسئله هم همینطور..
من کامل نفهمیدم
همونطور که میدونید من گیراییم پایینه پس اگه میشه با کد نشون بدین.
منظورتون چیه که

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

zayens
دوشنبه 21 تیر 1389, 18:09 عصر
من یه برنامه گذاشتم که چطوری تو یه دیتاست چندتا جدول داشته باشیم و چطوری تو کریستال چندتا جدول رو پر کنیم اما باید بگم که نقص داره و اون اینه که وقتی همزمان چندتا جدول رو تو کریستال پر میکنی،اطلاعات دوبار نمایش داده میشه.. تو چندتا مطلب آموزشی کریستال هم نگاه کردم همشون از یه جدول استفاده میکنن..البته باید بگم خود منم نیاز به چندتا جدول تو کریستال نداشتم بخاطر همین اطلاعاتم در این مورد کمه.. درضمن من خودم در یه پروژه ای اینکارو واسه حل این مشکل کردم و این بود که ابتدا با یه دستور select از چندتا جدول اطلاعات رو استخراج و داخل گریدویو نمایش و بعدش وارد کریستال میکردم
یه سوال : جدول هاتون باید جدا تو کریستال نمایش داده بشه یا باهم از طریق یه ستون ارتباط دارن و باهم در یه سطر باید نمایش داده بشن ؟؟ (اگه جواب دومی هست اطلاع بدین میشه با دیتاست کاریش کرد)

بازم ممنون
در مورد سوالتون باید بگم که مورد دوم درسته
کوئری هر دوتا را برات میذارم:
اولی با نام SelectOneFactor

select *from ALLFACTORS where FACTORID=@FACTORID
و دومین کوئری با نام SelectOneSETFACTOR

select * from SETFACTOR where FACTORID=@FACTORID
همونطور که میبینید هر دو تا نیاز به یک پارامتر یکسان دارند به نام @FACTORID
در خود کریستال هم یه جدول دارم که باید با یکی از این کوئری ها پر بشه و بالای جدول هم
جزئیاتی مربوط به همون جدول است که با کوئری بعدی پر میشه
یه عکس ضمیمه کردم

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

zayens
دوشنبه 21 تیر 1389, 18:48 عصر
حجتی جون بازم ممنون
بالاخره با راهنمایی شما جواب را پیدا کردم
از کد زیر استفاده کردم و کارم راه افتاد


InitializeComponent();
//
CrystalsodurFac c = new CrystalsodurFac();
this.selectOneFactorTableAdapter.FillBy(this.dBRES TORANSDataSet.SelectOneFactor, frmFac.crystalFACTORID);
this.selectOneSETFACTORTableAdapter.FillBy(this.dB RESTORANSDataSet.SelectOneSETFACTOR, frmFac.crystalFACTORID);
c.SetDataSource(dBRESTORANSDataSet);
c.SetParameterValue("@PRINTDATE", frmFac.dateNow);
crystalReportViewer1.ReportSource = c;

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