PDA

View Full Version : سوال: چه طوری تاریخ شمسی رو به StimulReport پاس بدیم ؟!



NasimBamdad
یک شنبه 15 اردیبهشت 1392, 10:17 صبح
سلام .

چند وقتی است که درگیر این مشکل هستم . در حال حاضر تاریخ رو در DB به صورت NvarChar ( شمسی ) , و در قالب Date به صورت میلادی ذخیره می کنم

برای نمایش از NvarChar و شمسی استفاده می کنم و بعد وقتی می خوام برای گزارش گیری استفاده کنم به میلادی تبدیلش می کنم یا معادل مقدار Date از DB قرار می دم و به StimulReport پاس می دم .

وقتی با شمسی پاس می دم همش Error های مربوط به تبدیل واحد های string , Date میده .

تازه باید 2 تا Variable بسازم و مقادیر میلادی رو در اون Variable ها قرار بدم و بعد توی فایل گزارش اون Variable ها رو به پارامتر های DataSource نسبت بدم .

راه حل عملی و ساده و بی درد سرش چیه ؟!

keyvan_s89
یک شنبه 15 اردیبهشت 1392, 11:01 صبح
سلام

تویه Variable قسمت Design یه New Category میسازی با اسم Date بعد روی اون Date یه New Connection میسازی و در پنجره Name میزنی shDATE بعد درگ میکنی رویه فرم و Save میکنی

توی فرم این مینویسی
Using stimulsoft.report.dictionary


مرحله آخر هم


System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
string Date = pc.GetYear(DateTime.Now) + "/" + pc.GetMonth(DateTime.Now) + "/" + pc.GetDayOfMonth(DateTime.Now);
StiVariable Dt = new StiVariable("Date", "shDATE", typeof(string), Date, false);
stireport1.Dictionary.Variables.Add(Dt);
stireport1.Show();

NasimBamdad
چهارشنبه 18 اردیبهشت 1392, 14:40 عصر
سلام

تویه Variable قسمت Design یه New Category میسازی با اسم Date بعد روی اون Date یه New Connection میسازی و در پنجره Name میزنی shDATE بعد درگ میکنی رویه فرم و Save میکنی

توی فرم این مینویسی
Using stimulsoft.report.dictionary


مرحله آخر هم


System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
string Date = pc.GetYear(DateTime.Now) + "/" + pc.GetMonth(DateTime.Now) + "/" + pc.GetDayOfMonth(DateTime.Now);
StiVariable Dt = new StiVariable("Date", "shDATE", typeof(string), Date, false);
stireport1.Dictionary.Variables.Add(Dt);
stireport1.Show();



با این کار شما دارید تاریخ شمسی رو بازم بهش پاس می دید . در صورتی که StimulReport اصلا تاریخ شمسی قبول نمی کنه و همش Error میده که تاریخ باید در محدوده A تا B باشه . یعنی یک تاریخ میلادی .

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

sgn2006
چهارشنبه 18 اردیبهشت 1392, 16:13 عصر
سلام

من هم این مشکل را دارم یعنی نمی تونم تاریخ شمسی رو به استیمول پاس بدم (این کار توی کریستال ریپرت عین خوردن یه شکلات خوشمزه بود) یه ایده ای به ذهنم خطور کرده اما هنوز پیاده اش نکردم

تاریخ رو به عدد تبدیل کنید ، مثلا ما بازه 01/02/1392 تا تاریخ 31/02/1392 رو می خواهیم ، / رو برمی داریم می شه 13920201 الی 13920231 ... از اون ور توی استیمول یه فرمول می نویسیم به نام X که / رو از فیلد تاریخ برداره .... بعد توی سورس تاریخی که / نداره رو به متغیر X ارسال می کنیم.....

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

NasimBamdad
پنج شنبه 19 اردیبهشت 1392, 08:57 صبح
الان من همچین کدی دارم


StiReport stiReport1 = new StiReport();
stiReport1.Load("Reports\\Surgery_Report.mrt");
stiReport1.Dictionary.Databases.Clear();
stiReport1.Dictionary.Databases.Add(new StiSqlDatabase("Connection",ConfigurationManager.AppSettings["ConnectionString"]));
stiReport1.Dictionary.DataSources["DS1"].Parameters[0].Value = uc1.VDate;
stiReport1.Dictionary.DataSources["DS1"].Parameters[1].Value = uc2.VDate;
stiReport1.Show();


مستقیما میام تاریخ شمسی رو به StimulReport پاس میدم . یعنی خود تاریخ شمسی رو .

به این صورت که پارامتر هایی که در قسمت datasource درست کردم از نوع NvarChar هستند و منم مقدار تاریخ شمسیم رو به اون ها پاس دادم .

این طوری باید مشکل حل بشه . اما این Error رو میده .



SqlCommand.Prepare method requires all variable length parameters to have an explicitly set non-zero Size.


فکر کنم این روش اصولی باشه . وقتی فیلد ما در DataBase به صورت NvarChar هست ، میشه از توابع BETWEEN برای تاریخ استفاده کرد . در خود SQL Server Managment وقتی کوری می نویسم مشکلی نیست .

اما مشکل پاس دادن به StimulReport رو داریم !!

keyvan_s89
پنج شنبه 19 اردیبهشت 1392, 09:13 صبح
با این کار شما دارید تاریخ شمسی رو بازم بهش پاس می دید . در صورتی که StimulReport اصلا تاریخ شمسی قبول نمی کنه و همش Error میده که تاریخ باید در محدوده A تا B باشه . یعنی یک تاریخ میلادی .

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

چه اروری میده؟

NasimBamdad
پنج شنبه 19 اردیبهشت 1392, 12:33 عصر
سلام

تویه Variable قسمت Design یه New Category میسازی با اسم Date بعد روی اون Date یه New Connection میسازی و در پنجره Name میزنی shDATE بعد درگ میکنی رویه فرم و Save میکنی

توی فرم این مینویسی
Using stimulsoft.report.dictionary


مرحله آخر هم


System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
string Date = pc.GetYear(DateTime.Now) + "/" + pc.GetMonth(DateTime.Now) + "/" + pc.GetDayOfMonth(DateTime.Now);
StiVariable Dt = new StiVariable("Date", "shDATE", typeof(string), Date, false);
stireport1.Dictionary.Variables.Add(Dt);
stireport1.Show();



من 2 تا تاریخ ارسال می کنم و باید و باید به DataSource ارسالش کنم . یعنی 2 تا پارامتر در DataSource دارم که باید مقدار دهی بشوند .

حالا اون پارامتر ها رو با چه نوعی داشته باشم ؟ String , Date و... ؟؟؟

NasimBamdad
پنج شنبه 19 اردیبهشت 1392, 12:39 عصر
به روش شما انجام دادم و این هم کد هام هست


StiReport stiReport1 = new StiReport();
stiReport1.Load("Reports\\Surgery_Report.mrt");
stiReport1.Dictionary.Databases.Clear();
stiReport1.Dictionary.Databases.Add(new StiSqlDatabase("Connection",ConfigurationManager.AppSettings["ConnectionString"]));

StiVariable Dt1 = new StiVariable("Date", "fdate", typeof(string), uc1.VDate, false);
stiReport1.Dictionary.Variables.Add(Dt1);

StiVariable Dt2 = new StiVariable("Date", "ldate", typeof(string), uc2.VDate, false);
stiReport1.Dictionary.Variables.Add(Dt2);
stiReport1.Show();


نوع پارامتر های DataSource رو وقتی Variant یا Date می زنم ، هیچی تو گزارش نمیاره و سفید هست ، یعنی گزارشم اطلاعات توش نیست .

اما نوع های دیگه که می زنم بسته به نوعشان اررور های متفاوتی نظیر تبدیل این نوع به آن نوع رو میاره .

کجای کارم اشتباه ؟!

keyvan_s89
پنج شنبه 19 اردیبهشت 1392, 14:37 عصر
من 2 تا تاریخ ارسال می کنم و باید و باید به DataSource ارسالش کنم . یعنی 2 تا پارامتر در DataSource دارم که باید مقدار دهی بشوند .

حالا اون پارامتر ها رو با چه نوعی داشته باشم ؟ String , Date و... ؟؟؟

string بزن

NasimBamdad
پنج شنبه 19 اردیبهشت 1392, 14:49 عصر
NvarChar داره . اما صفحه گزارش رو سفید و خالی میاره !

keyvan_s89
پنج شنبه 19 اردیبهشت 1392, 14:59 عصر
این کد های منه

System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
string Date = pc.GetYear(DateTime.Now) + "/" + pc.GetMonth(DateTime.Now) + "/" + pc.GetDayOfMonth(DateTime.Now);

SqlConnection objcon = new SqlConnection();
objcon.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Db_3.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlCommand objcom = new SqlCommand();
objcom.CommandText = "select * from loan";
objcom.CommandType = CommandType.Text;
objcom.Connection = objcon;
SqlDataAdapter da = new SqlDataAdapter(objcom);
DataTable dt = new DataTable();
objcon.Open();
da.Fill(dt);
objcom.Clone();
stiReport2.Load("bsearch.mrt");
stiReport2.RegData("DT1", dt);
StiVariable Dt = new StiVariable("Date", "shDATE", typeof(string), Date, false);
stiReport2.Dictionary.Variables.Add(Dt);
stiReport2.Show();

NasimBamdad
پنج شنبه 19 اردیبهشت 1392, 15:17 عصر
در واقع شما DataTable رو براش ارسال کردی ، نه اینکه بیای برای DataSource پارامتر ارسال کنی !

keyvan_s89
پنج شنبه 19 اردیبهشت 1392, 15:23 عصر
خوب آره دیگه

NasimBamdad
پنج شنبه 19 اردیبهشت 1392, 15:37 عصر
ولی من کوری رو در DataSource نوشتم و فقط پارامتر هاش رو براش ارسال می کنم .

برای این روش راه حلی نیست ؟!

NasimBamdad
شنبه 21 اردیبهشت 1392, 10:19 صبح
منم از DataTable استفاده کردم و مشکلات حل شد . ممنونم!

morteza271
شنبه 21 اردیبهشت 1392, 11:11 صبح
منم از DataTable استفاده کردم و مشکلات حل شد . ممنونم!
به نظرم من از این روش استفاده کنید خیلی بهتره.
چرا که کنترل بهتری روی داده ها دارین و راحت تر میتونید امور رو انجام بدین.
یکی از دلایل دیگه هم اینه :
به هر حال شما به احتمال زیاد یه بار اطلاعات رو از بانک خوندین و توی فرمتون(مثلا توی یه گرید) نمایش دادین و میتونید همونا رو بفرستین واسه گزارش و نیازی نیست که دوباره همون اطلاعات رو توی گزارش از بانک بخونید.
موفق باشید