PDA

View Full Version : سوال: نمایش تاریخ شمسی در گرید ویو و ذخیره میلادی در دیتابیس



ostovarit
چهارشنبه 26 خرداد 1389, 12:00 عصر
من برای اینکه کاربر تاریخ شمسی رو تو گرید ویو انتخاب کنه از یک کنترل DateTimePicker فارسی استفاده کردم ولی برای ذخیره تاریخ در دیتابیس مجبور شدم که از نوع nvarchar استفاده کنم ... تا الان برای فیلتر کردن اطلاعاتم رشته های تاریخ رو با هم مقایسه میکردم و مشکلی هم نداشته ...

- بدلیل انکه نوع تاریخ رو Datetime نگرفتم به چه مشکلاتی ممکنه بر بخورم؟

- ایا کنترلی برای DataGridView دارید که تاریخ رو به صورت میلادی ذخیره و به صورت شمسی نمایش بده و کابر بتونه اونو در گرید ویرایش کنه؟؟؟

NIK
چهارشنبه 26 خرداد 1389, 12:08 عصر
من هم قبلا در یک پروژه کوچیک برای تاریخ از nvarchar استفاده کردم. اما بعداً که خواستم برنامه رو کمی توسعه بدم برای بعضی تحلیل های کوچیک مجبور شدم پردازشهای زیادی انجام بدم که سرعت برنامه رو کاهش میداد.
مشکل نمایش تاریخ شمسی در گریدویو رو من به این صورت حل کردم.
با استفاده از یک کامپوننت تاریخ ورودی رو به میلادی تبدیل کرده و در دیتابیس به صورت Datetime ذخیره کردم.
هنگام گزارش گیری، نتیجه Query مورد نظر رو در یک data table ریختم و بعد سطر به سطر تاریخ رو تبدیل به شمسی کردم و دیتاسورس گریدویو رو همون data table قرار دادم.

mmd2009
چهارشنبه 26 خرداد 1389, 12:15 عصر
سلام دوست عزیز

عکس های زیر رو ببین مربوط میشه به یکی از برنامه هام

یعنی شما نمیخوای تاریخ شمسی تو بانکت اینطوری ذخیره بشه؟

http://up.iranblog.com/Files/d9bb54224ec243da8522.JPG

و تو گرید ویو اینطوری نمایش داده بشه ؟

http://up.iranblog.com/Files/80d34cf738da48c68f72.JPG

زنده باد یوونتوس

ostovarit
چهارشنبه 26 خرداد 1389, 15:15 عصر
سلام
در مورد نمایش همون طوری که تو تصویر دوی شما هست درسته ... میخوام به همون شکل نمایش داده بشه و کاربر با یک DateTimePicker در گرید ویو بتونه اونو ویرایش کنه و ذخیره کنه

اما در مورد دیتابیس میخوام فیلد رو datetime بگیرم و تاریخ رو میلادی ذخیره کنم ... یعنی نمایش به صورت شمسی در گرید ذخیره به صورت میلادی در دیتابیس ...

ostovarit
چهارشنبه 26 خرداد 1389, 15:24 عصر
درسته این کار رو من بلدم تاریخ رو شمسی کنم و در گرید نمایش بدم ولی نمیخوام از سلول های عادی گرید استفاده کنم میخوام یک Datetime picker در یک سلول بزارم و اون تاریخ میلادی رو از دیتابیس بخونه به صورت شمسی نمایش بده و بعد از ویرایش توسط کاربر دوباره به صورت میلادی در دیتابیس ذخیره بشه ...


اینجا دو تا مسئله هست :

ا- یک تایم پیکر رو باید به سلول گرید اضافه کنیم
2-تایم پیکر باید توانایی ساپورت تاریخ شمسی و در نهایت تبدیل اون در زمان ذخیره به میلادی رو داشته باشه ...

NIK
شنبه 29 خرداد 1389, 08:56 صبح
ا- یک تایم پیکر رو باید به سلول گرید اضافه کنیم
2-تایم پیکر باید توانایی ساپورت تاریخ شمسی و در نهایت تبدیل اون در زمان ذخیره به میلادی رو داشته باشه ...

تایم پیکر توانایی ساپورت تاریخ شمسی که کامپوننت PersianDate میده نداره.

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

ostovarit
شنبه 29 خرداد 1389, 09:44 صبح
میدونم ولی کلا روش ساخت این جور کامپوننت ها رو بلد نیستم که بخوام کنترل های دیگره رو overright کنم و بهشون خاصیت های جدید اضافه کنم ...

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

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

لینک msdn واسم نزارید ...

اموزش ساده از پایه میخوام

goolestan
شنبه 29 خرداد 1389, 09:59 صبح
با این script یه تابع به بانک sql اضافه کن و برای خواندن توسط select نام فیلدت را با این تابع استفاده کن
select dbo.miladiToShamsi(fildName) from Table name

CREATE FUNCTION [dbo].[MiladiTOShamsi] (@MDate DateTime)
RETURNS Varchar(10)
AS
BEGIN
DECLARE @SYear as Integer
DECLARE @SMonth as Integer
DECLARE @SDay as Integer
DECLARE @AllDays as float
DECLARE @ShiftDays as float
DECLARE @OneYear as float
DECLARE @LeftDays as float
DECLARE @YearDay as Integer
DECLARE @Farsi_Date as Varchar(100)
SET @MDate=@MDate-CONVERT(char,@MDate,114)

SET @ShiftDays=466699 +2
SET @OneYear= 365.24199


SET @SYear = 0
SET @SMonth = 0
SET @SDay = 0
SET @AllDays = CAst(@Mdate as Real)

SET @AllDays = @AllDays + @ShiftDays

SET @SYear = (@AllDays / @OneYear) --trunc
SET @LeftDays = @AllDays - @SYear * @OneYear

if (@LeftDays < 0.5)
begin
SET @SYear=@SYear+1
SET @LeftDays = @AllDays - @SYear * @OneYear
end;

SET @YearDay = @LeftDays --trunc
if (@LeftDays - @YearDay) >= 0.5
SET @YearDay=@YearDay+1

if ((@YearDay / 31) > 6 )
begin
SET @SMonth = 6
SET @YearDay=@YearDay-(6 * 31)
SET @SMonth= @SMonth+( @YearDay / 30)
if (@YearDay % 30) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 7) * 30)
end
else
begin
SET @SMonth = @YearDay / 31
if (@YearDay % 31) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 1) * 31)
end
SET @SDay = @YearDay
SET @SYear=@SYear+1

SET @Farsi_Date = CAST (@SYear as VarChar(10)) + '/' + CAST (@SMonth as VarChar(10)) + '/' + CAST (@SDay as VarChar(10))
Return @Farsi_Date



END