PDA

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



rezamahdizadeh
چهارشنبه 12 شهریور 1393, 02:34 صبح
جهت ایجاد فیلدهایی برای تاریخ، بهترین روش برای ذخیره تاریخ های فارسی در SQL Server چیست؟ خود مردم کشورهایی که با تاریخ میلادی کار می کنند مشکلی ندارند زیرا فیلدی از نوع DateTime توسط SQL Server و سایر پایگاه داده ها پشتیبانی می شود. اگر از نوع رشته تعریف شود روی بحثهای شروطی مانند بین دو تاریخ مشکل داریم. عددی هم مرتب باید تبدیلهایی انجام دهیم. مثلا تبدیل 1393/2/8 به 13930208 در موقع ذخیره

mohammad reza beizavi
دوشنبه 17 شهریور 1393, 01:07 صبح
درود
برای ثبت، نگهداری و کوئری گرفتن از تاریخ با تمام امکاناتی که برای نوع داده تاریخ وجود دارد و تاریخ هم از نوع شمسی باشد راهکار بسایر خوب و قدرتمندی در sql SERVER 2012 و بالاتر وجود دارد و آن هم اینکه می توانید با استفاده از CLR نوع داده مورد نظر خود را بسازید و از آن استفاده کنید. در مجموعه زیر این کار با تمام جزییات و به بهترین نحو انجام، تست و استفاده شده. مطمئنا نیاز شما را برطرف خواهد کرد:
قسمت اول (http://www.dotnettips.info/post/1297/%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-%DB%8C%DA%A9-datatype-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%DA%AF%D9%87%E2%80%8C%D8%AF%D8%A7%D8%B1%DB%8 C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%AE%D9%88%D8%B1%D8%B4%DB%8C%D8%AF%DB%8C-1)
قسمت دوم (http://www.dotnettips.info/post/1299/%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-%DB%8C%DA%A9-datatype-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%DA%AF%D9%87%E2%80%8C%D8%AF%D8%A7%D8%B1%DB%8 C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%AE%D9%88%D8%B1%D8%B4%DB%8C%D8%AF%DB%8C-2)
قسمت سوم (http://www.dotnettips.info/post/1303/%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-%DB%8C%DA%A9-datatype-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%DA%AF%D9%87%E2%80%8C%D8%AF%D8%A7%D8%B1%DB%8 C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%AE%D9%88%D8%B1%D8%B4%DB%8C%D8%AF%DB%8C-3)

rezamahdizadeh
جمعه 21 شهریور 1393, 09:54 صبح
درود
برای ثبت، نگهداری و کوئری گرفتن از تاریخ با تمام امکاناتی که برای نوع داده تاریخ وجود دارد و تاریخ هم از نوع شمسی باشد راهکار بسایر خوب و قدرتمندی در sql SERVER 2012 و بالاتر وجود دارد و آن هم اینکه می توانید با استفاده از CLR نوع داده مورد نظر خود را بسازید و از آن استفاده کنید. در مجموعه زیر این کار با تمام جزییات و به بهترین نحو انجام، تست و استفاده شده. مطمئنا نیاز شما را برطرف خواهد کرد:
قسمت اول (http://www.dotnettips.info/post/1297/%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-%DB%8C%DA%A9-datatype-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%DA%AF%D9%87%E2%80%8C%D8%AF%D8%A7%D8%B1%DB%8 C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%AE%D9%88%D8%B1%D8%B4%DB%8C%D8%AF%DB%8C-1)
قسمت دوم (http://www.dotnettips.info/post/1299/%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-%DB%8C%DA%A9-datatype-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%DA%AF%D9%87%E2%80%8C%D8%AF%D8%A7%D8%B1%DB%8 C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%AE%D9%88%D8%B1%D8%B4%DB%8C%D8%AF%DB%8C-2)
قسمت سوم (http://www.dotnettips.info/post/1303/%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-%DB%8C%DA%A9-datatype-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%DA%AF%D9%87%E2%80%8C%D8%AF%D8%A7%D8%B1%DB%8 C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%AE%D9%88%D8%B1%D8%B4%DB%8C%D8%AF%DB%8C-3)



اگر کسی Visual Studio نداشته باشد و دلفی کار باشد چه کار کند؟
اگر یک بار آن را با روش CLR مطابق مثال ارائه شده بسازد آيا مي توان پس از آن با SQL این نوع فيلد را در جدول يا پايگاه داده ديگری تعريف کرد؟ در صورتي که پاسخ مثبت باشد آيا نمونه کاملي که همه قابليتها مثل نوع فيلد تاريخ و زمان ميلادی را داشته باشد داريد؟

mohammad reza beizavi
جمعه 21 شهریور 1393, 10:04 صبح
درود
خب یکبار با C#‎‎‎ اینکار رو انجام بدید و این Type رو داخل دیتابیس رو بسازید بعد دیگه این نوع داخل دیتابیستون هست و دیگه به Delphi یاC#‎‎‎ بستگی نداره و راحت می تونید مثل بقیه داده کوئری بگیرید.

rezamahdizadeh
جمعه 21 شهریور 1393, 16:20 عصر
درود
خب یکبار با C#‎‎‎‎ اینکار رو انجام بدید و این Type رو داخل دیتابیس رو بسازید بعد دیگه این نوع داخل دیتابیستون هست و دیگه به Delphi یاC#‎‎‎‎ بستگی نداره و راحت می تونید مثل بقیه داده کوئری بگیرید.

آيا نمونه کاملي از تاريخ شمسي را داريد که همه قابليتهاي نوع فيلد تاريخ و زمان ميلادی را داشته باشد؟

mohammad reza beizavi
جمعه 21 شهریور 1393, 20:13 عصر
نمونه کامل در همون مطالب جناب قنادی که گذاشتم هست. کامل بخونید اگر مشکلی بود بفرمایید تا تشریحش کنم.

rezamahdizadeh
شنبه 22 شهریور 1393, 19:00 عصر
نمونه کامل در همون مطالب جناب قنادی که گذاشتم هست. کامل بخونید اگر مشکلی بود بفرمایید تا تشریحش کنم.

منظورم درخواست فایل SQL script آن بود تا نیازی به نصب Visual Studio .net نداشته باشم.

mohammad reza beizavi
یک شنبه 23 شهریور 1393, 01:07 صبح
یه فایل dll میذارم
فرض بر اینکه این رو میذارید توی درایو D اینکار رو انجام بدین:


CREATE ASSEMBLY JalaliDate
FROM 'D:\prjJalaliDate.dll'
WITH PERMISSION_SET = SAFE;

بعد این کوئری رو اجرا کنید:


CREATE TYPE dbo.JalaliDate
EXTERNAL NAME JalaliDate.[JalaliDate];






بعد این جدول رو هم به صورت تستی بسازیدو استفاده کنید:


CREATE TABLE dbo.TestTable
(
Id int NOT NULL IDENTITY (1, 1),
TestDate dbo.JalaliDate NULL
) ON [PRIMARY]
GO

mohammad reza beizavi
یک شنبه 23 شهریور 1393, 01:08 صبح
dll رو یادم رفت

pswin.pooya
دوشنبه 24 شهریور 1393, 19:17 عصر
سلام

من قبلا تو یه شرکت بودم که برنامه قوی و معروف حسابداری داشتن. اونها برای ذخیره تاریخ از اعداد استفاده می کردن. مثلا 121 یعنی 121 روز از تاریخ 1300/01/01 گذشته. و یک فیلد داشتن که تاریخ رو به صورت رشته نگهداری می کرد. حالا به راحتی می شد عملیات رو انجام داد.

اما خودم از همون DateTime استفاده می کنم و یه تابع نوشتم که کار تبدیل رو انجام میده. مثلا


select id, persian_date(date) from table

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

مشکل روش اون اینه که نمیشه عملیات مخصوص هفته و زمان و ... رو روش انجام داد (البته میشه اما پیچیده تر هست). خیلی دوست دارم نظر دوستان رو درمورد روش اول بدونم.

mohammad reza beizavi
دوشنبه 24 شهریور 1393, 20:34 عصر
من احساس میکنم روش من سازگاری بیشتری داره اما فکر کنم به مراتب کندتر از روش اول باشه.

مشکل روش اون اینه که نمیشه عملیات مخصوص هفته و زمان و ... رو روش انجام داد (البته میشه اما پیچیده تر هست).
در خصوص روش اون شرکت که خدمتتون عرض کنم که به خاطر جوانبی (از جمله جلوگیری از ثبت اطلاعات fake زمانی) که باید در برنامه حسابداری در نظر داره، خیلی از تولید کنندگان این نوع نرم افزارها البته در سالهای پیشتر سعی کردن که با روشهای ابداعی مثل روشی که فرمودید استفاده کنند. این روش در نوع خودش خوب بوده و تا الان هم جواب داده اما مسئله این نیست. مسئله اینه که تا وقتی ابزار پر سرعت، چر قدرت و کاملا تست شده ای داریم. لزومی نداره خودمون دنبال ابداع روش باشیم و مسلما مشکلات پشت سر اون. (به قول یکی از دوستان که میگه اگه از بعضیا بخوان یه ماشین بسازن فورا میرن سراغ اختراع چرخ!!!)

اما سازگاری و سرعت کار شما و اون شرکت؛
هر چند طبق آخرین اسناد منتشر شده توسط شرکت مایکروسافت تفاوت محسوسی بین سرعت اجرای کد سی شارپ و SQL نیست، اما ساخت یه DataType که کار نوع داده ای مثل DateTime رو انجام بده مسلما کدهای زیادی لازم داره که حتما زمانی هم برای اجرا می خواد که اگر زمان بیشتری نسبت به Function نگیره کمتر هم نمی گیره، هر جند که نوع داده ای که دارن از نوع Integer باشه و ...
پس خلاصه اینه که ما با داده هایی که بیشتر از 20 میلیون در یه جدول هستند روش شما رو تست کردیم و جواب هم گرفتیم با سرعت بسیار خوب.

در مورد عملیات مختص نوع داده هم باید بگم که کار سختیه که بشه تمام امکانات وجود برای DataTime رو با تمام تغییرات و به روز رسانیش، برای این نوع داده هم ساخت و تست کرد.

pswin.pooya
دوشنبه 24 شهریور 1393, 20:53 عصر
سلام
خب سرعت مقایسه یک عدد به مراتب بیشتر از یک نوع داده DateTime و اون هم بیشتر از نوع سفارشی هست. و تازه مشکل نوع سفارشی اینه که سازگاری کمتری داره. مثلا قرار باشه همزمان از دیتا توی چند کشور استفاده شه. من فکر کنم توی این حالت روشها مطرح همین عددی و یا استفاده از تابع های تبدیل باشه.

در مورد سرعت معمولا به نوع پایگاه داده و سیستم هم خیلی وابسته هست. من روی یه سیستم نسبتا قدیمی با 2 گیگ رم با 100 هزار رکورد هم به مشکل خوردم و بارها داخل کلینیک و تاکسی تلفنی و ... هم دیدم که مشکل دارن. مثلا توی یه کلینیک برای صدور قبض نوبت حدود 30 ثانیه طول می کشید که اصلا خوب نیست.

بگذریم. کلا در مورد این پایگاه داده ها تجربه قوی ندارم و خیلی دوست دارم از تجربیات شما دوستان استفاده کنم. تا بتونم توی این زمینه هم جلو برم. پس با این حساب شما با خود نوع datetime بیشتر موافق هستید. درسته؟

tnlink
دوشنبه 24 شهریور 1393, 21:09 عصر
از نوع رشته ای بگیری بشکل 1392/01/01 حتی می تونی شرط بین دو تاریخ رو هم به صورت where ...between هم بگیری مشکلی هم نداری اگه در c# هم یک متغیر از نوع pertsiancalendar بگیری و با توابع تبدیل و ... استفاده کنی کاملا نیازهات براورده می شه اگه دوستان نظری روی پست من دارن بفرمایید

mohammad reza beizavi
دوشنبه 24 شهریور 1393, 21:17 عصر
پس با این حساب شما با خود نوع datetime بیشتر موافق هستید. درسته؟
به نظر من و با توجه به تجربیاتی که دارم datetime از بقیه روشها کارا تره.
فقط در خصوص سرعت کم برنامه هایی که فرمودید، درسته که سخت افزار خیلی بر سرعت تاثیر میذاره اما در نظر گرفتن مواردی مانند طراحی خوب و Index گذاری، normalize کردن و با توجه به شناخت دیتابیس unnormal کردن دیتابیس و خیلی موارد دیگه شاید در سرعت کار شما تاثیر گذاشته باشه که جای بحث و گفتگو داره

mohammad reza beizavi
دوشنبه 24 شهریور 1393, 21:19 عصر
از نوع رشته ای بگیری بشکل 1392/01/01 حتی می تونی شرط بین دو تاریخ رو هم به صورت where ...between هم بگیری مشکلی هم نداری اگه در C#‎ هم یک متغیر از نوع pertsiancalendar بگیری و با توابع تبدیل و ... استفاده کنی کاملا نیازهات براورده می شه اگه دوستان نظری روی پست من دارن بفرمایید
خدمت دوست گرامی عرض کنم که معمولا مشکلی با ذخیره تاریخ در بانک اطلاعاتی نداریم. بحث سر اینه که کدوم بهتره یا بهینه تره.

rezamahdizadeh
یک شنبه 30 شهریور 1393, 22:30 عصر
یه فایل dll میذارم
فرض بر اینکه این رو میذارید توی درایو D اینکار رو انجام بدین:


CREATE ASSEMBLY JalaliDate
FROM 'D:\prjJalaliDate.dll'
WITH PERMISSION_SET = SAFE;

بعد این کوئری رو اجرا کنید:


CREATE TYPE dbo.JalaliDate
EXTERNAL NAME JalaliDate.[JalaliDate];






بعد این جدول رو هم به صورت تستی بسازیدو استفاده کنید:


CREATE TABLE dbo.TestTable
(
Id int NOT NULL IDENTITY (1, 1),
TestDate dbo.JalaliDate NULL
) ON [PRIMARY]
GO


آیا همیشه نیاز به این فایل dll روی کامپیوتری که دیتابیس و SQL Server روی آن نصب شده داریم؟
روی کلاینتها چی؟
آیا همیشه نیاز به این فایل dll در مسیر مشخص شده داریم؟
این قسمت از کد چکار می کند؟


CREATE ASSEMBLY JalaliDate
FROM 'D:\prjJalaliDate.dll'
WITH PERMISSION_SET = SAFE;

mohammad reza beizavi
دوشنبه 31 شهریور 1393, 12:33 عصر
بعد از ساختن Assembly توی SQL دیگه نیازی به فایل dll ندارید.
برای client یا server هم کاری به این موارد نداریم، این assembly رو روی دیتابیس sql باید بسازید.

rezamahdizadeh
چهارشنبه 02 مهر 1393, 04:14 صبح
بعد از ساختن Assembly توی SQL دیگه نیازی به فایل dll ندارید.
برای client یا server هم کاری به این موارد نداریم، این assembly رو روی دیتابیس sql باید بسازید.
بعد از ساختن Assembly آیا با backup گرفتن و restore کردن روی کامپیوتر دیگری مشکلی پیش نمی اید؟
آیا می توان با SQL script آن دیتابیس را ساخت؟

علی فتحی
یک شنبه 13 مهر 1393, 11:54 صبح
نظر بنده اینه دو فیلد درجدول داشته باشیم . همزمان هم تاریخ شمسی و هم میلادی ذخیره بشه. بنده یک نرم افزار مسکن مهر نوشتم . برای نمایش تاریخ شمسی رو در یک رشته قرار دادم و برای مقایسه . امتیاز حواله ها ی واریزی از تاریخ میلادی استفاده کردم. با کوری میشه اختلاف شمسی رو هم محاسبه کرد ولی مستحضر هستین که تاریخ میلادی مثلا در میلادی 28 و 29 و 30 و 31در فروردین ندارد. و محاسبه درست انجام نمیشه .بنده یک تکس باکس گذاشتم همزمان با کد نویسی خیلی ساده تبدیل به میلادی میکنم .

ghasem110deh
جمعه 12 دی 1393, 16:34 عصر
سلام
دوستان یکی یه نمونه ساده و مفید بزاره ... لطفا (بعضی وقتا آدم نمیتونه دیگه)
الان من تاریخ با یه کامپوننت (behcomponent) میگیرم که اینطوری : (سه شنبه 8 آذر 1393) ذخیره میکنه ...
-----------------------------
الان اگه بخوام بین تاریخ 1 و تاریخ2 هر چی رکورد هست رو نشون بده چطور عمل کنم ؟
-----------------------------
جان من با کدهای کامل توضیح بدین (قوانین و این حرفا جای خودش ... ولی ذهن و هوش همه یه اندازه نیست ؛ واس ما از همه پایین تره)

alimooghashang
یک شنبه 29 شهریور 1394, 14:51 عصر
درود
برای ثبت، نگهداری و کوئری گرفتن از تاریخ با تمام امکاناتی که برای نوع داده تاریخ وجود دارد و تاریخ هم از نوع شمسی باشد راهکار بسایر خوب و قدرتمندی در sql SERVER 2012 و بالاتر وجود دارد و آن هم اینکه می توانید با استفاده از CLR نوع داده مورد نظر خود را بسازید و از آن استفاده کنید. در مجموعه زیر این کار با تمام جزییات و به بهترین نحو انجام، تست و استفاده شده. مطمئنا نیاز شما را برطرف خواهد کرد:
قسمت اول (http://www.dotnettips.info/post/1297/%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-%DB%8C%DA%A9-datatype-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%DA%AF%D9%87%E2%80%8C%D8%AF%D8%A7%D8%B1%DB%8 C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%AE%D9%88%D8%B1%D8%B4%DB%8C%D8%AF%DB%8C-1)
قسمت دوم (http://www.dotnettips.info/post/1299/%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-%DB%8C%DA%A9-datatype-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%DA%AF%D9%87%E2%80%8C%D8%AF%D8%A7%D8%B1%DB%8 C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%AE%D9%88%D8%B1%D8%B4%DB%8C%D8%AF%DB%8C-2)
قسمت سوم (http://www.dotnettips.info/post/1303/%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-%DB%8C%DA%A9-datatype-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%DA%AF%D9%87%E2%80%8C%D8%AF%D8%A7%D8%B1%DB%8 C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%AE%D9%88%D8%B1%D8%B4%DB%8C%D8%AF%DB%8C-3)



این روش همه چیش خوبه فقط مشکلش اینه که اگه دیتاست بخوایم بسازیم ، دیتاست اون نوع رو شناسایی نمیکنه

User-defined types(UDTs)are not supported in the Dataset Designer.

SabaSabouhi
دوشنبه 30 شهریور 1394, 08:32 صبح
سلام
دوستان یکی یه نمونه ساده و مفید بزاره ... لطفا (بعضی وقتا آدم نمیتونه دیگه)
الان من تاریخ با یه کامپوننت (behcomponent) میگیرم که اینطوری : (سه شنبه 8 آذر 1393) ذخیره میکنه ...
-----------------------------
الان اگه بخوام بین تاریخ 1 و تاریخ2 هر چی رکورد هست رو نشون بده چطور عمل کنم ؟
-----------------------------
جان من با کدهای کامل توضیح بدین (قوانین و این حرفا جای خودش ... ولی ذهن و هوش همه یه اندازه نیست ؛ واس ما از همه پایین تره)

سلام
به هیچ عنوان تاریخ رو شمسی ذخیره نکن، تاریخ رو «تاریخ» ذخیره کن. شمسی کردن تاریخ زمان نمایش هست و نه زمان ذخیره.
برای نمایش شمسی تاریخ تو Queryهای sql من تابع مناسبی رو تو این سایت قرار دادم. یه جستجو بزنی پیدا می‌کنی.
اگه تو #C هم خواستی بگو برات بفرستم. اما به هیچ عنوان تو دیتابیس تاریخ رو شمسی ذخیره نکن.

صبا صبوحی

alimooghashang
دوشنبه 30 شهریور 1394, 10:40 صبح
اما به هیچ عنوان تو دیتابیس تاریخ رو شمسی ذخیره نکن.

ممنون
دلیل صحبتتون رو میشه بگین؟

SabaSabouhi
دوشنبه 30 شهریور 1394, 11:03 صبح
ممنون
دلیل صحبتتون رو میشه بگین؟

سلام
بله دوست من،
دلیل صحبت من این هست که تاریخی که در دیتابیس ذخیره می‌کنی باید «تاریخ» باشه. تا تمام امکانات مثل مرتب کردن، جستجو
و اعمال ریاضی روی اون به راحتی انجام بشه.
در مورد نمایش به راحتی می‌تونی چه در سطح query با یک تابع ( که من یک نمونه‌ با سرعت بالا رو قبلاً اینجا ارسال کردم ) و چه
در سطح برنامه با یک متد ( من extension method رو ترجیح می‌دم ) به یک رشته‌ی شمسی تبدیل بشه.
اگه روزی تصمیم بگیری که WPF کار کنی، اونجا binding حرف اول رو می‌زنه، و به هیچ عنوان مناسب نیست که تاریخ رو شمسی
کار کنی. باید کنترل تاریخ رو داشته باشی و هنگام binding از تاریخ میلادی استفاده کنی و هنگام نمایش به تاریخ شمسی تبدیلش
کنی.

صبا صبوحی

alimooghashang
دوشنبه 30 شهریور 1394, 12:15 عصر
سلام
بله دوست من،
دلیل صحبت من این هست که تاریخی که در دیتابیس ذخیره می‌کنی باید «تاریخ» باشه. تا تمام امکانات مثل مرتب کردن، جستجو
و اعمال ریاضی روی اون به راحتی انجام بشه.
در مورد نمایش به راحتی می‌تونی چه در سطح query با یک تابع ( که من یک نمونه‌ با سرعت بالا رو قبلاً اینجا ارسال کردم ) و چه
در سطح برنامه با یک متد ( من extension method رو ترجیح می‌دم ) به یک رشته‌ی شمسی تبدیل بشه.
اگه روزی تصمیم بگیری که WPF کار کنی، اونجا binding حرف اول رو می‌زنه، و به هیچ عنوان مناسب نیست که تاریخ رو شمسی
کار کنی. باید کنترل تاریخ رو داشته باشی و هنگام binding از تاریخ میلادی استفاده کنی و هنگام نمایش به تاریخ شمسی تبدیلش
کنی.

صبا صبوحی

این پروسه تبدیل زمانبر نیست و CPU رو بخودش مشغول نمیکنه؟ مثلا نمایش تاریخ در یک گرید با تعداد رکورد 100000؟

SabaSabouhi
دوشنبه 30 شهریور 1394, 12:50 عصر
این پروسه تبدیل زمانبر نیست و CPU رو بخودش مشغول نمیکنه؟ مثلا نمایش تاریخ در یک گرید با تعداد رکورد 100000؟

سلام
دوست عزیز، اگه دوست نداری استفاده کنی مجبور نیستی، اما دیگه دلایل عجیب و غریب نیار. مگه می‌شه یه گرید با 100 هزار رکورد رو
نمایش بدی؟
طبیعی هست که اگه 100 هزار سطر اطلاعات داری اون‌ها رو با paging نمایش بدی، پس هرگز 100هزار رکورد برای نمایش نخواهی داشت.
حتا اگه بخوای این‌ها رو تو یه گزارش چاپ کنی ( بدون فیلترینگ ) چیزی بالای 1000 صفحه خواهد شد. ( حدود دو بسته کاغذ A4 )

و اما در پاسخ شما:
بالاخره هر UDF ای زمان بر خواهد بود. اما اگه متن این تابع رو بخونی ( سورس باز هست ) می‌بینی که داخلش از هیچ تابع دیگه‌ای استفاده نشده
و با ساختاری که داره حداقل بار رو داره.

طبیعی هست که یه سایت ایستا ( static ) هم خیلی سریع‌تر از یک سایت پویا ( dynamic ) بارگزاری می‌شه و هم تهیه‌اش خیلی ارزون‌تره. اما
آیا این دلیل می‌شه که همه سایت‌های ایستا باشن؟ شما باید حساب کنی ببینی که یک راه‌حل که می‌گیری چه نقاط قوت و چه نقاط ضعفی
داره و بعد تصمیم بگیری.
تصمیم‌هایی مثل ذخیره‌ی رشته‌ای تاریخ شمسی، غیر از این که خیلی شما رو محدود می‌کنه، شما رو مجبور می‌کنه که تاریخ 93/2/1 رو به
صورت 93/02/01 نمایش بدی که علی‌رغم این که متاسفانه تو برخی نرم‌افزارها عادی شده، اما کاملاً نادرست هست که قبل از عدد 1 یک صفر
اضافی نمایش داده شود.

صبا صبوحی

je30ca
سه شنبه 31 شهریور 1394, 11:00 صبح
در مورد نمایش به راحتی می‌تونی چه در سطح query با یک تابع ( که من یک نمونه‌ با سرعت بالا رو قبلاً اینجا ارسال کردم ) و چه
در سطح برنامه با یک متد ( من extension method رو ترجیح می‌دم ) به یک رشته‌ی شمسی تبدیل بشه.
اگه روزی تصمیم بگیری که WPF کار کنی، اونجا binding حرف اول رو می‌زنه، و به هیچ عنوان مناسب نیست که تاریخ رو شمسی
کار کنی. باید کنترل تاریخ رو داشته باشی و هنگام binding از تاریخ میلادی استفاده کنی و هنگام نمایش به تاریخ شمسی تبدیلش
کنی.

صبا صبوحی[/QUOTE]

je30ca
سه شنبه 31 شهریور 1394, 11:07 صبح
در مورد نمایش به راحتی می‌تونی چه در سطح query با یک تابع ( که من یک نمونه‌ با سرعت بالا رو قبلاً اینجا ارسال کردم ) و چه
در سطح برنامه با یک متد ( من extension method رو ترجیح می‌دم ) به یک رشته‌ی شمسی تبدیل بشه.
اگه روزی تصمیم بگیری که WPF کار کنی، اونجا binding حرف اول رو می‌زنه، و به هیچ عنوان مناسب نیست که تاریخ رو شمسی
کار کنی. باید کنترل تاریخ رو داشته باشی و هنگام binding از تاریخ میلادی استفاده کنی و هنگام نمایش به تاریخ شمسی تبدیلش
کنی.

صبا صبوحی[/QUOTE]
سلام.من دارم با wpf برنامه مینویسم که الان تو بحث تاریخ و تقویمش دنبال یه راه حل مناسب هستم..
برای wpf شما چه تقویمی رو پیشنهاد میکنید.من الان از wpfToolkit استفاده میکنم اما چون وقتی تقویم فارسی باشه selecteddate
هم تاریخ شمسی برمیگردونه نه میلادی یکم گیج شدم و میخوام تقویم بهتری پیدا کنم...ممنون میشم راهنمایم کنید

SabaSabouhi
سه شنبه 31 شهریور 1394, 14:07 عصر
در مورد نمایش به راحتی می‌تونی چه در سطح query با یک تابع ( که من یک نمونه‌ با سرعت بالا رو قبلاً اینجا ارسال کردم ) و چه
در سطح برنامه با یک متد ( من extension method رو ترجیح می‌دم ) به یک رشته‌ی شمسی تبدیل بشه.
اگه روزی تصمیم بگیری که WPF کار کنی، اونجا binding حرف اول رو می‌زنه، و به هیچ عنوان مناسب نیست که تاریخ رو شمسی
کار کنی. باید کنترل تاریخ رو داشته باشی و هنگام binding از تاریخ میلادی استفاده کنی و هنگام نمایش به تاریخ شمسی تبدیلش
کنی.

صبا صبوحی
سلام.من دارم با wpf برنامه مینویسم که الان تو بحث تاریخ و تقویمش دنبال یه راه حل مناسب هستم..
برای wpf شما چه تقویمی رو پیشنهاد میکنید.من الان از wpfToolkit استفاده میکنم اما چون وقتی تقویم فارسی باشه selecteddate
هم تاریخ شمسی برمیگردونه نه میلادی یکم گیج شدم و میخوام تقویم بهتری پیدا کنم...ممنون میشم راهنمایم کنید[/QUOTE]

سلام
من هم WPF کار می‌کنم. در حال حاضر DateTimePicker استفاده نمی‌کنم. تاریخ رو به صورت TextBox می‌گیرم. و کنترلی نوشتم که
EditValue رو به صورت تاریخ بر می‌گردونه.
فعلاً فرصتش رو ندارم، اما در اولین فرصت یه DateTimePicker خودم خواهم نوشت، مگه این که DevExpress تا قبلش این مشکل رو
خودش با زبون خوش حل کنه :لبخندساده:

ضمن این که به عنوان یک کاربر و نه برنامه‌نویس، یک کنترل بر اساس TextBox که تاریخ بگیره رو به یک DateTimePicker ترجیح می‌دم
چون کار کردن باهاش راحت‌تره.
یه نکته که اغلب برنامه‌نویس‌ها در نظر نمی‌گیرن اینه که برنامه‌ی کاربردی خوب برنامه‌ای هست که بدون موش بشه راحت باهاش کار کرد
چون اغلب اپراتورها براشون سخت هست که وسط وارد کردن اطلاعات دستشون رو از روی صفحه کلید بردارن و با موش یه تاریخ رو انتخاب کنن.

صبا صبوحی