PDA

View Full Version : جمع زدن چندین تایم



mostafag
چهارشنبه 01 خرداد 1392, 15:31 عصر
با سلام

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

مثلا توی اون فیلد این اعداد ثبته:
02:25
03:00
10:30
که جوابش میشه : 15:55 ساعت

این به معنی ساعت 15:55 نیست، به معنی 15 ساعت 55 دقیقه کار کردن هست! میخوام اینا رو با یه روشی جمع بزنم.

حالا با هر روشی! اگه تابعی چیزی باشه که خیلی خوب میشه تا این همه کد نخواد براش به صورت دستی نوشت. حالا تا نظر شما چی باشه؟؟ من توی نت خیلی جستجو کردم برا زبان های دیگه بود ولی برا وی بی 6 چیزی نبود

با تشکر

mostafag
چهارشنبه 01 خرداد 1392, 16:14 عصر
دوستان عزیز من دوتا کد متفاوت پیدا کردم یکیش اینه :


Dim Time1 As Date
Dim Time2 As Date
Dim TotalTime As Date

Time1 = "20:15"
Time2 = "4:30"

TotalTime = Time1 + Time2

MsgBox hour(TotalTime) & " Hours " & Minute(TotalTime) & " Minutes"


و یکیه دیگه هم این :


Time1 = "15:00"
Time2 = "10:20"
MsgBox Format(CDbl(CDate(Time1) + CDate(Time2)), "hh:mm")


اولا اینکه به نظر شما کدوم کد بهتر عمل میکنه و ثانیا اینکه اینا یک مشکل دارن اونم اینه وقتی که از 24 ساعت زمان بیشتر میشه از صفر شروع میکنن! حالا چیکار کنم که بعد از 24 ساعت یا روز بزنه یا اصلا همون ساعت رو بنویسه. چون صفر که نمیشه....

mostafag
چهارشنبه 01 خرداد 1392, 22:19 عصر
عزیزان برنامه نویس لطفا اگه اطلاعاتی دارید دریغ نکنید.

این دو کد دارن به درستی عمل میکنن اما فقط مشکلشون اینه که وقتی زمان از 24 ساعت بیشتر میشه از صفر شروع میکنه! من میخوام بدونم اون عدده روز کجا میره؟!! چطوری میشه کاری کرد اونم حساب کنه! کلمه d رو که اضافه میکنم میاد تعداد روز های ماه رو مینویسه!! چیکار کنم از عدد 1 شروع کنه؟؟!! یا حتی چیکار میشه کرد که بدون محدودیت به ساعت ها اضافه کنه یعنی بعد از 24 بنویسه 25 و همینطور الی آخر....


لطفا کمک کنید ، من به این کد نیاز دارم

با تشکر

vbhamed
پنج شنبه 02 خرداد 1392, 02:01 صبح
سلام
به خاطر اينه كه نبايد از نوع داده date براي محاسبه جواب استفاده كنيد

Dim Time1 As Date
Dim Time2 As Date
Dim TotalTime As Long

Time1 = "20:39"
Time2 = "12:52"

TotalTime = (Hour(Time1) + Hour(Time2)) * 60 + Minute(Time1) + Minute(Time2)

MsgBox TotalTime \ 60 & " Hours " & TotalTime Mod 60 & " Minutes"

mostafag
جمعه 03 خرداد 1392, 12:47 عصر
خیلی خیلی ممنونم از شما آقا حامد

با نکته ای که گفتید من اومدم کد رو به صورتی که لازم دارم تغییر دادم.

فرض کنید فیلدی توی جدول بانکتون دارید به نام sum-time. حالا میخوایم این فیلد رو همشو با هم جمع بزنید و ببینید کلا چند ساعت و دقیقه میشه. من این کد رو اینطوری نوشتم :


Dim Time1 As Date
Dim Time2 As Date
Dim TotalTime As Variant

' ریختن اولین فیلده بانک در totaltime به صورت دقیقه

TotalTime = hour(lblsum-time.Caption) * 60 + Minute(lblsum-time.Caption)

'ممکنه توی بانک فقط یک فیلد باشه پس نباید movenext کرد پس این شرط قرار گرفته
If Adotime.Recordset.RecordCount <> 1 Then
Adotime.Recordset.MoveNext
End If

'چون یکی از فیلدها رو خوندیم پس از فیلد دوم شروع میکنیم
For i = 1 To Adotime.Recordset.RecordCount - 1

'تبدیل totaltime به ساعت و ریختن اون در تایم اول
Time1 = TotalTime \ 60 & ":" & TotalTime Mod 60

'خواندن فیلد بعدی از بانک و ریختن آن در تایم دوم
Time2 = lblsum-time.Caption

'جمع دو تایم با هم و ریختن حاصل در totaltime
TotalTime = (hour(Time1) + hour(Time2)) * 60 + Minute(Time1) + Minute(Time2)
Adotime.Recordset.MoveNext
Next i
Adotime.Recordset.MoveFirst

'تبدیل totaltime (که به صورت دقیقه است) به تایم و نمایش آن
MsgBox TotalTime \ 60 & " Hours " & TotalTime Mod 60 & " Minutes"


lblsum-time به همون فیلدی که تایم هامون توشن وصله.

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

14:57
09:04
15:01

هستش از خط بعد از for خطای type mismatch میگیره.

در صورتی که اگه همین عددها برابر با :


04:57
09:04
15:01

باشه خطا نمیگیره و درست عمل میکنه! نتونستم رابطه ی منطقیش برای خطا رو پیدا کنم!

لطفا کمکم کنید تا بتونم مشکل رو پیدا و رفعش کنم...

با تشکر مجدد

vbhamed
جمعه 03 خرداد 1392, 19:59 عصر
سلام
لطفا اگر مي‌تونيد بانكتون رو با چند ركورد نمونه مشكل دار بزاريد

mostafag
شنبه 04 خرداد 1392, 14:55 عصر
این هم یک نمونه تست...

کد رو نوشتم اما روی بعضی از مقادیر مثل موردی که نوشتم ارور میده!

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

vbhamed
شنبه 04 خرداد 1392, 18:30 عصر
سلام

خب ببينيد، نوع داده Date براي محاسبه مقادير ساعت و تاريخ هست و مقدار غير مجاز رو نبايد قبول كنه وقتي داخل يك متغير از نوع Date مثلا قرار مي‌دين 17:35 منظور اينه :
ساعت 17 و 35 دقيقه
و منظور اين نيست
17 ساعت و 35 دقيقه
اين دو تا با هم فرق دارن اولي فقط تا 23:59 مي‌تونه باشه يعني نيمه شب ولي دومي تعداد ساعت و دقيقه دلخواه رو نشون مي‌ده كه ربطي به ساعت رسمي نداره
در هر حال چون تو بانك شما ساعت به صورت متني ذخيره شده جمع زدنش خيلي راحت هست و براي 3 رقمي و بالاتر هم مشكلي نداره
اينم نمونه
Private Sub Command1_Click()

Dim TotalTime As Variant

Adotime.CommandType = adCmdText
Adotime.RecordSource = "SELECT Sum(left$([sum-time], InStr([sum-time], ':') - 1)) AS Hours, Sum(Mid$([sum-time], InStr([sum-time], ':') + 1)) AS Minutes FROM times"
Adotime.Refresh

TotalTime = Adotime.Recordset!hours * 60 + Adotime.Recordset!Minutes
MsgBox TotalTime \ 60 & " Hours " & TotalTime Mod 60 & " Minutes"

End Sub

mostafag
دوشنبه 24 تیر 1392, 13:20 عصر
آقا حامد خیلی ممنون از کمکتون من کارم راه افتاد اما الان به یه مشکل جدید خوردم!! اونم اینه که این کد روی کل اطلاعات جدول اعمال میشه و دیتاگریدم بهم میزنه شکلش!! توی برنامه ای که من دارم کاربر اول جستجو انجام میده بعدش عمل جمع به طور خودکار توی یه کادر صورت میگیره!! نمونه برنامه ی پیوست رو ببینید متوجه میشید.

اگه میشه بگید چطور این کد رو بنویسم تا با روش اتوماتیک وصل شدن به بانک هم مشکلی پیش نیاد چون شما از روش کدنویسی، دیتاسورس رو متصل کرده بودید.

متاسفانه خیلی وقتیه وی بی کار نکردم اینارو فراموش کردم! اگه کمک کنید ممنون میشم.

m.4.r.m
دوشنبه 24 تیر 1392, 15:31 عصر
این کد رو درون باتون Filter قرار بده حل میشه :

Private Sub Command2_Click()


Adotime.RecordSource = "SELECT Sum(left$([sum-time], InStr([sum-time], ':') - 1)) AS Hours, Sum(Mid$([sum-time], InStr([sum-time], ':') + 1)) AS Minutes FROM times Where Name='" & txtsearch.Text & "'"
Adotime.Refresh

TotalTime = Adotime.Recordset!hours * 60 + Adotime.Recordset!Minutes
MsgBox TotalTime \ 60 & " Hours " & TotalTime Mod 60 & " Minutes"
End Sub

mostafag
دوشنبه 24 تیر 1392, 16:09 عصر
ممنون از پاسخ شما دوست عزیز

یه مشکل اینکه این کد توی برنامه ی تست که دادم کار میکنه اما توی برنامه ی اصلیم به خط adotime.refresh گیر میده! عکسشم پیوست کردم.

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

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

بازم تشکر از پاسخ

m.4.r.m
سه شنبه 25 تیر 1392, 00:14 صبح
اینطوری نمیشه یا باید سورس رو بزاری اینجا یا هم درست کد رو جا گذاری کنی من تو تکه کدی که به شما دادم چون txtsearch شما از نوع رشته ای بود و مقدار Name رو جست و جو می کرد از نوع رشته ای نوشتم اما اگر نوع فیلتر شما بر اساس یک فیلد عددی باشد کد کمی باید تغییر کند . مشکل شما از اینجاست

mostafag
سه شنبه 25 تیر 1392, 12:32 عصر
فرض میگیریم کد شما توی برنامه ی من اجرا میشه!! حالا فرض میکنیم که اطلاعات داخل جدول به این شکله:


http://www.7upload.ir/uploads/m56063_1.jpg

بعد از اینکه کاربر کلمه ی test1 رو توی کادر وارد میکنه و روی فیلتر کلیک میکنه با این کدی که دادید این اتفاق میفته:


http://www.7upload.ir/uploads/34548_2.jpg

ولی من نمیخوام دیتاگرید تغییر کنه!! یعنی میخوام نتیجه این شکلی بشه :


http://www.7upload.ir/uploads/o910904_3.jpg

فکر کنم دیگه منظورمو واضح رسوندم!

مجددا بابت پاسختون تشکر میکنم

vbhamed
سه شنبه 25 تیر 1392, 13:29 عصر
سلام
خب اينكه كاري نداره
يك ADO ديگه رو فرم بزاريد و به جاي AdoTime از اون براي محاسبه استفاده كنيد و اين Ado جديد به گرايد متصل نباشه
اين دستورات رو براي Ado جديد بنويسيد و در AdoTime قبلي هم همين دستورات فقط ديگه دستور Sum رو نياريد فقط شرط where به بعد رو داشته باشه يعني همچين چيزي
Adotime.RecordSource = "SELECT * FROM times Where Name='" & txtsearch.Text & "'"
البته بهتر اين هست كه از كدنويسي به جاي استفاده از ADO جديد بهره گيري كنيد

m.4.r.m
سه شنبه 25 تیر 1392, 13:52 عصر
ببین حامد جان راست میگه از طریق کد نویسی انجام بدی راحت تری من یه برنامه یه بار مثله برنامه شما نوشته بودم اول اومدم ساعت های ستون رو گرفتم و با Left و Right ساعت و دقیقه رو جدا کردم و هر کدوم رو درون لیست باکس و یا آرایه ذخیره کردم بعد ساعت ها رو جدا جمع زدم و دقیقه ها رو جدا فقط باید دقت داشته باشی دقیقه ها وقتی بیشتر از 60 شدن برابر صفر شده و مقدار 1 به ساعت اضافه بشه . به همین راحتی

vbhamed
سه شنبه 25 تیر 1392, 14:22 عصر
ببین حامد جان راست میگه از طریق کد نویسی انجام بدی راحت تری من یه برنامه یه بار مثله برنامه شما نوشته بودم اول اومدم ساعت های ستون رو گرفتم و با Left و Right ساعت و دقیقه رو جدا کردم و هر کدوم رو درون لیست باکس و یا آرایه ذخیره کردم بعد ساعت ها رو جدا جمع زدم و دقیقه ها رو جدا فقط باید دقت داشته باشی دقیقه ها وقتی بیشتر از 60 شدن برابر صفر شده و مقدار 1 به ساعت اضافه بشه . به همین راحتی

m.4.r.m جان
ايشون ديتاشون متني ذخيره شده و نياز به اين كارها نداره
منظور من از كدنويسي اين بود كه به جاي ADO دوم كه گفتم از ADODB.Connection استفاده كنن