ورود

View Full Version : گزارش از join جدول ها



niloofar norouzi
دوشنبه 01 مهر 1387, 10:58 صبح
سلام
من برای گزارش گیری از این کد استفاده کردم اما query ، حاصل join دو تا جدول است.


string constr = "server=niloofar\\i2;database=northwind;Integrated Security = true";
CrystalReport1 cr1 = new CrystalReport1();
// haziner cr1 = new haziner();
SqlConnection con = new SqlConnection(constr);
DataSet1 ds = new DataSet1();
con.Open();
SqlDataAdapter da = new SqlDataAdapter("select p.fname,t.number from personal p join test t on p.code=t.code", con);
da.Fill(ds, "test");
cr1.SetDataSource(ds.Tables["test"]);
crystalReportViewer1.ReportSource = cr1;

اما نتیجه ای که می گیرم اطلاعات یک جدول است.چون

da.Fill(ds, "test");
این قسمت از کد را چطور باید اصلاح کنم؟
با تشکر

niloofar norouzi
دوشنبه 01 مهر 1387, 12:52 عصر
کسی کمکم نمی کنه

احمد غلامی
دوشنبه 01 مهر 1387, 14:33 عصر
مشکل شما اینه که وقتی می خواید dataset رو پرکنید باید از نام جدولی که در دستور sql بعد از کلمه کلیدی from بکار بردید استفاده کنید که شما اینکارو نکردید یعنی با توجه به چیزی که خودتون نوشتید باید تو ی دستور da1.fill دیتا ست رو بجای اینکه با جدول test پرکنید ، با جدول personal p پرکنید درضمن توی دستور sql بهتره بجای join از INNER JOIN استفاده کنید
همچنین setdatasource رو فقط با ds1 پرکنید .
موفق باشید.

niloofar norouzi
دوشنبه 01 مهر 1387, 15:03 عصر
مشکل شما اینه که وقتی می خواید dataset رو پرکنید باید از نام جدولی که در دستور sql بعد از کلمه کلیدی from بکار بردید استفاده کنید که شما اینکارو نکردید یعنی با توجه به چیزی که خودتون نوشتید باید تو ی دستور da1.fill دیتا ست رو بجای اینکه با جدول test پرکنید ، با جدول personal p پرکنید .
همین کارو کردم اما تغییری نکرد



همچنین setdatasource رو فقط با ds1 پرکنید .

این چیزی که شما گفتید اشتباهه

niloofar norouzi
دوشنبه 01 مهر 1387, 15:08 عصر
چرا من فیلدی از جدول test در گزارش ندارم؟

asefy2008
دوشنبه 01 مهر 1387, 16:41 عصر
البته من وارد نیستم ولی فکر کنم کد زیر رو امتحان کنید مشکلتون حل شه


Reppath=Application.StartupPath + @"\Report\CrystalRep.rpt"
ConnectionInfo connectioninfo = newConnectionInfo();
connectioninfo.IntegratedSecurity = true;
ReportDocument repdoc = newReportDocument();
repdoc.Load(Reppath);
repdoc.SetDataSource(DataSet);
ReportViewer.ReportSource = repdoc;

احمد غلامی
دوشنبه 01 مهر 1387, 17:16 عصر
منظور من از ds1 همون ds بود عدد1 رو اشتباهی وارد کردم و اما در مورد اینکه این کد اشتباهه ،راستش من تا حالا تو پروژه هایی که انجام دادم همیشه از این کدها استفاده کردم و هیچوقت هم به مشکل برنخوردم و مطمئن باشید درصحت این کدها شکی نیست ولی از اونجایی که ما درجریان کامل پروژه شما قرار نداریم خوب ممکنه بخش های دیگه پروژتون مشکل داشته باشه مثل نحوه برقراری ارتباط بین جداولتون که اونوقت اصلا کد sql شما نادرسته ویا نحوه مرتبط کردن شی گزارشتون به crystalreportviewer و یا بخش های دیگه ، یه بار دیگه کارهایی که انجام دادید رو چک کنید شاید مشکل در جای دیگه ای باشه کد sql تونو هم یکبار در sql server امتحان کنید ببینید اونجا جواب میده یا نه .
به هر صورت اینا چیزایی بود که به ذهن من میرسید

ali_mnkt
دوشنبه 01 مهر 1387, 19:53 عصر
سلام به دوستان

من هم همین مشگل رو دارم کد خانوم نوروزی درسته من هم خیلی رو این موضوع کار کردم

ولی تا حالا به نتیجه ای نرسیدم البته روی یک جدول این طریقه ی گزارش گیری(توسط dataset)

درست کار میکنه ولی روی چند جدول همون طوری که گفتن اطلاعات یک جدول رو نشون نمی ده.

اگه کسی کار کرده و جواب گرفته یه کمکی هم به ما کنه .

pars.engineer
سه شنبه 02 مهر 1387, 04:04 صبح
سلام،


من برای گزارش گیری از این کد استفاده کردم اما query ، حاصل join دو تا جدول است.


شما به راحتي مي توانيد كوئري مورد نظرتان را در يك View پياده سازي كنيد و View مربوطه را به گزارشتان پاس كنيد. (شايد بتوان گفت براي كوئري هايي كه فاقد شرط هستند اين روش بهترين روش است(البته از نظر من)).
براي اين منظور پس از اينكه كوئري مربوطه را ساختيد، يك گزارش كريستال ريپورت ايجاد نماييد و در كادر محاوره اي Crystal Reports Gallery گزينه Using The Report Wizard را انتخاب كرده و سپس از پنجره ي بعدي گزينه Create New Connection و سپس OLE DB (ADO) و بعد Microsoft OLE BD Provider for SQL Server را انتخاب كرده و پس از اينكه نام سرور و ديتا بيس را انتخاب كرديد، Finish را كليك كرده و View مربوطه را انتخاب نماييد.
پس از اين كار فيلدهاي موجود در View به گزارشتان اضافه مي شود.

البته همانطور كه ابتدا گفتم اين روش هميشه كارا نيست (مثل مواردي كه به گزارش هاي ديناميك احتياج داريم).

الان وقتم اجازه نمي دهد كه روش كد نويسي را شرح دهم، اما اگر مشكلتان حل نشد، اعلام كنيد تا بزودي اين روش را نيز توضيح دهم.

موفق باشيد.

niloofar norouzi
سه شنبه 02 مهر 1387, 10:29 صبح
ممنون از کمک شما(pars.engineer (http://www.barnamenevis.org/forum/member.php?u=59072))
با استفاده از view مشکل حل شد

ali_mnkt
سه شنبه 02 مهر 1387, 22:02 عصر
دوست عزیز این روش جواب می ده ولی یک مشگل داره من توی پروژه ام از access استفاده

کردم وقتی در این روش میخوای پایگاه داده رو انتخاب کنی باید آدرس اون رو از هارد دیسک

کامپیوت خودت بدی در صورتی که وقتی set up میگیری و در کامپیوتر مقصد اجرا می کنی

ممکنه آدرس اون دیتابیس عوض شه در صورتی که اگه از همون روش dataset بریم میتونیم

یک آدرس نسبی بدیم که در setup گیری هم مشگلی نداشته باشه

آیا این مشگل رو می شه حل کرد؟

ali_mnkt
چهارشنبه 03 مهر 1387, 17:20 عصر
دوستان منتظر راهنمایتون هستم

ali_mnkt
چهارشنبه 03 مهر 1387, 17:21 عصر
دوستان منتظر راهنمایتون هستم :ناراحت: