PDA

View Full Version : تاریخ شمسی - DataGrid - Sql Server



bit
یک شنبه 14 تیر 1383, 07:12 صبح
با سلام به حرفه ای های عزیز

چگونه تاریخ شمسی را در Sql Server 2000 و DataGrid استفاده می کنیم؟

من در رابط کاربر، تاریخ را به صورت شمسی می خواهم ببینم. پس با کد های تبدیل شمسی به میلادی (وبر عکس) برای TextBox ها تاریخ میلادی که در Table ذخیره شده را به صورت شمسی نشان میدهم.

اما نمی توانم تاریخی که در DataGrid نمایش داده می شود را شمسی کنم.
DataGrid را Bind کرده ام به فیلدهای بانک اطلاعاتی ام.

باید مشکل رایجی باشد اما روی اینترنت تا حالا جوابی پیدا نکردم.
ممنون

h_rezaei
یک شنبه 14 تیر 1383, 23:30 عصر
می تونی Binding رو عوض کنی یه Binding جدید بسازی که آدرس پروسیجر تبدیل تاریخ هجری به شمسی را بهش پاس کنی

sh
یک شنبه 14 تیر 1383, 23:39 عصر
زمانی که میخوای اطلاعات را در Dataset پر کنی عملیات تبدیل رو انجام بده و فکر کنم در دستور SELECT اسکیو الی که مینویسی هم میتونی تابع خارجی بکار ببری و عملیات تبدیل رو انجام بدی یا حتی بعد از پر کردن دیتا ست هم با یه جستجوی سریع همه تاریخ ها رو عوض کن و بعد دیتا ست رو به دیتاگرید بایند کن اینجوری دیگه لازم نیست بایند استاندارد رو هم عوض کنی (البته در این مورد شاید کمی سرعت پردازش کمتر شود)

h_rezaei
دوشنبه 15 تیر 1383, 08:08 صبح
در دستور SELECT اسکیو الی که مینویسی هم میتونی تابع خارجی بکار ببری
نمیشه

بعد از پر کردن دیتا ست هم با یه جستجوی سریع همه تاریخ ها رو عوض کن
راه حل های اساسی ارائه میدی ها

faramarz_s
دوشنبه 15 تیر 1383, 12:36 عصر
نمی توانم تاریخی که در DataGrid نمایش داده می شود را شمسی کنم
منظور شما از شمسی چیه؟
شما تاریخ ورودی را براساس یک تابعی به شمسی تبدیل کرده و مشکل حل است.
حالا یه وقت بخواهی که کاراکترهای عددی اون را فارسی کنی یه بحثه ترتیبش یه بحثه و خود تاریخ شمسی یه بحث
OK
حالا برادر کدومش را مشکل داری؟
در ضمن تو اکثر سایتا دقت کنی متوجه میشه که تاریخ کاملا درست نمایش داده میشه. :wink:

:flower:

faramarz_s
دوشنبه 15 تیر 1383, 12:40 عصر
با فرض این که شما تاریخ شمسی را وارد دیتا بیس ریخته اید در نمایش آن مشکلی نخواهید داشت:
http://isfahanb.europe.webmatrixhosting.net/t-list.aspx
حالات ممکن را در بخش مدیریت امتحانکنید

bit
دوشنبه 15 تیر 1383, 17:21 عصر
ممنون از جوابتون

همین طور که گفتم متد تبدیل بین دو تا تاریخ رو دارم و ازش توی TextBox ها استفاده می کنم.

h_rezaee عزیز، راه حل شما را نفهمیدم چجوری انجام می شه :oops:

sh عزیز، در عملی بودن راه حل شما شک دارم. آیا مطمئنی؟ به هر حال ممنون :تشویق:

یه راه حل خودم براش پیدا کردم که تو پست بعدی قشنگ توضیح میدم :gift:

bit
دوشنبه 15 تیر 1383, 18:02 عصر
یادم رفت بگم مشکل من توی Windows Forms هست نه توی Web Forms :oops:

sh
دوشنبه 15 تیر 1383, 18:50 عصر
عزیزان من فی البداهه یه چیزی نوشتم ولی هر چی هست این کار خیلی راحتی باید قبل از پر کردن دیتا ست یا لاقل بایند کردن کنترلها به دیتا ست شما فیلدهای مربوطه رو به تاریخ شمسی برای نمایش تغییر بدی

h_rezaei
دوشنبه 15 تیر 1383, 19:34 عصر
فرض کن یه تابع تبدیل میلادی به شمسی داری به اسم milady_to_shamsi
یه Binding جدید تعریف کن بعد


Add handler BindingName.format, addressof Milady_to_shamsi

faramarz_s
چهارشنبه 17 تیر 1383, 12:19 عصر
این کار خیلی راحتی باید قبل از پر کردن دیتا ست
چرا؟
لزوما اینطور نیست البته میشه(امکانپذیره!) :مخالف:

faramarz_s
چهارشنبه 17 تیر 1383, 12:26 عصر
ببینید آقا
1-تاریخ شمسی یا هر چیزی تو دیتابیسه
2-میخواهید اونو بازیابی کرده و در دیتا گرید نمایش بدید درست :roll:
3-شما از همون اول که می خواهید در دیتا بیس ذخیره کنید ورود تاریختان را شمسی کنید :lol:
شمسی وارد کنید :):
دیتا گرید که از خودش پردازشی نمی کنه عینا همونی که در دیتابیس هست را نشون می ده .
حله؟ :flower:

sh
چهارشنبه 17 تیر 1383, 16:35 عصر
فرامرز خان خب اگر از اول فارسی وارد کنه که این همه پاسخ بهش نمیدادیم آقا میخواد تاریخ میلادی ذخیره کنه ولی موقع خونده و نشان دادن فارسی باشه

faramarz_s
چهارشنبه 17 تیر 1383, 19:00 عصر
آقا میخواد تاریخ میلادی ذخیره کنه ولی موقع خونده و نشان دادن فارسی باشه


Are u ok?
به نظر من این سخیف ترین کار ممکنه ولی اگر دوست ما اینطور می خواهد من راه حلی براش ندارم :( :skull:

sh
چهارشنبه 17 تیر 1383, 21:21 عصر
من در رابط کاربر، تاریخ را به صورت شمسی می خواهم ببینم. پس با کد های تبدیل شمسی به میلادی (وبر عکس) برای TextBox ها تاریخ میلادی که در Table ذخیره شده را به صورت شمسی نشان میدهم.

اما نمی توانم تاریخی که در DataGrid نمایش داده می شود را شمسی کنم

h_rezaei
پنج شنبه 18 تیر 1383, 04:04 صبح
به نظر من این سخیف ترین کار ممکنه
ذخیره کردن تاریخ به فرمت میلادی در دیتا بیس اولا حجم کمتری می گیرد (مثلا فرمت Dateدر SQLServer فقط 4 بایت حافظه می گیرد) ثانیا امکان استفاده از توابع توکار زبانهای مختلف برنامه نویسی برای مقایسه دو تاریخ ویا جمع و تفریق دو تاریخ و.....را به وجود می آورد

bit
پنج شنبه 18 تیر 1383, 06:27 صبح
راهی که من انتخاب کردم این است :
چون در Sql Server 2000 راهی برای ذخیره تاریخ به شکل شمسی نیافتم، پس صرفاً هنگام نمایش اطلاعات، آنرا به شمسی تبدیل می کنم.

برای اینکار از کلاس System.Windows.Forms.DataGridTextBoxColumn (که هنگام Style دهی به Grid به کار می رود) یک کلاس جدید درایو کردم به نام DataGridShamsiDateColumn. در متد GetColumnValueAtRow ابتدا همین متد از کلاس پایه را برای به دست آوردن تاریخی که باید نمایش داده شود صدا می زنم و سپس تاریخ را به شمسی تبدیل کرده و به صورت یک string آنرا برمی گردانم. تمام!

این برای DataGrid بود. برای TextBox هم کاری مشابه آنرا انجام می دهیم.

فرامرز عزیز به فواید ذخیره تاریخ به صورت فرمت Date توجه داشته باشند: عملیات روی آن به صورت مستقیم، چک کردن خطا ها، انجام query های قوی تر ...

چون این یک مشکل عمومی است اگر راه حل دیگری دارید ارائه دهید. حد اقل به درد دیگرانی که مثل من چند ساعت روی Internet دنبال جواب گشته اند می خورد. :wink:

Spoofed
پنج شنبه 18 تیر 1383, 08:25 صبح
مرجع بی نظیری در مورد دیتاگرید و سی شارپ و امثال آن :
http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp


برای کاری که شما می خواهید انجام دهید راه حل های زیادی وجود دارد
1- مانند مثال http://www.syncfusion.com/faq/winforms/Files/DataGridCellFormatting.zip رخداد سفارشی برای دیتاگرید بنویسید و سپس هر مقداری را که بایند می شود خوانده ،‌تبدیل کرده و نمایش دهید
2- یک فیلد کمکی به جدول دیتابیس اضافه کنید و مقادیر فیلد تاریخ را به شمسی نیز نگه دارید. انجام اینکار ساده است و توابع انجام اینکار رو در بخش SQL-Server و مخصوص محیط آن در همین سایت می تونید پیدا کنید (فکر کنم آقای مهدوی نوشته بودند آنرا)
3- راه دیگر، اضافه کردن این DataColumn به صورت داینامیک است. شما بدیهی است که از داده های خود یک DataTable دارید و با چند خط کد نویسی می توان فیلد تاریخ شمسی را به صورت داینامیک اضافه کرد.
4- نگهداری تاریخ به صورت شمسی و استرینگ مرسوم تر است! چون اکثر گزارش گیری ها از تاریخ تا تاریخ است. بنابراین ذخیره سازی تاریخ به صورت رشته و با در نظر گرفتن صفرهای پشت عدد، برای اعداد کمتر از 10 همیشه جواب درست خواهید گرفت. این تکنیک به ارث رسیده از دوران فاکس پرو تحت داس است که هنوز حرف اول را در ادارات دولتی ما مانند بانک و ... می زند! (منظور این بود که تاریخ 1/1/82 را به صورت 01/01/82 ذخیره کنید تا در مقایسه رشته ها مشکلی پدید نیاید ). من از این روش استفاده می کنم و تا بحال یک مورد هم نبوده که پاسخگو نباشد. خوشبختانه توابعی که در مورد تاریخ میلادی به صورت ذاتی در کلاس های دات نت فریم ورک وجود دارند سالها قبل با رشته ها نیز پیاده سازی شده اند. نمونه ی آنرا نوشته شده توسط آقای h_r_110 در بخش دلفی می تونید پیدا کنید و از آن ایده بگیرید.


موفق باشید

milad.biroonvand
یک شنبه 18 مرداد 1388, 12:59 عصر
با سلام

من هم نظرات بالا رو تاييد مي كنم. نظريه سوم از همه بهتر است .