PDA

View Full Version : یه مشکل جالب در تاریخ



Batman
دوشنبه 11 تیر 1386, 10:19 صبح
با سلام
من قبلا یه برنامه نوشته بودم
چند روز پیش که بازش کردم دیدم error میده
بعد فهمیدم که مشکل از تاریخ هستش
بانک من access و یه فیلد تاریخ از نوع date\time دارم
حالا اگه برج 2 میلادی باشیم و بخواهیم 29/2 و 30/2 و 31/2 رو درج کنیم خطا میده چون برج 2 میلادی 28 روزه هستش
در ضمن اگه نوع فیلد رو text کنم دیگه مقایسه ندارم و در ضمن اگه مشکلم حل شد چجوری توی dbgrid مقادیر تاریخ رو به صورت شمسی ببینم

اَرژنگ
دوشنبه 11 تیر 1386, 10:54 صبح
تمام تاریخها را باید همیشه در صورت میلادی زخیره کرد (مگر اینکه داتابیستآن از تاریخ شمسی پستیبانی کند).
از GetText و SetText ،
TField در TQuery و یا TTable برایه نشان دادن تاریخ میلادی در شمسی ویا تبدیل کردن تاریخ شمسی به میلادی و ذخیره کردنش در داتابیس استفاده کنید.

SYNDROME
دوشنبه 11 تیر 1386, 13:11 عصر
با سلام
در رابطه با این موضوع بارها در سایت بحث شده می وانید جستجو کنید.
ولی شما می توانید فیلد خود را از نوع Textبگیرید و تاریخ را به صورت شمسی ذخیره کنید و با ">=<"آنها را با هم مقایسه کنید.
ولی حالا اگر تاکید دارید که از نوع میلادی ذخیره کنید 2 راه حل دارید:
1-استفاده از فییلد Calculator و رویداد GetText و یا OnCalculator.
2-استفاده از یک جدول Temp که تاریخ ها را درآن بدیل کنید و به کاربر نشان دهید.
3-اگر بانک شما SQLSERVER بود می توانستید با نوشتن یک تابع آن را تبدیل کنید.(البته این روش برای شما کاربرد ندارد ولی برای اطلاع گفتم)
موفق باشید

Batman
سه شنبه 12 تیر 1386, 07:43 صبح
آقای آرژنگ میشه درباره اون فیلدها و settext و gettext بیشتر توضیح بدین
ممنون

اَرژنگ
سه شنبه 12 تیر 1386, 09:41 صبح
آقای آرژنگ میشه درباره اون فیلدها و settext و gettext بیشتر توضیح بدین
ممنون
بعد از اینکه نام جدول و یا اس.کیو‌ال را در TTable و یا TQuery
ست کنید، بر رویشان رایت کیلک کنید، اضافه کردن فیلدها را کلیک کنید.
هر کدام از فیلدها پروپرتیها و روادیدهایی دارند.
GetText و 'SetText از جمله روادید فیلدها هستند، موقع گرفتن مقدار یک فیلد از داتابیس میتوانید مقدار را عوض کنید، SetText بر عکس عمل میکند، این مثال (http://cc.codegear.com/Item/14212) مقدار یک فیلد را که در داتابیس به صورت ۱ و یا ۲ ذخیره میشوند را به نام تبدیل میکند، و موقع دخیره کردن در داتابیس نامها را به مقادیر تبیل میکند.
فکر کنم برایهGetText یک تابع میالدی به شمسی و برایه SetText یک تابع شمسی به میلادی کافی باشد.

vahid64
سه شنبه 12 تیر 1386, 19:37 عصر
ک شما SQLSERVER بود می توانستید با نوشتن یک تابع آن را تبدیل کنید.(البته این روش برای شما کاربرد ندارد ولی برای اطلاع گفتم)
موفق باشید
syndrome عزیز اگه میشه این دستور رو برای من بگو چون من تو یکی از برنامه هام همچین مشکلی داشتم ضمناً تمام دیتا بیس های من SQL هست !

babak869
سه شنبه 12 تیر 1386, 20:20 عصر
بهترین روش برای کار با تاریخ برای فارسی زبانان انتخاب یک رشته 10 کاراکتری است که مدیریت خطا و ورودی مقادیر کاربر روی آن کنترل شود

موفق باشید

Batman
سه شنبه 12 تیر 1386, 20:29 عصر
آقای احدی چجوری مقایسه کنیم

SYNDROME
سه شنبه 12 تیر 1386, 22:03 عصر
با سلام

syndrome عزیز اگه میشه این دستور رو برای من بگو چون من تو یکی از برنامه هام همچین مشکلی داشتم ضمناً تمام دیتا بیس های من SQL هست !
دوست عزیز شما یک تابع می نویسید و مقدار تاریخ میلادی خود را به آن پاس کرده و تابع شما مقدار شمسی آن را برمی گرداند.بنده چنین تابعی در SQLندارم ولی یک تابع دارم که عدد را می گیرد و بین آن سه رقم سه رقم "," می گذارد.
این دستور SQL


Select Comma(AutoNumber) as Test
From Table1

این هم مقدار تابع Comma


CREATE FUNCTION [Comma] (@Number decimal)
RETURNS Nvarchar (50) AS
BEGIN

declare @len int
declare @count int
declare @counter int
declare @str nvarchar(50)
declare @strn nvarchar(50)
set @len = len(@Number)
set @count = 0
set @counter =1
set @strn = ''
set @str = reverse ( convert ( nvarchar (50), @Number ) )

while(@len>0)
begin
if @count=3
begin
set @strn = @strn + ','
set @count = 0
set @len = @len + 1
end
else
begin
set @strn =@strn+ substring ( @str ,@counter, 1 )
set @count = @count + 1
set @counter = @counter + 1
end
set @len = @len - 1
end
return ( reverse ( @strn ) )
END

شرمنده تابع تبدیل تاریخ را در SQLندارم ولی در سایت جستجو کن.احتمالا پیدا می کنی.
موفق و پایدار باشی.

saeed.samiee
چهارشنبه 13 تیر 1386, 02:43 صبح
با سلام
من این دو تابع رو چند سال پیش نوشتم و مشکلی هم با اونا تا حالا نداشتم میتونید از اونا استفاده کنید.
من از منطقی که ابوریحان بیرونی و جلالی که هزار سال پیش طراحی کردن اطلاع ندارم و یک بارهم چند سال پیش وقتی که بجای هر چهار سال یک سال کبیسه . شد پنج سال و همه توابع تبدیل دچار اختلال شدن مطمئن شدم که بهتر از روش دیگری استفاده باید کرد.
دقت کنید که هر دو تابع تبدیل از یک تیبل استفاده میکنند . در صورتی که مقادیر این تیبل رو درست وارد کنی برای همیشه این این تابع ها درست کارمیکنند .
فقط کافیه برای سالهائی که کبیسه هستند رکورد وارد کنی برای بقیه پیش فرض داره
مثل

YearShamsi StartShamsi YearMiladi StartMiladi DaysEsfand
1380 ,2001-03-21 00:00:00.000,2001 ,1379/10/11 ,29
1381 ,2002-03-21 00:00:00.000,2002 ,1380/10/11 ,29

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



CREATE TABLE [dbo].[PubShasiMiladis] (
[YearShamsi] [smallint] NULL ,
[StartShamsi] [datetime] NULL ,
[YearMiladi] [smallint] NULL ,
[StartMiladi] [char] (10) COLLATE SQL_Latin1_General_CP1256_CI_AS NULL ,
[DaysEsfand] [smallint] NULL
) ON [PRIMARY]


CREATE PROCEDURE [SpPubMiladiToShamsi]
@Date as datetime ,
@DateShamsi as char(10) Output,
@days as int output
AS
begin
declare @rozroz int
declare @mahmah int
declare @salsal int
declare @DaysEsfand int
set @DateShamsi = (select StartMiladi from PubShasiMiladis where YearMiladi = year(@Date))
set @DaysEsfand = (select DaysEsfand from PubShasiMiladis where YearMiladi = year(@Date))
if @DateShamsi = null set @DateShamsi = ltrim(rtrim(str(Year(@Date) - 622)))+'/10/11'
if @DaysEsfand = null set @DaysEsfand =29
set @rozroz = convert( int , substring (@DateShamsi,9,2))-1
set @mahmah = convert( int , substring (@DateShamsi,6,2))
set @salsal = convert( int , substring (@DateShamsi,1,4))
set @Days = DateDiff(DayOfYear,str(Year(@Date)),@Date)+1
if @Days <= (30 - @rozroz) begin
set @rozroz = @rozroz + @days
end else begin
set @Days = @Days - (30-@rozroz)
if @Days <=30 begin
set @mahmah=11
set @rozroz = @Days
end else begin
set @days = @Days -30
if @Days <= @DaysEsfand begin
set @mahmah=12
set @rozroz = @Days
end else begin
set @days = @Days - @DaysEsfand
if @days<=186 begin
set @salsal = @salsal +1
set @mahmah = round((@days-1) / 31,0)+1
set @rozroz = @days - (@mahmah-1 )* 31
end else begin
set @salsal = @salsal +1
set @days = @Days - 186
set @mahmah = 6+round((@days-1) / 30,0) + 1
set @rozroz = @days - (@mahmah-7 )* 30
end
end
end
end
set @DateShamsi = str(@salsal,4) + '/'+ str(@mahmah,2)+ '/'+ str(@rozroz,2)
set @DateShamsi = REPLACE(@DateShamsi,' ','0')
end





CREATE PROCEDURE [SpPubShamsiToMiladi]
@Year as int =1380,
@Month as int =1,
@Day as int =1,
@days as int=0,
@datetime as datetime output
AS
begin
declare @startShamsi datetime
set @startShamsi = (select startShamsi from PubShasiMiladis where YearShamsi = @Year)
if @startShamsi is null set @startShamsi = rtrim(ltrim(str( @year+622)))+'/03/21'
if @Month <= 6
set @Days = (@Month - 1) * 31 + @Day
else
set @Days = 6 * 31 + (@Month-7) * 30 + @Day
set @datetime = dateadd( day ,@Days-1,(@startShamsi))
end

موفق باشید
سعید سمیعی

vahid64
چهارشنبه 13 تیر 1386, 13:13 عصر
بهترین روش برای کار با تاریخ برای فارسی زبانان انتخاب یک رشته 10 کاراکتری است که مدیریت خطا و ورودی مقادیر کاربر روی آن کنترل شود

موفق باشید
بابک خان این چه پستیه شما دادید ؟؟؟؟!!!!!
مهندس ببین reply من به چیه اونوقت جواب بده :عصبانی++:
این و که تو همین تاپیک هم قبلاً گفته بودن :قهقهه:

SYNDROME
چهارشنبه 13 تیر 1386, 13:44 عصر
با سلام

بابک خان این چه پستیه شما دادید ؟؟؟؟!!!!!
مهندس ببین reply من به چیه اونوقت جواب بده :عصبانی++:
این و که تو همین تاپیک هم قبلاً گفته بودن :قهقهه:
منظور آقا بابک گل جواب به پست شما نبود بلکه جواب به دو سه پست بالاتر بود
با احترام
آقا بابک اگر پست شما نقل قول داشت دوستمان اشتباه نمی کرد

اَرژنگ
چهارشنبه 13 تیر 1386, 17:22 عصر
بهترین روش برای کار با تاریخ برای فارسی زبانان انتخاب یک رشته 10 کاراکتری است که مدیریت خطا و ورودی مقادیر کاربر روی آن کنترل شود

موفق باشید
به این طریق جطوری میشه محاسبات بر رویشان انجام داد؟
استفاده از رشته به جایه تاریخ از لحاض اصول مهندسی نرم افزار به نظر درست نمیاد.

SYNDROME
چهارشنبه 13 تیر 1386, 17:37 عصر
با سلام

به این طریق جطوری میشه محاسبات بر رویشان انجام داد؟
استفاده از رشته به جایه تاریخ از لحاض اصول مهندسی نرم افزار به نظر درست نمیاد.
بستگی به چه نوع محاسبه یا عملیاتی با چه وسعتی دارد؟
اگر فقط منظور بزرگتر ، کوچکتر و مساوی باشد با ">=<" حل می شود؟
اگر برای عملیات محاسباتی باشد شما می توانید خودتان تابع بنویسید؟(البته زمانبر است)
البته من هم مخالف اصول مهندسی نرم افزار نیستم ولی در بعضی از جاها برای ما ایرانی ها که تاریخ شمسی داریم بهتر است.
موفق باشید

Batman
جمعه 15 تیر 1386, 18:22 عصر
آقای Syndrome دست گلت درد نکنه

babak869
جمعه 15 تیر 1386, 22:45 عصر
آقای احدی چجوری مقایسه کنیم

سلام
شما میتونید براحتی مثل رشته مقادیر ورودی رو مقایسه نمایید و مقادیر کوچک تر و بزرگتر رو جدا کنید .

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

babak869
جمعه 15 تیر 1386, 23:24 عصر
بابک خان این چه پستیه شما دادید ؟؟؟؟!!!!!
مهندس ببین reply من به چیه اونوقت جواب بده :عصبانی++:
این و که تو همین تاپیک هم قبلاً گفته بودن :قهقهه:

دوست عزیز
لطفا اجازه بدید پستهاتون به 10 برسه بعد اجازه تند صحبت کردن بابقیه اعضا رو به خودتون بدید.
چرا عصبانی میشید؟

من در جواب دوستی که پرسیده بودند(mvb.net) برای استفاده از تاریخ با فرمت datetime دچار مشکل شدند این روش رو پیشنهاد کردم .

در ضمن اگه دقت کنید من فقط پیشنهاد دادم

babak869
جمعه 15 تیر 1386, 23:45 عصر
به این طریق جطوری میشه محاسبات بر رویشان انجام داد؟
استفاده از رشته به جایه تاریخ از لحاض اصول مهندسی نرم افزار به نظر درست نمیاد.

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

موفق باشید

babak869
جمعه 15 تیر 1386, 23:58 عصر
با سلام

بستگی به چه نوع محاسبه یا عملیاتی با چه وسعتی دارد؟
اگر فقط منظور بزرگتر ، کوچکتر و مساوی باشد با ">=<" حل می شود؟
اگر برای عملیات محاسباتی باشد شما می توانید خودتان تابع بنویسید؟(البته زمانبر است)
البته من هم مخالف اصول مهندسی نرم افزار نیستم ولی در بعضی از جاها برای ما ایرانی ها که تاریخ شمسی داریم بهتر است.
موفق باشید

کاملا با نظر شما موافقم . در بعضی مواقع لازمه که استانداردها رو زیر پا گذاشت

vahid64
یک شنبه 17 تیر 1386, 17:43 عصر
سلام بچه ها شرمنده یه چند روزی مسافرت بودم دسترسی به اینترنت نداشتم


منظور آقا بابک گل جواب به پست شما نبود بلکه جواب به دو سه پست بالاتر بود
با احترام
آقا بابک اگر پست شما نقل قول داشت دوستمان اشتباه نمی کرد

syndrome عزیز ممنون از تلاشتون برای رفع ابهام ::


دوست عزیز
لطفا اجازه بدید پستهاتون به 10 برسه بعد اجازه تند صحبت کردن بابقیه اعضا رو به خودتون بدید.
چرا عصبانی میشید؟

من در جواب دوستی که پرسیده بودند(mvb.net) برای استفاده از تاریخ با فرمت datetime دچار مشکل شدند این روش رو پیشنهاد کردم .

در ضمن اگه دقت کنید من فقط پیشنهاد دادم

تعداد پست این قدر مهم بود ما خبر نداشتیم ::::::

soroush_vs
یک شنبه 17 تیر 1386, 19:02 عصر
استفاده از یک String با 10 کاراکتر بجای Date/Time موقعی که مجبور به این کار هستیم هیچ ربطی به اصول مهندسی نرم افزار نداره .در دنیای امروز و روی برنامه های مربوط به PC رسیدن به حداکثر سرعت اهمیت بیشتری نسبت به حداکثر صرفه جویی در حافظه داره.(به خاطر فرق 10 بایت و 8 بایت که فقط 2 بایت در هر رکورد میشه زیاد چونه نزنید چون اگه بخای ازDate/Time باید این رو هم به تنت بمالی که برای هر Query یا ذخیره اطلاعات باید تبدیل تاریخ رو انجام بدی که به شدت روی سرعت اطلاعاتت اثر میزاره خصوصا توی OnCalculate .ممکنه محاسبات خیلی حیاتی تری رو بخای توی OnCalculate انجام بدی )در مورد مقایسه هم به راحتی میتونی مقایسه رو به راحتی انجام بدی (توی پست های قبلی هم گفته شده با استفاده از عملگرهای مقایسه ای = > <)