PDA

View Full Version : نوع فیلد تاریخ date باشه یا char (شمسی ذخیره کنم یا میلادی)



Borland-Delphi7
جمعه 06 اردیبهشت 1387, 11:03 صبح
سلام دوستان
موضوع مشخصه چی میخوام مزایا و معایب هر یک از نوع فیلد و شمسی یا میلادی بودن را ذکر کنید.

Mahdi-563
جمعه 06 اردیبهشت 1387, 14:25 عصر
اگه نظر من بخوای نوع فیلد رو date بگیر و میلادی ذخیره کن بعد تو برنامت خیلی راحت تبدیلش کن. این کار اصولی تره و بعد هم خیلی راحتی
به همین راحتی !!!

farzad_az_shiraz
جمعه 06 اردیبهشت 1387, 14:57 عصر
من خودم معمولا تاریخ را از نوع string تعریف میکنم . ولی به نظر من شما باید قبلا تابع میلادی را به شمسی تبدیل کرده باشی . من معمولا وقتی یه edit دارم که باید توی آون تاریخ وارد بشه حتما قبلش تاریخ همان روز را توی edit قرار میدم که اگه منظور کاربر تاریخ اون روز بود نیازی به تغییر نداشته باشه.

babak_delphi
جمعه 06 اردیبهشت 1387, 15:32 عصر
یک روش هم این است که تاریخ را بصورت integer و تاریخ شمسی ذخیره کنی
در موقع استفاده / ها را اضافه و در موقع ذخیره ، حذف کنید
توابع مورد نیاز ، نحوه عمل و مزایای آن در سایت قرار دارد
جستجو کنید
قبلا در یک تاپیک توضیح داده شده است.

Borland-Delphi7
جمعه 06 اردیبهشت 1387, 15:44 عصر
از نظراتتان ممنونم
به نظر خودم اگر تاریخ از نوع date باشه بهتره چون میشه در query از توابع Sql مربوط به تاریخ استفاده کرد و همچنین در توابع تاریخ در خود دلفی وطبق نظر آقا مهدی میلادی بهتره چون در نیاز به توابع شمسی برای کار با تاریخ نداریم و باگش هم کمتر از توابع شمسی هست

در کل طبق تحقیقات من تاریخ رو از نوع date و با میلادی ذخیره کنیم بهتره

ولی یه مشکل در نمایش در grid دارم که نمیتونم تبدیلش کنم به میلادی و باید از کامپوننت ها استفاده کنم

ای کاش در sql هم مثل دلفی میشد کامپوننت (یا تابع )تعریف کرد که در query این کار انجام میشد (آیا میشه این کارو کرد)

babak_delphi
جمعه 06 اردیبهشت 1387, 16:12 عصر
اگر تاریخ را شمسی بدهید این مشکل را نخواهید داشت ولی در عوض نوع Date در بعضی ماهها (مثلا 2) ایراد خواهد گرفت (به علت تفاوت تعداد روزهای ماه)
پس مجبور خواهید شد که از string یا integer استفاده کنید
حالا چون در زمان محاسبات ، سرعت محاسبه روی فیلدهای integer بیشتر از انواع string است پس خواهید رفت سراغ Integer
برای تبدیل ها (میلادی به شمسی ، شمسی به میلادی ، حذف / ، اضافه کردن / و ...) توابع مورد نیاز را قبلا در سایت قرار داده ام
جستجو کنید

به هر حال این هم پیشنهاد من است
انتخاب با شماست دوست عزیز

SYNDROME
جمعه 06 اردیبهشت 1387, 18:38 عصر
اگر کار شما با تاریخ شمسی است به نظر من بهترین nvarchar بگیرید تا دیگر نیازی به تبدیل نباشد.
در ضمن شما اگر تاریخ شمسی را با فرمت مشخص دریافت کنید می توانید از توابع SQL بر روی آن استفاده کنید.
موفق باشید

H_T_O_A
جمعه 06 اردیبهشت 1387, 19:47 عصر
به نظر من هم اگر کارت با تاریخ شمسیه حتما از اسیتریگ یا اینتجر استفاده کن که مسلما رشته راحتتره. من هم سر یه پروژه تاریخ شمسی رو به صورت دیت ذخیره می کردم بعد با مشکلاتی برخورد کردم که مجبور شدم همه برنامه رو عوض کنم
با میل خودت

babak_delphi
جمعه 06 اردیبهشت 1387, 20:10 عصر
SYNDROME (http://barnamenevis.org/forum/member.php?u=35868) عزیز
تا جایی که من میدونم همه جا nvarchar نداریم
مثلا در Access

SYNDROME
جمعه 06 اردیبهشت 1387, 21:46 عصر
SYNDROME (http://barnamenevis.org/forum/member.php?u=35868) عزیز
تا جایی که من میدونم همه جا nvarchar نداریم
مثلا در Access
دوست عزیز منظور بنده هم رشته بود.
فقط چون فکر کنم دوستمان با SQL Server کار می کند گفتم Nvarchar.
موفق باشید

echoes
شنبه 07 اردیبهشت 1387, 14:00 عصر
به نظر من استرینگ بگیر ، چون خیلی راحت می تونی با چند تا تابع دست نویس هر کاری که بخواهی انجام بدی

babak_delphi
شنبه 07 اردیبهشت 1387, 15:00 عصر
سرعت محاسبات روی داده های عددی بیشتر از داده های متنی است
با آزمایش می توانید نتیجه را بررسی کنید
به همین دلیل نوع عددی را پیشنهاد کردم
موفق باشید

Borland-Delphi7
شنبه 07 اردیبهشت 1387, 15:32 عصر
ممنون از راهنمایی دوستان

در کل من طبق نظرات دوستان آمدم از اعداد واسه ذخیره استفاده کردم و از یه کامپوننت به نام FALAD استفاده کردم که خودش روز ماه و سال رو به عدد میده و میگیره و البته از نوع شمسی
هر وقت خواصتم به صورت روز/ماه/سال نشونش بدم تو query دستکاری میکنم . امیدوارم که به مشکل نخورم آخه یه پروژه بزرگ دارم که راه برگشتش خیلی وقت گیره

مزایایی این روش سرعت بالا حذف صفر قبل از تک رقمی ها و محاسبات ساده و سریع بر روی سال ،ماه و روز - حجم کمتر در دیتابیس نصبت به string

babak_delphi
شنبه 07 اردیبهشت 1387, 15:51 عصر
برای انجام کارهایی که گفتید با کامپوننت انجام میدهید نیز کد مربوطه را در بخش "نکات برنامه نویسی در دلفی" (ااعلان بالای بخش دلفی) قرار داده ام
برای عدم استفاده از کامپوننت این راه مناسب تر است
ضمنا سورس کد نیز در اختیار خودتان است و هرجا لازم باشد می توانید تغییرات لازم را اعمال نمایید.
موفق باشید.

Mahdi-563
شنبه 07 اردیبهشت 1387, 18:01 عصر
مگه چی کار میخوایم بکنیم یه تبدیل تاریخه که هم میشه از حضرت SQL Server بخوایم این کار بکنیم یا خود دلفی اس کیو الشو چون مربوط به بحث نمی شه نمی زارم ولی دلفیش رو واسه دوستان میزارم:


uses
SolarUtl;

function StrToYMD(S: String; var Y, M, D: Word): Boolean;
var
P: Integer;
begin
Result := False;
try
P := Pos('/', S);
if P > 0 then
begin
Y := StrToInt(Copy(S, 1, P - 1));
Delete(S, 1, P);
P := Pos('/', S);
if P > 0 then
begin
M := StrToInt(Copy(S, 1, P - 1));
D := StrToInt(Copy(S, P + 1, Length(S) - P));
Result := True;
end;
end;
except
end;
end;

procedure TForm1.DateFieldGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
var
Year, Month, Day: Word;
begin
if not Sender.IsNull then
begin
SolarDecodeDate(Sender.AsDateTime, Year, Month, Day);
Text := Format('%4.4d/%2.2d/%2.2d', [Year, Month, Day]);
end
else
Text := EmptyStr;
end;

procedure TForm1.DateFieldSetText(Sender: TField;
const Text: String);
var
Year, Month, Day: Word;
begin
if StrToYMD(Text, Year, Month, Day) then
Sender.AsDateTime := SolarEncodeDate(Year, Month, Day)
else
Sender.Clear;
end;
حالا این کد و که به فرم خودتون اضافه کردین باید این کد رو ایونت دیتا ست خودتون وسل کنید حالا شما شمسی بش بدین و شمسی بگیرین داخل بانک هم میلادی ذخیره میکنه

لازم به ذکر که این قسمت از کد مال دوست عزیزم آقای سارلا سافت.

A.Nemati
شنبه 07 اردیبهشت 1387, 18:43 عصر
فکر خوبیه ولی اگه یونیت SolarUtl هم می ذاشتی بهتر بود !!!!
ظاهرا SolarEncodeDate و SolarDecodeDate رو باید تو این یونیت پیدا کرد.

Mahdi-563
یک شنبه 08 اردیبهشت 1387, 10:54 صبح
کل دمو را آپلود می کنم شرمنده حواسم نبود

H_T_O_A
دوشنبه 09 اردیبهشت 1387, 20:28 عصر
مگه چی کار میخوایم بکنیم یه تبدیل تاریخه که هم میشه از حضرت SQL Server بخوایم این کار بکنیم یا خود دلفی اس کیو الشو چون مربوط به بحث نمی شه نمی زارم ولی دلفیش رو واسه دوستان میزارم:
تبدیلش که کاری نداری عزیز من
یک سری روزها تو تاریخ شمسی هست که برای پایگاه های داده ای مثه اکسس و اس کیو ال نا معتبره
اونوقت وقتی تو برنامت او تاریخ اون روزها رو وارد کنی پیغام خطا تحویل میگیری
از طرفی واسه بعضی برنامه نویسا متناسب با برنامشون مهم که توی پایگاهشون هم شمسی نشون بده( البته بعضی وقتا)
اگه استرینگ باشه که نیازی به این کد نویسی ها هم نیست اگر هم نیاز داشتی که به تاریخ برگرده با تابع strtodate کارت راه میفته

SYNDROME
دوشنبه 09 اردیبهشت 1387, 21:45 عصر
در کل من طبق نظرات دوستان آمدم از اعداد واسه ذخیره استفاده کردم و از یه کامپوننت به نام FALAD استفاده کردم که خودش روز ماه و سال رو به عدد میده و میگیره و البته از نوع شمسی
هر وقت خواصتم به صورت روز/ماه/سال نشونش بدم تو query دستکاری میکنم . امیدوارم که به مشکل نخورم آخه یه پروژه بزرگ دارم که راه برگشتش خیلی وقت گیره

دوست عزیز اگر واقعا این قدر براتون روش مهم است بهتر است چند پروژه بزرگ را نیز نگاه کنید.
هر کدام از روشهای فوق برای دوستان جواب داده است ولی باید ببینید شما بر روی تاریخ می خواهید چه عملیاتی انجام دهید.
موفق باشید