PDA

View Full Version : روش ارسال پارامتر برای گزارش گیری دینامیک



nasimnastaran
شنبه 21 مرداد 1385, 15:38 عصر
با سلام ،
می خواستم گزارش گیری دینامیک داشته باشم . بدین منظور به گفته یکی از دوستانم ، که گفته بودند (http://barnamenevis.org/forum/showthread.php?p=253866):


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

حقیقتش من از روش ارسال پارامتر چیزی نمی دونم . ممنون می شم ، توضیحی در این مورد ارایه دهید .

حالا برای هر فیلد توی ریپورت یک فرمول ایجاد کن و چک کن که بر اساس فلان مقدار متغیر آیا اون رو نشون بده ای نه...
طبیعیه که مقدار متغیر هم از فرم به ریپورت ات فرستاده میشه.
میشه یک نمونه کد در این مورد ارایه دهید . من توی فرم خود از ChechBox استفاده کردم .
.بسیار متشکر از راهنمایی تان

reza_rad
یک شنبه 22 مرداد 1385, 09:46 صبح
ببینید...
شما توی کریستال توی منوی سمت چپ یه جایی داره به نام پارامتر...
اونجا شما می تونید پارامتر ایجاد کنید به یه اسمی...
خب تا اینجا که مشکلی نیست...
حالا این پارامتر می تونه از داخل برنامه مقدارش به ریپورت شما فرستاده بشه.
این یه کد نمونه برای اینکار:


Report rfrm = new Report();
rfrm.ID=this.TxtDocumentIdEdit.Text;
SetConnectionInfo(rfrm);


CrystalDecisions.Shared.ParameterField ParamField= new CrystalDecisions.Shared.ParameterField();
CrystalDecisions.Shared.ParameterDiscreteValue discreteParam = new CrystalDecisions.Shared.ParameterDiscreteValue();
CrystalDecisions.Shared.ParameterFields ParamFields= new CrystalDecisions.Shared.ParameterFields();


ParamField.ParameterFieldName = "@docId";
discreteParam.Value=Convert.ToInt32(rfrm.ID);
ParamField.CurrentValues.Add(discreteParam);
ParamFields.Add(ParamField);



rfrm.crystalReportViewer1.ParameterFieldInfo=Param Fields;
rfrm.MycrystalReport.ResourceName = System.Windows.Forms.Application.ExecutablePath;
rfrm.crystalReportViewer1.ReportSource=rfrm.Mycrys talReport;

rfrm.ShowDialog();



این کد یه کم زیاده ولی قسمت ها مهمش رو من مشخص کردم

بقیه کد فکر کنم گویا باشه
ولی اگه مشکلی داشتی بپرس...

حالا که پارامتر رو فرستادی به ریپورت باید بتونی توی یه شرط بگی که فلان فیلدها رو نشون بده یا نده...
روی لیبل فیلدت توی کریستال راست کلیک کن...
فرمولا رو پیدا کن

حالا اینجا می تونی با IF و SELECT CASE کد بنویسی
مثلا بنویسی اگه پارامتر 1 بود این کوئری رو اجرا کن و گرنه یه چیز دیگه ....

nasimnastaran
یک شنبه 22 مرداد 1385, 11:56 صبح
جناب آقای راد
ضمن تشکر از پاسخ تان .
سه مشکل در اینجا برای من وجود دارد :
1 - اینکه ، آیا پارامتر هایی را که در کریستال ریپورت ایجاد کردم ، باید به داخل صفحه کریستال انتقال دهیم یا خیر ؟
2 - من توی فرم چک باکس( CheckBox) دارم . در قسمت discreteParam.Value من می خوام ، وقتی که آن را تیک زدم ، تمامی رکورد آن فیلد نمایش داده شود .
3 - منظور شما از ID در rfrm.ID چیه ؟
بسیار متشکرم

reza_rad
یک شنبه 22 مرداد 1385, 17:19 عصر
اینکه ، آیا پارامتر هایی را که در کریستال ریپورت ایجاد کردم ، باید به داخل صفحه کریستال انتقال دهیم یا خیر ؟

خواهش می کنم:)


یعنی چی به داخل صفحه کریستال؟ متوجه نشدم!



من توی فرم چک باکس( CheckBox) دارم . در قسمت discreteParam.Value من می خوام ، وقتی که آن را تیک زدم ، تمامی رکورد آن فیلد نمایش داده شود .


خب مشکل کجاست!؟
شما توی کد فرم چک کن اگه چک باکس تیک خورده بود یه مقدار خاص رو به پارامتر بفرست
حالا توی ریپورت چک کن اگه پارامتر برابر با اون مقدار خاص بود تمام روکورد ها رو نشونت بده.



منظور شما از ID در rfrm.ID چیه ؟


این ID یه property هست داخل کلاس فرمی که توش ریپورت ویور رو گذاشتم.
شما می تونی یه متغیر گلوبال بگیری بجاش...

nasimnastaran
یک شنبه 22 مرداد 1385, 19:23 عصر
با سلام
منظورم اینه که توی کریستال ریپورت لازم است فیلدی از جدول را در آنجا قرار دهیم یا نه ؟(مثل گزارش گیری معمولی که با یک DataSet انجام می دهیم ) .
به عبارت دیگر ما در گزارش گیری معمولی فیلدها را در کریستال ریپورت قرار می دادیم . در اینجا گفتید که پارامتر ایجاد کن . خب فرض کنیم ، این پارامتر را ایجاد کردیم .با این پارامتر چه کار باید کرد .

ParamField.ParameterFieldName = "@docId";
نام این پارامتر همان است که در کریستال ریپورت ایجاد کردیم یا خیر ؟
من این کد را نوشتم ( در رویداد btnPrint_Click ) :

string strQuery = "SELECT * FROM SubscriberInfo";
sqlconn.Open();
da = new SqlDataAdapter(strQuery, sqlconn);
SqlCommandBuilder scb = new SqlCommandBuilder(da);
da.Fill(DS.SubscriberInfo);

//Definitions
ParameterField paramfield = new ParameterField();
ParameterFields paramfields = new ParameterFields();
ParameterDiscreteValue discreteval = new ParameterDiscreteValue();

paramfield.Name = "ID";
discreteval.Value = DS.SubscriberInfo.Columns[0];
paramfield.CurrentValues.Add(discreteval);
paramfields.Add(paramfield);
crystalReportViewer1.ParameterFieldInfo = paramfields;
crystalReportViewer1.ReportSource = crystalReport1;
sqlconn.Close();
ولی با این error
Value does not fall within the expected range در قسمت مشخص شده دارم .
ضمنا crystalReport1 هم شی ReportDocument است .
ممنون از پاسختان

reza_rad
دوشنبه 23 مرداد 1385, 09:00 صبح
به عبارت دیگر ما در گزارش گیری معمولی فیلدها را در کریستال ریپورت قرار می دادیم . در اینجا گفتید که پارامتر ایجاد کن . خب فرض کنیم ، این پارامتر را ایجاد کردیم .با این پارامتر چه کار باید کرد .

من نگفتم که به جای فیلد ها پارامتر ایجاد کن!
بلکه گفتم که برای فیلدها پارامتر تعیین کن.
یعنی اینکه:
شما تمام فیلدهایی که می خوای نشون بدی رو توی گزارش ایجاد کن و توی ریپورت بگذار. حالا پارامتر ایجاد کن . توی فرمولا مربوط به هر فیلد پارامتر رو چک کن که اگه مثلا فلان مقدار بود نشون بده یا نده ...



نام این پارامتر همان است که در کریستال ریپورت ایجاد کردیم یا خیر ؟


بله. پارامتری که من توی این کد داشتم @docid بود.



ولی با این error
Value does not fall within the expected range در قسمت مشخص شده دارم .

هر پارامتر یک نوع و محدوده داره. ببینید درست تنظیمشون کردید؟

nasimnastaran
دوشنبه 23 مرداد 1385, 16:20 عصر
با سلام ،
من برای هر فیلد مثلا برای نام پارامتر "Name" ایجاد کردم . سپس در قسمت فرمولا آن چنین نوشتم :


numberVar n1;
if n1=10 then {?name}={SubscriberInfo.subscriber}

سپس در کد فرم در قسمت discreteval.Value مقدار آن را برابر 10 دادم .


discreteval.Value = 10;

ضمنا یک شی ReportDocument یا (crystalReport1 ) هم به فرم اضافه کردم و آن را با کریستال ریپورت ارتباط دادم .
اولا اینکه در گزارش فقط lable فیلد را نشان می دهد و از مقادیر فیلد ( رکوردها ) خبری نیست .
ثانیا آیا لازم است که crystalReport1 با DataSet که در پروؤه داریم و در آن جدول مربوطه را قرار دادیم ، پر شود (با DataSet ) .
نمی دانم کجای کارم اشتباه است .؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

nasimnastaran
جمعه 27 مرداد 1385, 13:35 عصر
بالاخره حل شد .
در صفحه گزارش با غیر فعال کردن قسمت suppress شی مورد نظر برای هر فیلد ، می نویسیم :


myCrystalReport1.ReportDefinition.Sections[3].ReportObjects["firstname1"].ObjectFormat.EnableSuppress = false;

به همین سادگی .