ورود

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



firoozi90
دوشنبه 23 مرداد 1391, 14:44 عصر
سلام دوستان
من برای اینکه بخوام از یک جدولم با کریستال گزارش بگیرم از کد زیر استفاده می کردم.
حالا اگر بخوام همین کدو طوری تغییر بدم که بتونم از چندتا جدول در یک صفحه گزارش تهیه کنم باید چیکار کنم.
در واقع این دستور شرطی اس کیو ال که اینجا نوشتم برای همه ی جدول هام هم باید بنویسم اما چطوری؟


objSqlConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\SRVCARD.mdf;Integrated Security=True;User Instance=True");

newDataTable = new DataTable();
newDataTable = Select("SELECT * FROM STUD WHERE idstudent='" + textBox3.Text.Trim() + "'");

DataSet1 newDS = new DataSet1();

CrystalReport2 newCryFactor = new CrystalReport2();
newCryFactor.SetDataSource(newDataTable);
crystalReportViewer1.ReportSource = newCryFactor;

veniz2008
دوشنبه 23 مرداد 1391, 17:52 عصر
سلام. برای گزارش گیری از چند جدول باید از join استفاده کنی. یه stored procedure برای این منظور بسازید و یک دیتاست اضافه کنید و sp خودتون رو بهش معرفی کنید. بقیه مراحل مثل همون تک جدولی هستش.
موفق باشید.

firoozi90
دوشنبه 23 مرداد 1391, 22:38 عصر
سلام. برای گزارش گیری از چند جدول باید از join استفاده کنی. یه stored procedure برای این منظور بسازید و یک دیتاست اضافه کنید و sp خودتون رو بهش معرفی کنید. بقیه مراحل مثل همون تک جدولی هستش.
موفق باشید.
خیلی ممنون از توجهت
میشه یه سورسی چیزی در این رابطه واسم بزارید که متوجه بشم

mousa1992
سه شنبه 24 مرداد 1391, 01:26 صبح
یه view بساز و تمام فیلد هایی رو که نیاز داری بریز داخلش از هر جدولی میتونی انتخاب کنی (البته رابطه باید باشه بین جدول ها ) و از این view مانند یک جدول استفاده کن

ali_habibi1384
سه شنبه 24 مرداد 1391, 08:00 صبح
در واقع این دستور شرطی اس کیو ال که اینجا نوشتم برای همه ی جدول هام هم باید بنویسم اما چطوری؟
به دليل بالا اگر فيلدهاي جدولهاي متفاوت هستند براي هر جدول بايد يك گزارش بسازيد

firoozi90
سه شنبه 24 مرداد 1391, 10:46 صبح
یه view بساز و تمام فیلد هایی رو که نیاز داری بریز داخلش از هر جدولی میتونی انتخاب کنی (البته رابطه باید باشه بین جدول ها ) و از این view مانند یک جدول استفاده کن
چرا رابطه؟اگر رابطه نباشه نمیشه؟
در این صورت دستور شرطی اس کیو ال من چی میشه؟باید چندتا شرط داشته باشه مثلا اگر تکست باکس اولی برابر مقدار فیلد اول و تکست باکس دوم برابر مقدار فیلد دوم و الی آخر.
در واقع من 16 جدول دارم که از هر جدول 4 فیلدش باید در یک گزارش باشه

firoozi90
سه شنبه 24 مرداد 1391, 10:48 صبح
به دليل بالا اگر فيلدهاي جدولهاي متفاوت هستند براي هر جدول بايد يك گزارش بسازيد
خب من می خوام یک گزارش باشه
16 جدول دارم و از هر جدول 4 فیلدش نیاز دارم که توی گزارش باشه

sobijoon
سه شنبه 24 مرداد 1391, 11:15 صبح
با سلام
برو تو دیتا بیس یه ویو بساز و هر فیلدی رو که میخوای ازهر جدولی انتخاب کن(اتفاقا sql ویزارد هم برای ساخت ویو داره) بعد تو دستور با لات فقط کافیه اسم ویویی که تو دیتا بیس ساختی رو بیاری.
موفق باشی

ali_habibi1384
سه شنبه 24 مرداد 1391, 11:26 صبح
خب من می خوام یک گزارش باشه
16 جدول دارم و از هر جدول 4 فیلدش نیاز دارم که توی گزارش باشه
اين چهار فيلد همه با يك نام در ديتابيس مشخص شده؟يا همه باهم فرق دارن؟

firoozi90
سه شنبه 24 مرداد 1391, 11:48 صبح
با سلام
برو تو دیتا بیس یه ویو بساز و هر فیلدی رو که میخوای ازهر جدولی انتخاب کن(اتفاقا sql ویزارد هم برای ساخت ویو داره) بعد تو دستور با لات فقط کافیه اسم ویویی که تو دیتا بیس ساختی رو بیاری.
موفق باشی

تا اینجا درست اما شرطی که می نویسم چطور باید باشه.شما منظور من متوجه نشدی. پست شماره 7 رو مطالعه کن

mousa1992
سه شنبه 24 مرداد 1391, 23:48 عصر
"SELECT dbo.History.Number, dbo.History.Username, dbo.Users.fname, dbo.Users.lname, dbo.History.PDate, dbo.History.Time, dbo.History.UseTime, dbo.History.Price, dbo.History.ID, dbo.History.Printnumber, dbo.History.Scannumber FROM dbo.History INNER JOIN dbo.Users ON dbo.History.Username = dbo.Users.username WHERE dbo.History.Username=N'" + txtuserpanelshowbyuser.Text + "'"


این یه نمونه ست که برای تهیه ی گزارش از دو جدول که بین اونا رابطه هست
در مورد جدول هاتون واضح تر توضیح بدید دوستان بتونن کمک کنن

firoozi90
چهارشنبه 25 مرداد 1391, 10:56 صبح
"SELECT dbo.History.Number, dbo.History.Username, dbo.Users.fname, dbo.Users.lname, dbo.History.PDate, dbo.History.Time, dbo.History.UseTime, dbo.History.Price, dbo.History.ID, dbo.History.Printnumber, dbo.History.Scannumber FROM dbo.History INNER JOIN dbo.Users ON dbo.History.Username = dbo.Users.username WHERE dbo.History.Username=N'" + txtuserpanelshowbyuser.Text + "'"


این یه نمونه ست که برای تهیه ی گزارش از دو جدول که بین اونا رابطه هست
در مورد جدول هاتون واضح تر توضیح بدید دوستان بتونن کمک کنن

من 16 چدول دارم که هیچ ارتباطی با هم ندارند.
می خوام مقادیر فیلد name هر جدولو توی کمبو باکس ست کنم و در این صورت 16 کمبو باکس خواهم داشت که وقتی آیتم های اونا رو انتخاب می کنم(مقدار فیلد name جدول) خود اون و به همره سه فیلد از اون جدول توی یک گزارش نشون داده بشه.
در این صورت طبق کدی که شما زحمتش برام کشیدی باید 16 تا شرط برابری مقادیر کمبوباکس ها با همتای اونا توی جدول هم باشه.
حالا میخوام بدونم این کار چطور عملی میشه
امیدوارم منظورمو متوجه شده باشید

veniz2008
چهارشنبه 25 مرداد 1391, 11:12 صبح
گذاشتن 16 شرط برای یک کوئری دور از ذهن به نظر میاد!، آیا تمام کمبوباکس ها در خروجی گزارش شما دخیل هستن؟،یه کم بیشتر توضیح بدید که میخواید گزارشتون به چه صورت باشه.

firoozi90
چهارشنبه 25 مرداد 1391, 11:50 صبح
گذاشتن 16 شرط برای یک کوئری دور از ذهن به نظر میاد!، آیا تمام کمبوباکس ها در خروجی گزارش شما دخیل هستن؟،یه کم بیشتر توضیح بدید که میخواید گزارشتون به چه صورت باشه.

16 جدول دارم که از هر جدولش باید 4 فیلدش توی گزارش گیری بیاد.یعنی 4*16 فیلد توی گزارشم نیاز دارم.
شرط کوئری میخوام بر اساس مقادیر کمبو باکس هام باشه (که از جدول ست شده) . پس نیاز به 16 کمبوباکس دارم .
در اینصورت باید 16 شرط توی کوئری بنویسم که اگر مثلا combobox1 برابر فیلد MBname و combobox2 برابر فیلد cpuname و ... باشه در این صورت گزارشم گرفته بشه.
اگه گنگ توضیح میدم دوستان ببخشید.این آخرین توانم بود

zaeimh90
چهارشنبه 25 مرداد 1391, 18:25 عصر
سلام.کافیه از subreport استفاده کنی.یک گزارش بساز از یک سری اطلاعاتی که میخوای.مثلا اگر یک جدول اصلی داری و 3 جدول فرعی باید 4 تا گزارش مجزا بسازی.
در قسمت گزراش اصلیت اون گزارش فرعی هارو قرار بدی فقط حواست باشه تو قسمت header page & header report & footer Page & footer report باشه چون در قسمت Details تکرار میشه و بهم میریزه.اگر بازم خواستی بگو برات نمونه بزارم ولی فکر کنم کامل گفتم.
موفق باشی.

firoozi90
چهارشنبه 25 مرداد 1391, 21:07 عصر
سلام.کافیه از subreport استفاده کنی.یک گزارش بساز از یک سری اطلاعاتی که میخوای.مثلا اگر یک جدول اصلی داری و 3 جدول فرعی باید 4 تا گزارش مجزا بسازی.
در قسمت گزراش اصلیت اون گزارش فرعی هارو قرار بدی فقط حواست باشه تو قسمت header page & header report & footer Page & footer report باشه چون در قسمت Details تکرار میشه و بهم میریزه.اگر بازم خواستی بگو برات نمونه بزارم ولی فکر کنم کامل گفتم.
موفق باشی.

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

veniz2008
چهارشنبه 25 مرداد 1391, 21:42 عصر
این چهار فیلد از هر جدول با چهار فیلد از جدول دیگه از یک نوع هستن؟( منظورم اینه که چهار فیلد تمامی جدول ها از یک نوع هستن؟ مثلا فیلد اول همشون از نوع int یا فیلد دوم همشون از نوع nvarchar و ... هستن؟ یا کلا متفاوتن؟ مثلا جدول اول سه تاش int هست و جدول دوم یه دونش int هست)فیلدهایی که میخوای نمایش بدی از چه نوعی هستن؟.

firoozi90
پنج شنبه 26 مرداد 1391, 01:37 صبح
همه ی فیلدهای جدول ها همه نوعاشو مثل همه
مثلا جدول اولم فیلد اولش int و دوم nvarchar و سوم nvarchar و چهارم هم Int و جدول دومم هم یلد اولش int و دوم nvarchar و سوم nvarchar و چهارم هم Int و ...
فقط اسم فیلدا فرق داره وگرنه نوعش یکی هست

veniz2008
پنج شنبه 26 مرداد 1391, 10:00 صبح
خوب با این چیزی که گفتید میتونید از union استفاده کنید و برای هر select شرط بذاری و رکوردها رو بیرون بکشی. من کدش رو قرار میدم با توجه به جدولت اصلاحش کن( با یه stored procedure بنویسش). منظور از id1 فیلد جدول شما از نوع int هست. منظور از name1 فیلد جدول شما از نوع nvarchar هست. با توجه به اسم فیلدهای جدول خودتون فیلدها رو اصلاح کنید.

select id1,name1,name2,id2 from table1 where (شرط جدول اول)
union
select id1,name1,name2,id2 from table2 where (شرط جدول دوم)
union
select id1,name1,name2,id2 from table3 where (شرط جدول سوم)
union
select id1,name1,name2,id2 from table4 where (شرط جدول چهارم)

firoozi90
پنج شنبه 26 مرداد 1391, 10:20 صبح
ممنون از راهنماییت
اما اگر با store procedure استفاده نکنم با مشکل بر می خورم؟
و اینکه توی این دستور چطور ازش استفاده کنم؟راستش من Union کار نکردم تا به حال



objSqlConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\SRVCARD.mdf;Integrated Security=True;User Instance=True");

newDataTable = new DataTable();
newDataTable = Select("SELECT * FROM STUD WHERE idstudent='" + textBox3.Text.Trim() + "'");

DataSet1 newDS = new DataSet1();

CrystalReport2 newCryFactor = new CrystalReport2();
newCryFactor.SetDataSource(newDataTable);
crystalReportViewer1.ReportSource = newCryFactor;



چطور این دستور رو توی دیتاتیبل سلکت کنم؟

veniz2008
پنج شنبه 26 مرداد 1391, 10:39 صبح
چند وقت پیش میخواستم از دو جدول داخل کریستال خروجی بگیرم با کدنویسی درون ویژوال هر کاری کردم نشد که نشد. ولی همون کد رو داخل یه sp نوشتم و بعدش اونو داخل یه دیتاست ریختم. مشکل براحتی حل شد. دستور union هیچی نداره که شما بخوای بترسی همش همونیه که در بالا گفتم فقط جایگذاری کنید. یعنی شما 16 تا شرط رو میفرستی واسه sp و اونجا شرطها رو چک میکنی. بعدش داخل محیط دات نت اون sp رو صدا میزنی و میریزیش داخل دیتا آداپتور و دیتاآداپتور رو میریزی داخل دیتاتیبل. با sp که مشکلی نداری؟

firoozi90
پنج شنبه 26 مرداد 1391, 11:01 صبح
راستشو بخوای استور پروسیجر تا حالا عملی باش کار نکردم.
اینطور که معلومه واسه منی که به دستورهای اس کیو ال مسلط نیستم کار سختی رو پیش رو دارم.
اگر شما واسم یه سورس یا مثال می زاشتین بی نهایت ممنونتون میشدم.

veniz2008
پنج شنبه 26 مرداد 1391, 11:30 صبح
در تاپیک زیر ( درپست 10 ) یه فیلم آموزشی کوتاه درباره ساخت stored procedure گذاشتم. شما کافیه که 16 تا شرط رو واسش تعریف کنی و دستور union رو بنویسی.
http://barnamenevis.org/showthread.php?348780-%DA%86%DA%AF%D9%88%D9%86%DA%AF%DB%8C-%D8%AA%D9%87%DB%8C%D9%87-%DA%A9%D9%BE%DB%8C-%D8%A7%D8%B2-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7%DB%8C-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A8%D9%87-%D9%85%D9%86%D8%B8%D9%88%D8%B1-%D8%AA%D9%87%DB%8C%D9%87-%D9%BE%D8%B4%D8%AA%DB%8C%D8%A8%D8%A7%D9%86&p=1538593#post1538593

firoozi90
پنج شنبه 26 مرداد 1391, 12:54 عصر
ممنون از توجهت
اما یه جا خوندم دستور union که مقادیری از فیلد که تکرار شده اند رو فقط یکیشون نشون میده.
اگر یه مثال برام میزاشتین خیلی ممنونتون می شدم

zaeimh90
جمعه 27 مرداد 1391, 12:48 عصر
عزیز ببخشید یکم دیر برات فرستادم.کمی سرم شلوغ بود.اگر سوال داشتی بپرس در خدمتم.
91394

veniz2008
جمعه 27 مرداد 1391, 13:17 عصر
ممنون از توجهت
اما یه جا خوندم دستور union که مقادیری از فیلد که تکرار شده اند رو فقط یکیشون نشون میده.
اگر یه مثال برام میزاشتین خیلی ممنونتون می شدم
بله دستور union فیلدهای تکراری رو نشون نمیده. برای اینکه فیلدهای تکراری رو هم داشته باشی باید از union all استفاده کنی.( نحوه نوشتنش دقیقا مثل union هست فقط یه کلمه all بهش اضافه کن).

jalalhivedi252
چهارشنبه 25 دی 1392, 17:43 عصر
سلام بچه ها اگه بازهم کسی متوجه نشده این رو هم بگم زیاد گمراه نشوید و قرار نیست در بانک اس کیو ال کد بنویسید فقط در ساخت View جدول های که قراره از اطلاعات آنها استفاده کنید را انتخاب کنید و از داخل جدول ها فقط ستون های مد نظر را انتخاب و نسبت به ذخیره ؤهثص اقدام نمائید بعد در برنامه نویسی آن را صدا بزنید همانند پست شماره 1
موفق باشید