# پایگاه‌های داده > SQL Server > T-SQL > تحلیل و طراحی بانک اطلاعات >  بهترین روش برای ذخیره فیلدهای تاریخ

## rezamahdizadeh

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

----------


## mohammad reza beizavi

درود
برای ثبت، نگهداری و کوئری گرفتن از تاریخ با تمام امکاناتی که برای نوع داده تاریخ وجود دارد و تاریخ هم از نوع شمسی باشد راهکار بسایر خوب و قدرتمندی در sql SERVER 2012 و بالاتر وجود دارد و آن هم اینکه می توانید با استفاده از CLR نوع داده مورد نظر خود را بسازید و از آن استفاده کنید. در مجموعه زیر این کار با تمام جزییات و به بهترین نحو انجام، تست و استفاده شده. مطمئنا نیاز شما را برطرف خواهد کرد:قسمت اول
قسمت دوم
قسمت سوم

----------


## rezamahdizadeh

> درود
>  برای ثبت، نگهداری و کوئری گرفتن از تاریخ با تمام امکاناتی که برای نوع داده تاریخ وجود دارد و تاریخ هم از نوع شمسی باشد راهکار بسایر خوب و قدرتمندی در sql SERVER 2012 و بالاتر وجود دارد و آن هم اینکه می توانید با استفاده از CLR نوع داده مورد نظر خود را بسازید و از آن استفاده کنید. در مجموعه زیر این کار با تمام جزییات و به بهترین نحو انجام، تست و استفاده شده. مطمئنا نیاز شما را برطرف خواهد کرد:قسمت اول
> قسمت دوم
> قسمت سوم


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

----------


## mohammad reza beizavi

درود
خب یکبار با C#‎‎‎‎ اینکار رو انجام بدید و این Type رو داخل دیتابیس رو بسازید بعد دیگه این نوع داخل دیتابیستون هست و دیگه به Delphi یاC#‎‎‎‎ بستگی نداره و راحت می تونید مثل بقیه داده کوئری بگیرید.

----------


## rezamahdizadeh

> درود
> خب یکبار با C#‎‎‎‎‎ اینکار رو انجام بدید و این Type رو داخل دیتابیس رو بسازید بعد دیگه این نوع داخل دیتابیستون هست و دیگه به Delphi یاC#‎‎‎‎‎ بستگی نداره و راحت می تونید مثل بقیه داده کوئری بگیرید.


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

----------


## mohammad reza beizavi

نمونه کامل در همون مطالب جناب قنادی که گذاشتم هست. کامل بخونید اگر مشکلی بود بفرمایید تا تشریحش کنم.

----------


## rezamahdizadeh

> نمونه کامل در همون مطالب جناب قنادی که گذاشتم هست. کامل بخونید اگر مشکلی بود بفرمایید تا تشریحش کنم.


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

----------


## mohammad reza beizavi

یه فایل 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

dll رو یادم رفت

----------


## pswin.pooya

سلام

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

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

select id, persian_date(date) from table

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

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

----------


## mohammad reza beizavi

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


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

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

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

----------


## pswin.pooya

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

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

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

----------


## tnlink

از نوع رشته ای بگیری بشکل 1392/01/01 حتی می تونی شرط بین دو تاریخ رو هم به صورت where ...between  هم بگیری مشکلی هم نداری اگه در C#‎ هم یک متغیر از نوع pertsiancalendar بگیری و با توابع تبدیل و ... استفاده کنی کاملا نیازهات براورده می شه اگه دوستان نظری روی پست من دارن بفرمایید

----------


## mohammad reza beizavi

> پس با این حساب شما با خود نوع datetime بیشتر موافق هستید. درسته؟


به نظر من و با توجه به تجربیاتی که دارم datetime  از بقیه روشها کارا تره. 
فقط در خصوص سرعت کم برنامه هایی که فرمودید، درسته که سخت افزار خیلی بر سرعت تاثیر میذاره اما در نظر گرفتن مواردی مانند طراحی خوب و Index گذاری، normalize کردن و با توجه به شناخت دیتابیس unnormal کردن دیتابیس و خیلی موارد دیگه شاید در سرعت کار شما تاثیر گذاشته باشه که جای بحث و گفتگو داره

----------


## mohammad reza beizavi

> از نوع رشته ای بگیری بشکل 1392/01/01 حتی می تونی شرط بین دو تاریخ رو هم به صورت where ...between  هم بگیری مشکلی هم نداری اگه در C#‎‎ هم یک متغیر از نوع pertsiancalendar بگیری و با توابع تبدیل و ... استفاده کنی کاملا نیازهات براورده می شه اگه دوستان نظری روی پست من دارن بفرمایید


خدمت دوست گرامی عرض کنم که معمولا مشکلی با ذخیره تاریخ در بانک اطلاعاتی نداریم. بحث سر اینه که کدوم بهتره یا بهینه تره.

----------


## rezamahdizadeh

> یه فایل dll میذارم
> فرض بر اینکه این رو میذارید توی درایو D اینکار رو انجام بدین:
> 
> CREATE ASSEMBLY JalaliDate
> FROM 'D:\prjJalaliDate.dll'
> WITH PERMISSION_SET = SAFE;
> 
> بعد این کوئری رو اجرا کنید:
> 
> ...


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

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

----------


## mohammad reza beizavi

بعد از ساختن Assembly توی SQL دیگه نیازی به فایل dll ندارید.
برای client یا  server هم کاری به این موارد نداریم، این assembly رو روی دیتابیس sql باید بسازید.

----------


## rezamahdizadeh

> بعد از ساختن Assembly توی SQL دیگه نیازی به فایل dll ندارید.
> برای client یا  server هم کاری به این موارد نداریم، این assembly رو روی دیتابیس sql باید بسازید.


بعد از ساختن Assembly آیا با backup گرفتن و restore کردن روی کامپیوتر دیگری مشکلی پیش نمی اید؟
آیا می توان با SQL script آن دیتابیس را ساخت؟

----------


## علی فتحی

نظر بنده اینه دو فیلد درجدول داشته باشیم . همزمان هم تاریخ شمسی و هم میلادی ذخیره بشه. بنده یک نرم افزار مسکن مهر نوشتم . برای نمایش تاریخ شمسی رو در یک رشته قرار دادم  و برای مقایسه . امتیاز حواله ها ی واریزی از تاریخ میلادی استفاده کردم. با کوری میشه اختلاف شمسی رو هم محاسبه کرد ولی مستحضر هستین که تاریخ میلادی مثلا در میلادی 28 و 29 و 30 و 31در فروردین ندارد. و محاسبه درست انجام نمیشه .بنده یک تکس باکس گذاشتم همزمان با کد نویسی خیلی ساده تبدیل به میلادی میکنم .

----------


## ghasem110deh

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

----------


## alimooghashang

> درود
> برای ثبت، نگهداری و کوئری گرفتن از تاریخ با تمام امکاناتی که برای نوع داده تاریخ وجود دارد و تاریخ هم از نوع شمسی باشد راهکار بسایر خوب و قدرتمندی در sql SERVER 2012 و بالاتر وجود دارد و آن هم اینکه می توانید با استفاده از CLR نوع داده مورد نظر خود را بسازید و از آن استفاده کنید. در مجموعه زیر این کار با تمام جزییات و به بهترین نحو انجام، تست و استفاده شده. مطمئنا نیاز شما را برطرف خواهد کرد:قسمت اول
> قسمت دوم
> قسمت سوم


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

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

----------


## SabaSabouhi

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


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

صبا صبوحی

----------


## alimooghashang

> اما به هیچ عنوان تو دیتابیس تاریخ رو شمسی ذخیره نکن.


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

----------


## SabaSabouhi

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


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

صبا صبوحی

----------


## alimooghashang

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


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

----------


## SabaSabouhi

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


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

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

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

صبا صبوحی

----------


## je30ca

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

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

----------


## je30ca

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

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

----------


## SabaSabouhi

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


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

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

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

صبا صبوحی

----------

