PDA

View Full Version : سوال: خطا در SetParameterValue در کریستال ریپورت در سی شارپ



Ali0Boy
یک شنبه 22 مرداد 1391, 23:53 عصر
باسلام و عرض خسته نباشید
من برای ارسال پارامتر مستقیم به یه ریپورت از نوع کریستال ریپورد، داخل کریستال ریپورت یک Report Comments اضافه کردم و سپس نام آن را Text2 گذاشتم و از درون صفحه ای دیگر آن فیلد را با تابع SetParameterValue مقدار دهی کردم ولی با خطای زیر روبرو شدم!

کد:

crpChapFact crp = new crpChapFact();
Form1 f1 = new Form1();
crp.SetParameterValue("Text2", "salam iran");
f1.crystalReportViewer1.ReportSource = crp;
f1.ShowDialog();


خطای زیر در خط سوم رخ داد.

شرح کامل خطا:


Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))

System.Runtime.InteropServices.COMException was unhandled
Message="Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))"
Source="CrystalDecisions.ReportAppServer.DataDefModel"
ErrorCode=-2147352565
StackTrace:
at CrystalDecisions.ReportAppServer.DataDefModel.Fiel dsClass.get_Item(Int32 Index)
at CrystalDecisions.CrystalReports.Engine.ParameterFi eldDefinitions.get_Item(Int32 index)
at CrystalDecisions.CrystalReports.Engine.ParameterFi eldDefinitions.get_Item(String fieldName)
at CrystalDecisions.CrystalReports.Engine.ReportDocum ent.SetParameterValue(String name, Object val)
at shopManagement_Star01.frmOptMainShop.btnSaveSt2_Cl ick(Object sender, EventArgs e) in D:\Shop-Management-Star01\shopManagement-Star01\frmOptMainShop.cs:line 35
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventAr gs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallba ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchM essageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager. System.Windows.Forms.UnsafeNativeMethods.IMsoCompo nentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at shopManagement_Star01.frmMain.btnOtherOpt_Click(Ob ject sender, EventArgs e) in D:\Shop-Management-Star01\shopManagement-Star01\frmMain.cs:line 108
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventAr gs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallba ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchM essageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager. System.Windows.Forms.UnsafeNativeMethods.IMsoCompo nentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoop(Int32 reason, ApplicationContext context)
at shopManagement_Star01.Program.Main() in D:\Shop-Management-Star01\shopManagement-Star01\Program.cs:line 22
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.Run UsersAssembly()
at System.Threading.ExecutionContext.Run(ExecutionCon text executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:


اینطور که این نوشته و من فهمیدم میگه همچین پارامتری وجود ندارد، در صورتی که این پارامتر وجود دارد!!!

ali_habibi1384
دوشنبه 23 مرداد 1391, 02:44 صبح
اينجوري نميتوني پارامتر پاس بدي بايد خود متغير رو از نوع پارامتر كريستال ريپورت تعريف كني:


ParameterFields parameterFields = new ParameterFields();
ParameterField startField = new ParameterField();
ParameterDiscreteValue startValue = new ParameterDiscreteValue();
startField.Name = "StartDate";
startValue.Value = txtStartDate.Text;
ReportDocument rd = new ReportDocument();
rd.FileName = "Report\\JozeMandeHesab.rpt";
frmPrint f = new frmPrint();
DataTable dtTemp = dt.DefaultView.ToTable();
rd.SetDataSource(dtTemp);
f.crystalReportViewer1.ParameterFieldInfo = parameterFields;
f.crystalReportViewer1.ReportSource = rd;
f.crystalReportViewer1.Show();
f.Show();

پارامتر رو تعريف كردم مقدار دهي كردم . مسير فايل كريستال ريپورتم رو بهش نشون دادم،داخلش رو پر كردم و سپس فرمي كه توش كريستال ريپورت ويوور انداخته بودم به كاربر نشون دادم

ali_habibi1384
دوشنبه 23 مرداد 1391, 02:50 صبح
اينجوري نميتوني پارامتر پاس بدي بايد خود متغير رو از نوع پارامتر كريستال ريپورت تعريف كني:


ParameterFields parameterFields = new ParameterFields();
ParameterField startField = new ParameterField();
ParameterDiscreteValue startValue = new ParameterDiscreteValue();
startField.Name = "StartDate";
startValue.Value = txtStartDate.Text;
ReportDocument rd = new ReportDocument();
rd.FileName = "Report\\JozeMandeHesab.rpt";
frmPrint f = new frmPrint();
DataTable dtTemp = dt.DefaultView.ToTable();
rd.SetDataSource(dtTemp);
f.crystalReportViewer1.ParameterFieldInfo = parameterFields;
f.crystalReportViewer1.ReportSource = rd;
f.crystalReportViewer1.Show();
f.Show();

پارامتر رو تعريف كردم مقدار دهي كردم . مسير فايل كريستال ريپورتم رو بهش نشون دادم،داخلش رو پر كردم و سپس فرمي كه توش كريستال ريپورت ويوور انداخته بودم به كاربر نشون دادم

Ali0Boy
دوشنبه 23 مرداد 1391, 13:39 عصر
با سلام و سپاس از علی آقا.
اون روش که من پیاده کرده بودم رو از همین انجمن پیدا کرده بودم.
ببینید من کد شما رو به این صورت تغییر دادم و استفاده کردم:


ParameterFields parameterFields = new ParameterFields();
ParameterField startField = new ParameterField();
ParameterDiscreteValue startValue = new ParameterDiscreteValue();
startField.Name = "Text2";
startValue.Value = "ایران زمین";
crpChapFact rd = new crpChapFact();
rd.FileName = "crpChapFact.rpt";
Form1 f = new Form1();
f.crystalReportViewer1.ParameterFieldInfo = parameterFields;
f.crystalReportViewer1.ReportSource = rd;
f.crystalReportViewer1.Show();
f.Show();


و چون من فعلا هنوز دیتابیسی به کریستال وصل نکرده ام و فقط قصد تست این کار را دارم پس کدهای زیر رو حذف کردم.


DataTable dtTemp = dt.DefaultView.ToTable();
rd.SetDataSource(dtTemp);


ولی چیزی رو نمایش نمی دهد.

startField و startValue را نباید جایی اضافه کرد؟

من بیشتر شک دارم که حتما باید داخل کریستال ریپورد فیلد مورد نظر از نوع خاصی باشد و یا باید یکسری ویژگی هاش رو تغییر داد، مثل شی ها داخل فروم ها که modifiers دارند.
من کریستال ریپورتی که تعریف کرده ام رو میزارم اینجا خودتون تست کنید.

barnamenevisforme
دوشنبه 23 مرداد 1391, 15:18 عصر
سلام
برادر عزیز از قسمت field explorer طبق تصویر:
91207
بعد در ضمن این لینک رو ببین،علاوه بر نحوه استفاده از پارامتر،نحوه ساخت یه گزارش پویا رو هم نشون داده:
http://www.codeproject.com/Articles/20670/Dynamic-Crystal-Report-with-C
موفق باشید.

ali_habibi1384
دوشنبه 23 مرداد 1391, 15:45 عصر
چندتا سوال:
1-از فريم ورك چند استفاده ميكني
2-ويژوال استوديوت ورژن چنده؟
3-آيا تنظيمات مربوط به فايل app.config رو براي 2010 روي فريم ورك 4 ست كردي؟
4-فايل اصلي برنامه كجاست؟الصاقش نكرديد. اونهم بفرستيد

ali_habibi1384
دوشنبه 23 مرداد 1391, 17:50 عصر
آموزش تصويري استفاده از كريستال ريپورت در ويژوال استوديو 2010 بصورت كامل (http://catalog.codeproject.com/Articles/166291/Generate-a-report-using-Crystal-Reports-in-Visual)

Ali0Boy
دوشنبه 23 مرداد 1391, 22:57 عصر
سلام
برادر عزیز از قسمت field explorer طبق تصویر:
http://barnamenevis.org/attachment.php?attachmentid=91207&d=1344856643
بعد در ضمن این لینک رو ببین،علاوه بر نحوه استفاده از پارامتر،نحوه ساخت یه گزارش پویا رو هم نشون داده:
http://www.codeproject.com/Articles/...-Report-with-C (http://www.codeproject.com/Articles/20670/Dynamic-Crystal-Report-with-C)
موفق باشید.
سرور عزیز barnamenevisforme (http://barnamenevis.org/member.php?242915-barnamenevisforme) ممنون از پاسخی که دادین ولی مشکل من هنوز پا بر جا می باشد.
من از این روش که گفتید یه صورت کد زیر استفاده کردم ولی اینبار خطا نداد، همچنین چیزی رو نیز نمایش نداد.

دوست عزیز علی آقا من از 2008 استفاده می کنم، dot net 3.5

آقایون من اصلا در این چاپ کریستال ریپورت به بانکی وصل نیستم و قرار نیست وصل شوم . فقط قصد دارم یک فیلد که داخل صفحه ی کریستال ریپورد گذاشتم رو با د نویسی پر کنم.
از اساتید و دوستان که مطمئن هستند راهکارشان درست عمل می کند، لطفا یک سورس آماده کنند و اینجا برای دانلود بزارند و مراحل را به صورت دقیق توضیح دهد، هرگونه تغییر ویژگی های شی ها رو نیز بگویند.

شدیدا تکید می کنم، فعلا اتصال به بانکی در جدول قرار نیست انجام شود و خود مستقیم می خواهم پارامتری در کریستال ریپورد را مقدار دهی کنم.

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

ببخشید دوستان فایل کامل پروژه نیز در ضمینه اضافه شد[البته یه سادش برای تست].

Y_Safaiee
دوشنبه 23 مرداد 1391, 23:37 عصر
سلام دوست من

خدمت شما در 3 خط,نیاز به اون همه کدهم نیست,با فرض اینکه شما crystal report viewer رو public کرده باشی :



frmChap frm = new frmChap();
crpChapFact cr = new crpChapFact();
cr.SetParameterValue("name", "سلام");
frm.crystalReportViewer1.ReportSource = cr;

frm.ShowDialog();



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

راستی من برای اینکه یه فیلد به نام دلخواه اضافه کنم تو کریستال ریپورت و پنجره Field Explorer روی Parameter Fields راست کلیک کردم و New رو انتخاب و سپس نام متغییرمو نوشتم و نوعشو String کردم.

موفق باشی
بایت بایت

ali_habibi1384
دوشنبه 23 مرداد 1391, 23:59 عصر
پارامترت رو به كريستال ادد نكردي عزيز . توي رويداد كليك باتنت اين كد رو بذار درست ميشه:

ParameterFields parameterFields = new ParameterFields();
ParameterField startField = new ParameterField();
ParameterDiscreteValue startValue = new ParameterDiscreteValue();
startField.Name = "Text1";
startValue.Value = "فروشگاه شمس تبریزی";
crpChapFact crp = new crpChapFact();
crp.FileName = "crpChapFact.rpt";

startField.CurrentValues.Add(startValue);
parameterFields.Add(startField);


frmChap f1 = new frmChap();
f1.crystalReportViewer1.ParameterFieldInfo = parameterFields;
f1.crystalReportViewer1.ReportSource = crp;
f1.crystalReportViewer1.Show();
f1.ShowDialog();
اون دو خطي كه زيرش خط كشيدم نبود.
توي using هات هم اينو اضافه كن:

using CrystalDecisions.CrystalReports.Engine;

راستي هواست باشه بعدي كه هر بار تغييرات ميدي و Save ميكني فايل كريستالت رو توي شاخه bin كنار exe كپي كني

Ali0Boy
سه شنبه 24 مرداد 1391, 00:39 صبح
سلام دوست من

خدمت شما در 3 خط,نیاز به اون همه کدهم نیست,با فرض اینکه شما crystal report viewer رو public کرده باشی :



frmChap frm = new frmChap();
crpChapFact cr = new crpChapFact();
cr.SetParameterValue("name", "سلام");
frm.crystalReportViewer1.ReportSource = cr;

frm.ShowDialog();



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

راستی من برای اینکه یه فیلد به نام دلخواه اضافه کنم تو کریستال ریپورت و پنجره Field Explorer روی Parameter Fields راست کلیک کردم و New رو انتخاب و سپس نام متغییرمو نوشتم و نوعشو String کردم.

موفق باشی
بایت بایت

اختیار دارین شما سرور ما هستید فقط اگه پست ها رو دنبال کرده باشید من هم سوال پرسیدم که آیا کریستال ریپورت نیاز به public کردن داره یا خیر چون من چیزی به اسم modifiers ندیدم که تغییرش بدهم.
لطفا راهنمایی کنید چطور public کنم.

باتشکر فراوان

Ali0Boy
سه شنبه 24 مرداد 1391, 00:47 صبح
پارامترت رو به كريستال ادد نكردي عزيز . توي رويداد كليك باتنت اين كد رو بذار درست ميشه:

ParameterFields parameterFields = new ParameterFields();
ParameterField startField = new ParameterField();
ParameterDiscreteValue startValue = new ParameterDiscreteValue();
startField.Name = "Text1";
startValue.Value = "فروشگاه شمس تبریزی";
crpChapFact crp = new crpChapFact();
crp.FileName = "crpChapFact.rpt";

startField.CurrentValues.Add(startValue);
parameterFields.Add(startField);


frmChap f1 = new frmChap();
f1.crystalReportViewer1.ParameterFieldInfo = parameterFields;
f1.crystalReportViewer1.ReportSource = crp;
f1.crystalReportViewer1.Show();
f1.ShowDialog();
اون دو خطي كه زيرش خط كشيدم نبود.
توي using هات هم اينو اضافه كن:

using CrystalDecisions.CrystalReports.Engine;

راستي هواست باشه بعدي كه هر بار تغييرات ميدي و Save ميكني فايل كريستالت رو توي شاخه bin كنار exe كپي كني

علی آقا ممنونم از پاسخ شما، اگه 6 پست قبل رو مشاهده کنید من پرسیدم که نباید این پارامتر ها رو اضافه کرد چون تو کد قبلی شما نبود و شما نیز پاسخی ندادید.
ولی با این حال من کار هایی که حالا نیز گفتید رو انجام دادم ولی نمی دونم چرا دوباره پیغام "The parameter is incorrect." رو داد در صورتی ایم پارامتر با همان نام که مشخص کرده ام داخل کریستال ریپورت موجود می باشد.

بازهم باتشکر فراوان
دوستان من هنوز مشکلم حل نشده.

Y_Safaiee
سه شنبه 24 مرداد 1391, 00:56 صبح
با سلام مجدد

حتی به شیوه کد نویسی من؟!!!

خود کریستال ریپورت نه نیازی به پابلیک کردن نداره چون میتونی مثه من از کلاسش استفاده کنی,در مثالی که من زدم crpChapFact نام کلاس کریستال ریپورت شما,crpChapFact.rpt نام فایل کریستال و crpChapFact1 هم واسط کار با کریستال ریپورتتون بود.شما میتونین از کلاس دیزاینی که انجام دادین (منظورم کریستال ریپورته ساخته شدنتونه) در هر فرمی و هرجایی از کلاسش استفاده کنید مثه من که استفاده کردم.

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

Public نمیشه چون نیازی به Public شدن نداره,public وقتی نیازه که بخوای از یه فرم دیگه بهش دسترسی داشته باشی و مقادیر بدی اما وقتی خودش پیش فرض public هست چرا دوباره public شه؟دقتم کنید من تو فرم اول بدونه اینکه بگم crystal report رو public کن براش کد نوشتم و بهش پاس دادم.

اگه منظورتون از Public کردن چیز دیگست لطفا توضیح بدین.

مرسی

موفق باشی
بایت بایت

Ali0Boy
سه شنبه 24 مرداد 1391, 01:02 صبح
با سلام مجدد

حتی به شیوه کد نویسی من؟!!!

خود کریستال ریپورت نه نیازی به پابلیک کردن نداره چون میتونی مثه من از کلاسش استفاده کنی,در مثالی که من زدم crpChapFact نام کلاس کریستال ریپورت شما,crpChapFact.rpt نام فایل کریستال و crpChapFact1 هم واسط کار با کریستال ریپورتتون بود.شما میتونین از کلاس دیزاینی که انجام دادین (منظورم کریستال ریپورته ساخته شدنتونه) در هر فرمی و هرجایی از کلاسش استفاده کنید مثه من که استفاده کردم.

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

Public نمیشه چون نیازی به Public شدن نداره,public وقتی نیازه که بخوای از یه فرم دیگه بهش دسترسی داشته باشی و مقادیر بدی اما وقتی خودش پیش فرض public هست چرا دوباره public شه؟دقتم کنید من تو فرم اول بدونه اینکه بگم crystal report رو public کن براش کد نوشتم و بهش پاس دادم.

اگه منظورتون از Public کردن چیز دیگست لطفا توضیح بدین.

مرسی

موفق باشی
بایت بایت

نه آقا یوسف کد نویسی شما رو من متوجه می شوم اما اگه پست اول این تاپیک رو دقت کنید، من هم همون کد شما رو نوشته بودم ولی موندم هیرون که چرا از شما جواب داد و از من خطای "invalid index" داد.
برای همین پرسیدم که کجا رو دستکاری کردین که درست شد؟

باتشکر

Ali0Boy
سه شنبه 24 مرداد 1391, 01:08 صبح
آقا یوسف مشکل حل شد. من فهمیدم کجا سوتی داده بودم.

میگم شاید دوستان هم به مشکل من بر بخورند.
من از منوی Parameter Fields یه فیلد جدید با نام Text1 ایجاد کردم و وقتی هم اون رو روی صفحه ی کریستال ریپورت انداختم، نام آن رو نیز از Text11 به Text1 تغییر دادم.
حال وقتی کریستال ریپورت با کد نویسی می خواست مقدار دهی کند می موند که چکار کند و به قول خودمون هنگ می کرد. :قهقهه:

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

باتشکر فراوان

Y_Safaiee
سه شنبه 24 مرداد 1391, 01:08 صبح
من هیچی رو دست نزدم

فقط یه پارامتر دیگه ساختم (تو کریستال ریپورت و پنجره Field Explorer روی Parameter Fields راست کلیک کردم و New رو انتخاب و سپس نام متغییرمو نوشتم و نوعشو String کردم)

همین

Ali0Boy
سه شنبه 24 مرداد 1391, 01:18 صبح
من هیچی رو دست نزدم

فقط یه پارامتر دیگه ساختم (تو کریستال ریپورت و پنجره Field Explorer روی Parameter Fields راست کلیک کردم و New رو انتخاب و سپس نام متغییرمو نوشتم و نوعشو String کردم)

همین

ممنون آقا یوسف توی پست قبلی که زدم، گفتم که سوتی من کجا بوده و شما درست می گین به هیچ چیز دست نزده اید.
باتشکر از شما و دیگر دوستان عزیز مخصوصا علی اقا که صبوری کردند.