سلام
تاریخ در بانکم میلادیه ، تو برنامه شمسی میکنم
ولی حالا نمی دونم که چطور وقتی گزارش میگیرم تاریخ هر فیلد رو شمسی کنم
یه تاریخ شمسی رو مشکل ندارم بزارم تو کریستال ولی برا تک تک فیلد های بانکم نمی دونم چیکار کنم
سلام
تاریخ در بانکم میلادیه ، تو برنامه شمسی میکنم
ولی حالا نمی دونم که چطور وقتی گزارش میگیرم تاریخ هر فیلد رو شمسی کنم
یه تاریخ شمسی رو مشکل ندارم بزارم تو کریستال ولی برا تک تک فیلد های بانکم نمی دونم چیکار کنم
سلام ،
یکی از راههاش اینه خوده تاریخ رو در بانک به صورت شمسی ذخیره کنین ، یعنی فیلد تاریخ در بانک دارای نوع Text باشه و داخل برنامه از طریق PersianCalender تاریخ رو در بانک به صورت شمسی ذخیره کنی و در گزارش ها ازش استفاده کنی.
یک فیلد فرمول Formula Field در کریستال ریپورت بساز بعد کد زیر رو توش Paste کن .
بجای CurrentDate که تاریخ کنونی سیستم را شمسی میکند فیلد تاریخ میلادی جدول مورد نظر رو قرار بده.
موفق باشی.
numbervar iMiladiMonth:=month(CurrentDate);
numbervar iMiladiDay:=day(CurrentDate);
numbervar iMiladiYear:=year(CurrentDate);
numbervar shamsiDay;
numbervar shamsiMonth;
numbervar shamsiYear;
numbervar dayCount;
numbervar farvardinDayDiff;
numbervar deyDayDiff;
numberVar array sumDayMiladiMonth :=[0,31,59,90,120,151,181,212,243,273,304,334];
numberVar array sumDayMiladiMonthLeap := [0,31,60,91,121,152,182,213,244,274,305,335];
numberVar farvardinDayDiff:=79;
numbervar miladiYear1:=int(imiladiYear mod 100);
numbervar miladiYear2:=int(imiladiYear mod 4);
numbervar miladiYear3:=int(imiladiYear mod 100);
numbervar miladiYear4:=int(imiladiYear mod 400);
if (((miladiYear1 <> 0 )and (miladiYear2 =0))or((miladiYear3=0)and (miladiYear4=0))) then
dayCount := sumDayMiladiMonthLeap[iMiladiMonth] + iMiladiDay
else
dayCount := sumDayMiladiMonth[iMiladiMonth] + iMiladiDay;
miladiYear1:=int((imiladiYear-1) mod 100);
miladiYear2:=int((imiladiYear-1) mod 4);
miladiYear3:=int((imiladiYear-1) mod 100);
miladiYear4:=int((imiladiYear-1) mod 400);
if (((miladiYear1 <> 0 )and (miladiYear2 =0))or((miladiYear3=0)and (miladiYear4=0))) then
deyDayDiff := 11
else
deyDayDiff := 10;
if (dayCount > farvardinDayDiff) then
(
dayCount := dayCount - farvardinDayDiff;
if (dayCount <= 186) then
(
select int(dayCount mod 31)
case 0:(
shamsiMonth :=int( dayCount / 31);
shamsiDay := 31;
)
default:(
shamsiMonth := int(dayCount / 31) + 1;
shamsiDay :=int(dayCount mod 31);
);
shamsiYear := iMiladiYear - 621;
)
else
(
dayCount := dayCount - 186;
select dayCount mod 30
case 0:(
shamsiMonth := int(dayCount / 30) + 6;
shamsiDay := 30;
)
default:(
shamsiMonth := int(dayCount / 30) + 7;
shamsiDay := int(dayCount mod 30);
);
shamsiYear := iMiladiYear - 621;
)
)
else
(
dayCount := dayCount + deyDayDiff;
select int(dayCount mod 30)
case 0 :(
shamsiMonth := int(dayCount / 30) + 9;
shamsiDay := 30;
)
default:(
shamsiMonth := int(dayCount / 30) + 10;
shamsiDay := int(dayCount mod 30);
);
shamsiYear := iMiladiYear - 622;
);
stringvar exitmy:=totext(shamsiYear)+' / '+totext(shamsiMonth)+' / '+totext(shamsiDay);
exitmy;
ضمنا یادت باشه حالت کد روی crystal syntax باشه.
خود C# کلاسی برای تبدیل تاریخ میلادی به شمسی و برعکس داره
شما میتونی تاریخ شمسی رو به میلادی تبدیل کنید و در دیتا بیس ذخیره کنید و هنگام خوندن از دیتابیس دوباره اونرو به شمسی تبدیل کنید و نمایش دهید
اسم کلاس الان یادم نیست و دسترسی به ویژوال استادیو ندارم ولی فکر کنم PersianDate باشه میتونی یه جستجو توی Help ویژوال بکنی
و اما برای تبدیل تمام فیلدهای تاریخ میتونی خروجی گرفته شده از دستور Sql را در یک Datatable - dt1 ریخته و حالا یک Datatable - dt2 جدید ایجاد کرده و توسط یک حلقه تمامی سطرهای dt1 را در dt2 ریخته فقط زمانی که میخواهید فیلدهای ستون تاریخ را در dt2 کپی کنید آن را تبدیل به شمسی بکنید
حالا dt2 را به کریستال ریپورت پاس بدید
نکته دیگر اینکه اگر جدول شما بسیار سنگین است و رکوردهای خروجی بسیار زیاد به جای این کار میتونید برای تاریخ توی دیتابیس دوتا فیلد یکی میلادی و دیگری شمسی که از نوع Nvarchar است ، تعریف کنید
موفق باشی
آخرین ویرایش به وسیله mahdi.ahmadian2010 : چهارشنبه 03 خرداد 1391 در 09:54 صبح