PDA

View Full Version : حرفه ای: چند ماه و چند روز ، ماه جاري ، سه ماهه اخير ، سال جاري



crying sphere
چهارشنبه 14 مهر 1389, 11:43 صبح
با سلام خدمت دوستان

من مي خوام ببينم بين دو تاريخ شمسي چند ماه و چند روز فاصله است . مثلا بين دو تاريخ #1388/07/15# و #1389/08/16# خروجي به اين صورت است : 13 ماه و 1 روز

من مي خوام گزارشي تهيه كنم كه كالاهايي رو كه در ماه جاري ، سه ماهه اخير و سال جاري با توجه به تاريخ فعلي وارد انبار شده اند رو نمايش بده . كسي كدشو بلده؟

ممنون مي شم اگه كسي راهنمائيم كنه .

ali_najari
چهارشنبه 14 مهر 1389, 13:50 عصر
يه سرجي توي سايت بزن پيدا ميكني
اگه پيدا نكردي خبر بده تا برات يه تابع بنويسم

crying sphere
چهارشنبه 14 مهر 1389, 13:59 عصر
يه سرجي توي سايت بزن پيدا ميكني
اگه پيدا نكردي خبر بده تا برات يه تابع بنويسم

من زياد گشتم . در مورد ماه جاري ، سه ماهه اخير و سال جاري كه اصلا چيزي پيدا نكردم.
در مورد تعداد ماه و روز اينكه يه چيزايي پيدا كردم فقط اينجوري بود كه تعداد روز رو از تاريخ تا تاريخ ديگه ، كلا حساب ميكرد كه اينو بلد بودم با datediff بنويسمش. من مي خوام اين جور باشه كه تعداد ماه رو بده و تعداد روز رو باتوجه به ماه بده. منظور من رو فهميديد؟. به مثال توجه كنيد .
حالا اگر لطف كنين يك كد بذارين. ممنون

ali_najari
چهارشنبه 14 مهر 1389, 14:46 عصر
اين كد ناقصه ولي ميتوني خودت كاملش كني

تقريبا كاري رو كه تو ميخواي انجام ميده ولي نه خيلي دقيق



Enum Operation
year = 0
Mounth = 1
Day = 2
EndEnum
PrivateFunction ShamsiDateDiff(ByVal Date1 AsString, ByVal Date2 AsString, OptionalByVal Seperator AsString = "/") AsInteger
Dim pc AsNew Globalization.PersianCalendar
Dim da1 = Date1.Split(Seperator)
Dim da2 = Date2.Split(Seperator)
Dim dt1 = pc.ToDateTime(da1(0), da1(1), da1(2), 0, 0, 0, 0)
Dim dt2 = pc.ToDateTime(da2(0), da2(1), da2(2), 0, 0, 0, 0)
Return DateDiff(DateInterval.Day, dt1, dt2)
EndFunction
PublicFunction GetDateNumber(ByVal StartDate AsString, ByVal FinishDate AsString, OptionalByVal Seperator AsString = "/", OptionalByVal Operation As Operation = Operation.year)
GetDateNumber = 0
Dim OldDay AsInteger = ShamsiDateDiff(StartDate, FinishDate, Seperator)
Dim Sal, Mah, Roz AsInteger
Sal = (OldDay - (OldDay Mod 365)) / 365
Dim S AsInteger = (OldDay - (Sal * 365))
Mah = (S - (S Mod 30)) / 30
Roz = OldDay - ((Sal * 365) + (Mah * 30))
SelectCase Operation
Case DateOperation.Operation.year
GetDateNumber = Sal
Case DateOperation.Operation.Day
GetDateNumber = Roz
Case DateOperation.Operation.Mounth
GetDateNumber = Mah
EndSelect
Return GetDateNumber
EndFunction


طريقه استفاده از كد



MsgBox("Year: " & GetDateNumber(TextBox1.Text, TextBox2.Text, , Operation.year) & _
vbCrLf & "Mounth: " & GetDateNumber(TextBox1.Text, TextBox2.Text, , Operation.Mounth) & _
vbCrLf & "Day: " & GetDateNumber(TextBox1.Text, TextBox2.Text, , Operation.Day))

crying sphere
شنبه 17 مهر 1389, 13:50 عصر
با تشكر از شما دوست گرامي بابت وقتي كه گذاشتيد و زحمتي كه كشيديد :

من كدهاي شما را امتحان كردم ولي يه مشكلي داشت كه اين خطا رو مي داد . خيلي بررسي كردم اما نتيجه نداد . فكر كنم تابع يا متدي رو از قلم انداختيد .

ميشود راهنمائيم كنيد .

ali_najari
شنبه 17 مهر 1389, 14:37 عصر
دوست عزيز شما براي Copy كردن متن يكم اشتباه كرديد چون تيكه آخر متن را كپي نكرديد

من تيكه كد بالا رو توي يه فايل Text داخل پوشه Zip براتون توي ضميمه ميزارم

crying sphere
شنبه 17 مهر 1389, 14:48 عصر
دوست عزيز شما براي Copy كردن متن يكم اشتباه كرديد چون تيكه آخر متن را كپي نكرديد

من تيكه كد بالا رو توي يه فايل Text داخل پوشه Zip براتون توي ضميمه ميزارم

آقا من از شما خيلي معذرت مي خوام . تو زحمت افتادين . من درست كپي كردم ، حالا تو عكس برا اينكه حجمش بياد پايين از دو رو برش زدم . :لبخندساده::لبخندساده: . شما مي تونيد لطف كنين فايل برنامشو بذارين . چون واقعا گير كردم توش . اگه به عكس خوب دقت كنين روي DateOperation گير مي ده . بازم از شما ممنونم.

ali_najari
شنبه 17 مهر 1389, 14:56 عصر
دوست عزيز من خيلي معذرت ميخوام واقعا
براي درست شدن كد قيمت DateOperation رو كلا پاك كنيد و فقط از Operation به بعد رو بايد بزاريد

من كد رو اصلاح كرده بودم توي يه فايل text و يادم رفته بود اون قسمت رو اصلاح كنم

زحمت بكشيد كد زير رو استفاده كنيد



Enum Operation
year = 0
Mounth = 1
Day = 2
End Enum
Private Function ShamsiDateDiff(ByVal Date1 As String, ByVal Date2 As String, Optional ByVal Seperator As String = "/") As Integer
Dim pc As New Globalization.PersianCalendar
Dim da1 = Date1.Split(Seperator)
Dim da2 = Date2.Split(Seperator)
Dim dt1 = pc.ToDateTime(da1(0), da1(1), da1(2), 0, 0, 0, 0)
Dim dt2 = pc.ToDateTime(da2(0), da2(1), da2(2), 0, 0, 0, 0)
Return DateDiff(DateInterval.Day, dt1, dt2)
End Function
Public Function GetDateNumber(ByVal StartDate As String, ByVal FinishDate As String, Optional ByVal Seperator As String = "/", Optional ByVal Operation As Operation = Operation.year)
GetDateNumber = 0
Dim OldDay As Integer = ShamsiDateDiff(StartDate, FinishDate, Seperator)
Dim Sal, Mah, Roz As Integer
Sal = (OldDay - (OldDay Mod 365)) / 365
Dim S As Integer = (OldDay - (Sal * 365))
Mah = (S - (S Mod 30)) / 30
Roz = OldDay - ((Sal * 365) + (Mah * 30))
Select (Operation)
Case Operation.year
GetDateNumber = Sal
Case Operation.Day
GetDateNumber = Roz
Case Operation.Mounth
GetDateNumber = Mah
End Select
Return GetDateNumber
End Function

crying sphere
شنبه 17 مهر 1389, 15:16 عصر
با تشكر از دوست گرامي :

كد خوبيه ، فقط توي محاسبه روزاش دقتش كمه . چند روزي بالا پايين داره. حالا من روش كار مي كنم تا مشكلشو حل كنم .

در مورد بدست آوردن ماه جاري و سه ماهه اخير كسي نظري نداره ؟ اگر نياز به توضيح هست كه توضيح بدم . با تشكر از همه شما كه وقت مي ذاريد.

ali_najari
شنبه 17 مهر 1389, 15:45 عصر
يكم توضيح بديد

چي رو ميخوايد بدست بياريد؟
نام ماه جاري رو ميخوايد يا عددش رو ؟

واسه سه ماه اخير كافيه كه از دستور زير استفاده كني



Now.AddMonths(-3).ToShortDateString


با كد فوق نشون ميده كه 3 ماه پيش چه تاريخي بوده

crying sphere
شنبه 17 مهر 1389, 16:05 عصر
من مي خوام توي چاپ فاكتورم كالاهايي رو كه مربوط به سه ماه اخير بودند رو ليست كنم .
براي مثال اگر امروز 17/7/1389 باشه كالاهايي رو كه از تاريخ 17/4/1389 تا الان وارد انبار شدند رو ليست كنه .

من اين كد رو كه شما داديد امتحان كردم . درسته تاريخ سه ماه پيش رو ميده . فكر كنم با همين جوابمو بگيرم . حالا اگر شما نظر يا كد بهتري داريد بذاريد .
ممنونم

alimanam
شنبه 17 مهر 1389, 18:06 عصر
با سلام

براي مثال اگر امروز 17/7/1389 باشه كالاهايي رو كه از تاريخ 17/4/1389 تا الان وارد انبار شدند رو ليست كنه .


كد خوبيه ، فقط توي محاسبه روزاش دقتش كمه . چند روزي بالا پايين داره. حالا من روش كار مي كنم تا مشكلشو حل كنم .

من کد دوست عزیزی که زحمت کشیده بود رو تست نکردم اما با Persian Gulf Date دقیقترین تاریخ رو میتونی بدست بیاری و هرکاری که با تاریخ شمسی بخوای واست انجام میده . موفق باشید .

http://302357.20upload.net/files/sh5/12866363871.gif

crying sphere
یک شنبه 18 مهر 1389, 15:24 عصر
آقا من نمي دونم چطور از شما تشكر كنم . خيلي ممنونم از شما بابت اين dll تون :تشویق::تشویق::تشویق:

يك سوال ديگه اينكه آيا با اين dll ميشه تعداد ماه ها و روزهاي بين دو تاريخ رو حساب كرد ؟
مثلا بين دو تاريخ #1388/07/15# و #1389/08/16# خروجي را به اين صورت روبرو بدهد : 13 ماه و 1 روز

چون همونطور كه در بالا هم گفتم كدي كه آقاي ali_najari (http://barnamenevis.org/forum/member.php?u=47495) ارائه كردند كه از همين جا هم ازشون تشكر مي كنم ، خوب بود ولي خب تعداد روزها و گاهي هم ماه ها رو زياد دقيق نمي داد . گفتم كه اگر با اين dll ميشه اين كارو كرد كه بهتره از همين استفاده كنم .

alimanam
یک شنبه 18 مهر 1389, 15:44 عصر
با سلام


يك سوال ديگه اينكه آيا با اين dll ميشه تعداد ماه ها و روزهاي بين دو تاريخ رو حساب كرد ؟
مثلا بين دو تاريخ #1388/07/15# و #1389/08/16# خروجي را به اين صورت روبرو بدهد : 13 ماه و 1 روز

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

kashir
سه شنبه 20 مهر 1389, 00:33 صبح
تعداد روزهای بین دو تا تاریخ شمسی رو بصورت دقیق میخوام :لبخندساده:

crying sphere
سه شنبه 20 مهر 1389, 14:34 عصر
با سلام



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

آقا خيلي ممنون از شما . منتظرم :تشویق:
با تشكر

sahele_sheni
سه شنبه 20 مهر 1389, 21:42 عصر
آقا من نمي دونم چطور از شما تشكر كنم . خيلي ممنونم از شما بابت اين dll تون :تشویق::تشویق::تشویق:

يك سوال ديگه اينكه آيا با اين dll ميشه تعداد ماه ها و روزهاي بين دو تاريخ رو حساب كرد ؟
مثلا بين دو تاريخ #1388/07/15# و #1389/08/16# خروجي را به اين صورت روبرو بدهد : 13 ماه و 1 روز

چون همونطور كه در بالا هم گفتم كدي كه آقاي ali_najari (http://barnamenevis.org/forum/member.php?u=47495) ارائه كردند كه از همين جا هم ازشون تشكر مي كنم ، خوب بود ولي خب تعداد روزها و گاهي هم ماه ها رو زياد دقيق نمي داد . گفتم كه اگر با اين dll ميشه اين كارو كرد كه بهتره از همين استفاده كنم .

dll های farsilibrary رو دانلود کن و توی برنامه add کن .
ابن کد رو به اول برنامه اضافه کن


Imports FarsiLibrary.Utils

tarikh_ejra و tarikh_estekhdam دو textbox هستند مه میخوایم باهاشون اختلاف تاریخ رو بدست بیاریم



Dim ejrahokmtarikh() As String = Split(tarikh_ejra.Text, "/")
Dim estekhdamtarikh() As String = Split(tarikh_estekhdam.Text, "/")


For counter = 0 To 2
If ejrahokmtarikh(counter) = "" Or ejrahokmtarikh(counter) = " " Or ejrahokmtarikh(counter) = "__" Then
ejrahokmtarikh(counter) = "0"
End If
Next
For counter = 0 To 2
If estekhdamtarikh(counter) = "" Or estekhdamtarikh(counter) = " " Or estekhdamtarikh(counter) = "__" Then
estekhdamtarikh(counter) = "0"
End If
Next
Dim ejratemp As String = ejrahokmtarikh(0) + "/" + ejrahokmtarikh(1) + "/" + ejrahokmtarikh(2)
Dim estekhdamtemp As String = estekhdamtarikh(0) + "/" + estekhdamtarikh(1) + "/" + estekhdamtarikh(2)
Dim ejra As Date = toEnglish.Convert(ejratemp)
Dim estekhdam As Date = toEnglish.Convert(estekhdamtemp)

Dim diff As String = DateDiff(DateInterval.Day, estekhdam, ejra)
If (CInt(diff) < 0) Then
MsgBox("اطلاعات سوابق را درست وارد نکرده اید")
Exit Sub
End If
If CInt(diff) >= 365 Then
sal = CStr(Math.Truncate((diff) / 365))
Dim tempmah As String = CStr((CInt(diff)) Mod 365)
mah = CStr(Math.Truncate(CInt(tempmah) / 30))
rooz = CStr(Math.Truncate(CInt(tempmah) Mod 30))
ElseIf CInt(diff) > 30 Then

sal = "0"
Dim tempmah As String = CStr((CInt(diff)) Mod 365)
mah = CStr(Math.Truncate(CInt(tempmah) / 30))
rooz = CStr(Math.Truncate(CInt(tempmah) Mod 30))
Else
sal = "0"
mah = "0"
rooz = diff
End If
mah = CStr(CInt(mah) + (Math.Truncate(CInt(rooz) / 30)))
rooz = CStr(CInt(rooz) Mod 30)
sal = CStr(CInt(sal) + (Math.Truncate(CInt(mah) / 12)))
mah = CStr(CInt(mah) Mod 12)


حالا شما روز ، ماه و سال رو دارید
موفق باشید

alimanam
چهارشنبه 21 مهر 1389, 20:33 عصر
با سلام


dll های farsilibrary رو دانلود کن و توی برنامه add کن .
ابن کد رو به اول برنامه اضافه کن

دوست عزیز خودت امتحان کردی ؟ :چشمک: فارسی لیبراری عالی هستش اما مثل اینکه درست متوجه مشکل این دوست ما نشدین . دوستمون می خواد اختلاف بین 2 تاریخ رو به صورت Real استخراج کنه یعنی اینکه اگه تاریخ اول ما 1388/04/20 بود و تاریخ دوم ما 1389/08/16 باشه باید به ما خروجی 15 ماه و 27 روز رو بده . که با رفرنس بالا نمیشه ( البته میشه اما با اون کدی که شما دادی نمیشه تفاوت دقیق بین دو تاریخ رو به صورتی که این دوستمون لازم دارن به دست اورد . )

اما ... من یه تابع جدید ( ShamsiDateDiff ) به رفرنس Persian Gulf Date اضافه کردم که این کار رو به دقت انجام میده . موفق باشید .

http://1imagehosting.com/images/23345pkp.gif

mhmoein
چهارشنبه 21 مهر 1389, 21:16 عصر
با سلام



دوست عزیز خودت امتحان کردی ؟ :چشمک: فارسی لیبراری عالی هستش اما مثل اینکه درست متوجه مشکل این دوست ما نشدین . دوستمون می خواد اختلاف بین 2 تاریخ رو به صورت Real استخراج کنه یعنی اینکه اگه تاریخ اول ما 1388/04/20 بود و تاریخ دوم ما 1389/08/16 باشه باید به ما خروجی 15 ماه و 27 روز رو بده . که با رفرنس بالا نمیشه ( البته میشه اما با اون کدی که شما دادی نمیشه تفاوت دقیق بین دو تاریخ رو به صورتی که این دوستمون لازم دارن به دست اورد . )

اما ... من یه تابع جدید ( ShamsiDateDiff ) به رفرنس Persian Gulf Date اضافه کردم که این کار رو به دقت انجام میده . موفق باشید .

http://1imagehosting.com/images/23345pkp.gif

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

sahele_sheni
چهارشنبه 21 مهر 1389, 22:29 عصر
با سلام



دوست عزیز خودت امتحان کردی ؟ :چشمک: فارسی لیبراری عالی هستش اما مثل اینکه درست متوجه مشکل این دوست ما نشدین . دوستمون می خواد اختلاف بین 2 تاریخ رو به صورت Real استخراج کنه یعنی اینکه اگه تاریخ اول ما 1388/04/20 بود و تاریخ دوم ما 1389/08/16 باشه باید به ما خروجی 15 ماه و 27 روز رو بده . که با رفرنس بالا نمیشه ( البته میشه اما با اون کدی که شما دادی نمیشه تفاوت دقیق بین دو تاریخ رو به صورتی که این دوستمون لازم دارن به دست اورد . )

اما ... من یه تابع جدید ( ShamsiDateDiff ) به رفرنس Persian Gulf Date اضافه کردم که این کار رو به دقت انجام میده . موفق باشید .

http://1imagehosting.com/images/23345pkp.gif

بله امتحان کردم . درست جواب میده !

در انتهای کد sal ، mah و rooz رو به کاربر میده ! حداقل یه نگاهی مینداختید به کد !

موفق باشید

alimanam
پنج شنبه 22 مهر 1389, 10:26 صبح
با سلام


در انتهای کد sal ، mah و rooz رو به کاربر میده ! حداقل یه نگاهی مینداختید به کد !

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

شما این رو تست کن هرکدوم که درست تر بود قبول کن :

برای مثال : شما این دو تاریخ رو در هر دو تست کن ( هم در فارسی لیبراری ( البته کد شما مکمل توابع فارسی لیبراری هست . و هم در رفرنس Persian Gulf Date )

تاریخ اول ( 1388/07/15 ) | تاریخ دوم ( 1390/08/15 )

نتیجه کار در فارسی لیبراری + کد شما : 2 سال و 1 ماه و 1 روز
نتیجه کار در پرشین گلف : 25 ماه و 0 روز یعنی تاریخ دقیق بین 2 تاریخ

نتیجه کلی : شما میتونی بگی اون یک روز ( 1 روز قرمز رنگی که مشخص کردم ) از کجا اومده ؟ :چشمک:


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

عزیز شما هیچوقت عادت به هلو بپر تو گلو نکن . اگه واقعاً متوجه نشدی که چطوری با همین رفرنس ( پرشین گلف ) با استفاده از تابع ShamsiDateDiff سال رو هم استخراج کرد بگو تا بیشتر توضیح بدم . :اشتباه: ( توضیحات هلویی :افسرده: : خوب میتونی تعداد ماه ها رو تقسیم بر 12 کنی دیگه >>> اگه بزرگتر از 12 بود تقسیم بر دوازه کن که جواب میشه سال و با Mod هم میتونی تعداد ماه ها رو به راحتی به دست بیاری )

موفق باشید

سینا2010
دوشنبه 29 آذر 1389, 14:53 عصر
دوست عزیز alimanam این کلاس شما درست کار نمی کنه یا بنده بلد نیستم از اون استفاده کنم می شه راهنمایی کنید. البته تصاویر رو هم ضمیه کردم . با تشکر از شما

فقط تصویر آخری درست است که اون رو هم با تصویر اولی مقایسه کنید.

mitra285
پنج شنبه 09 تیر 1390, 00:06 صبح
ببخشید می خواستم بدونم ایراد این برنامه که آقای alimanam زحمت کشیده بودن و سینا2010 (http://barnamenevis.org/member.php?148486-%D8%B3%DB%8C%D9%86%D8%A72010) مشکل رو نوشته بود حل شده یا نه؟

مرتضی تقدمی
پنج شنبه 09 تیر 1390, 21:20 عصر
سلام
فکر نکنم. اگر حل میشد اینجا قرارش می دادند.
موفق باشید

mitra285
پنج شنبه 09 تیر 1390, 22:32 عصر
پس با این وجود انگار اصلا راه حلی برای به دست آوردن احتلاف دو تاریخ شمسی به صورت سال - ماه - روز به صورت دقیق و بدون مشکل وجود نداره چون تمام تالار وی بی دانت و سی شارپ رو گشتم و هیچ راه حل درستی رو پیدا نکردم خیلی عجیبه ؟