PDA

View Full Version : لود نشدن برخی از فیلد ها در کریستال ریپورت



sajjadrad
شنبه 20 فروردین 1390, 00:51 صبح
سلام دوستان
من از دو جدول select کردم و میخوام با کریستال ریپورت چاپ کنم...اما مشکل اینجاست که تعداد رکورد های بازیابی شده از جدول دوم میاد اما اطلاعاتش لود نمیشه و فقط اطلاعات جدول اول لود میشه....
نمیدونم مشکل از کجاست...
دستور select:


select * from pro inner join fac on pro.id=fac.id where fac.id=2 and pro.id=2

دوتا جدول دارم با اسم های fac و pro که fac جدول parent و pro جدول child هست.
فیلد id بین این دو تا جدول مشترکه.

به این عکس دقت کنید:

68470
شماره و تاریخ از جدول fac خونده شده و جالی اینجاست که 4 تا رکورد جدول pro هم خونده شده اما اطلاعاتش لود نشده...
:ناراحت:
اگه کسی میتونه کمکم کنه

sarbaz_esf
شنبه 20 فروردین 1390, 10:45 صبح
دوست عزیز بهتر در دستور select که نوشتی نام فیلد های که در Cr بهش نیاز داری هم بنویسی
مثل این دستور :
SELECT fac.id,fac.date,pro.sharh, pro.tedad, pro.sum, pro.id FROM fac INNER JOIN pro ON dbo.fac.id = pro.id WHERE fac.id = '2' AND pro.id = '2'
و اینکه در دستور dataset که استفاده کرده باید جدا جدا برای هر کدوم از جدول هات یک dataset جدا قرار دهی.
مثل دستور زیر



SqlDataAdapter sda = newSqlDataAdapter();
DataSet ds = newDataSet();
sda.Fill(ds, "pro");
sda.Fill(ds, "fac");

sajjadrad
شنبه 20 فروردین 1390, 11:22 صبح
من براش دیتا ست تعریف نکردم..فقط تو ویزارد ساخت ریپورت دیتاست رو انتخاب کردم...
الان این کد ها اصلاح شده:


SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = con2;
da.SelectCommand.CommandType = CommandType.Text;
da.SelectCommand.CommandText = "SELECT fac.id,fac.date,pro.sharh, pro.tedad, pro.sum, pro.id FROM fac INNER JOIN pro ON dbo.fac.id = pro.id WHERE fac.id = '2' AND pro.id = '2'";
DataTable dt = new DataTable();
da.Fill(dt);
con2.Close();
rd.SetDataSource(dt);


دیتاست رو کجاش باید تعریف کرد؟یه راهنمایی میکنید؟
مرسی

sarbaz_esf
شنبه 20 فروردین 1390, 11:30 صبح
دوست عزیز الان فیلد های که من نوشتم مثال بود باید فیلد های جدول خودت را جای گزین کنی.
تغییرات را توی دستوراتت ایجاد میکنم ببین

SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = con2;
da.SelectCommand.CommandType = CommandType.Text;
da.SelectCommand.CommandText = "SELECT fac.id,fac.date,pro.sharh, pro.tedad, pro.sum, pro.id FROM fac INNER JOIN pro ON dbo.fac.id = pro.id WHERE fac.id = '2' AND pro.id = '2'";
DataSet ds = newDataSet();
da.Fill(ds, "pro");
da.Fill(ds, "fac");

con2.Close();
CrystalReport1 set = new CrystalReport1();
set.SetDataSource(ds);
this.crystalReportViewer1.ReportSource = set;

sajjadrad
شنبه 20 فروردین 1390, 12:00 عصر
الان با اینکار هیچ چیزی بازیابی نمیشه!

اگه دیتاست رو در ویزاد انتخاب کنم ایرادی نداری؟

sarbaz_esf
شنبه 20 فروردین 1390, 12:47 عصر
دوست عزیز چیزی نمی خواد اضافه کنی فقط لطف کن و نام فیلد های جدولت را برایم بنویس

sajjadrad
شنبه 20 فروردین 1390, 13:13 عصر
خب الان از این کدها استفاده کردم:


da.SelectCommand.CommandText = "select pro.ci,pro.ct,pro.cp,fac.da,fac.id,fac.tp from pro inner join fac on pro.id=fac.id where fac.id=2 and pro.id=2";
DataSet ds = new DataSet();
da.Fill(ds, "pro");
da.Fill(ds, "fac");
con2.Close();
rd.Database.Tables[0].SetDataSource(ds.Tables[0]);
rd.Database.Tables[1].SetDataSource(ds.Tables[1]);
this.crystalReportViewer1.ReportSource = rd;



اطلاعات در ریپورت اومد اما هر رکورد 4 برابر شده...یعنی باید 4 تا رکورد بازیابی بشه اما 16 تا رکورد بازیابی شد

sarbaz_esf
شنبه 20 فروردین 1390, 14:42 عصر
فکر کنم به خاطر دستور زیرت باشه
rd.Database.Tables[1].SetDataSource(ds.Tables[1]); فکر کنم اضافی باشه
از این دستور زیر که من نوشتم استفاده
فقط توی فرم ات یک CrystalReportViewer اضافه کن و یک ReportDocument


con = new SqlConnection("Data Source=Localhost;Initial Catalog=نام بانک اطلاعتید ;Integrated Security=True");
dap = new SqlDataAdapter("select pro.ci,pro.ct,pro.cp,fac.da,fac.id,fac.tp from pro inner join fac on pro.id=fac.id where fac.id=2 and pro.id=2", con);
dst = new DataSet();
con.Open();
dap.Fill(dst, "pro");
dap.Fill(dst, "fac");
con.Close();
CrystalReportn set = new CrystalReportn();
set.SetDataSource(dst);
this.crystalReportViewer1.ReportSource = set
;
اگه باز هم جواب نداد از دستور distinct استفاده کن به صورت زیر
dap = new SqlDataAdapter("select distinct fac.id, pro.ci,pro.ct,pro.cp,fac.da,fac.tp from pro inner join fac on pro.id=fac.id where fac.id=2 and pro.id=2", con);

sajjadrad
شنبه 20 فروردین 1390, 21:31 عصر
اگه باز هم جواب نداد از دستور distinct استفاده کن

این دستور چیکار میکنه؟

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

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

sarbaz_esf
شنبه 20 فروردین 1390, 23:21 عصر
دستور بالا از تکرار جلو گیری میکنه
دستور select را به این صورت بنویس ببین جواب میده

"select pro.ci,pro.ct,pro.cp,fac.da,fac.tp,fac.id from pro ,fac where fac.id=2 and pro.id=2"

sajjadrad
شنبه 20 فروردین 1390, 23:38 عصر
اینم بازم همونجوری میشه...
میگم فکر نکنم مشکل ازدستور select باشه چون وقتی نتایج رو میریزم تو دیتاگرید درسته...
احتمالا مشکل از گزارشاته

mn_zandy63
یک شنبه 21 فروردین 1390, 00:58 صبح
سلام دوست من،
در مورد دو تا دیتاست استفاده کردن، اونم یه راه حله، اما به روشی که اینجا مطرح شده اشتباهه.
در واقع روش اولت درست تر از چیزی هست که الان در نهایت هستی.
برگرد سر جای اولت
حالا فایل rpt رو اینجا بذار تا بهت بگم باید چیکار کنی

موفق باشی

sajjadrad
یک شنبه 21 فروردین 1390, 08:50 صبح
مرسی دوست عزیز
اینم از فایل فاکتور فقط بانک رو از اول ساختم نام جدول ها تغییر کرده...68524
68524

mn_zandy63
یک شنبه 21 فروردین 1390, 21:14 عصر
سلام دوست من،
با توجه به آخرین کدی که نوشته بودی و فایل گزارشی که اینجا گذاشتی کدت رو اصلاح میکنم و اینجا میذارم.
به دلیل اینکه داخل فایل گزارشت دو تا جدولِ جدا داری، پس اینجا هم باید دو تا table پر کنی و بفرستی.
فقط یک نکته، داخل گزارشت دو تا فیلد idb از هر جدول رو Link کرده بودی، در حالی که داخل Query که اینجا گذاشتی فیلدهای id رو inner join کردی. درستش کدومه؟ اگه درستش idb هست که هیچی. در غیر اینصورت در جریان باش که داخل گزارش link ت اشتباهه. (Database Expert، سربرگ link)


DataSet ds = new DataSet();
da.SelectCommand.CommandText = "select ID,idb,codeinfo,codetotal,codeprice,codesum from produce where id=2";
da.Fill(ds, "produce");
da.SelectCommand.CommandText = "select ID,idb,date,total,tprice from factor where id=2";
da.Fill(ds, "factor");
con2.Close();
rd.Database.Tables[0].SetDataSource(ds.Tables[0]);
rd.Database.Tables[1].SetDataSource(ds.Tables[1]);
this.crystalReportViewer1.ReportSource = rd;

موفق باشی

sajjadrad
یک شنبه 21 فروردین 1390, 23:55 عصر
ببینید idb کد سفارشه و ID بصورت indentity هستش و فقط یه کد واسته دقیق کار کردنه.
الان سفارشات تو جدول produce و اطلاعات فاکتور تو جدول factor ذخیره میشه. کلید idb در جدول فاکتور بصورت primaty key هستش اما تو جدول سفارش چندتارکورد میتونن یه idb داشته باشن.بین idb دو جدول هم relationship برقراره.

من الان از این کد استفاده کردم ریپورت اصلا لود نشد. احتمالا مشکل از کامند هستش...
حالا نمیدونم با توجه به این شرایط کدومش درسته...تا حالا با دو کوئری همزمان از دو جدول متفاوت واسه ریپورت کار نکردم:ناراحت:

مرسی

mn_zandy63
دوشنبه 22 فروردین 1390, 02:08 صبح
سلام دوست من،
پس link ت درست بود.
برای fill کردن دو تا datatable این روش درسته. فقط یه سوال، اصلا رکوردی داخل جدولت با idb = 2 داری؟ ;)
با توجه به اینکه گزارشت رو با استفاده از دو تا جدول ساختی، مطمئنا باید دو تا جدول بفرستی برای گزارشت.
منطقا ایرادی نمیبینم.
شاید اگه دیتابیست رو هم بذاری اینجا بهتر بشه کمک کرد.
راستی، دقیقا کل کدی که داخل این تابعت نوشتی چی هست؟

موفق باشی

sajjadrad
دوشنبه 22 فروردین 1390, 02:43 صبح
مرسی دوست عزیز مشکل حل شد.
مشکل از کوئری بود که من فیلد total رو از بانک حذف کرده بودم.
خیلی ممنون.چون اینو بعدا فهمیدم بانک رو هم براتون تو پیغام خصوصی فرستادم..
مرسی


فقط یه سوال دیگه..من میخوام این گزارش رو با چاپگر حرارتی پرینت بگیرم ..تو فرام sap که کمک خواستم گفتن که فقط عزض کاغذ رو همون 8 سانتی متر بذار .. اما گفتن که یادت باشه که header section و footer section نداری...اما تو این گزارش هست...امکانش هست که این سکشن ها رو پاک کنم چون هرچی تلاش کردم نتونستم