กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
611 5
URL.หัวข้อ /
URL
คำนวณวัน ระหว่างวันที่มีอยู่แล้ว กับวันที่กำหนดใหม่
ผม Import Table เข้ามา เป็น Table ที่มี Field ชื่อ Datum (ไม่ทราบ Data Type แต่คิดว่าเป็น Date/Time)
ใน datum ดูข้อมูลเป็น 26/07/2001
ผมต้องการที่จะให้ User ใส่ วันที่ ๆ ต้องการ (สมมุตว่าเป็น MyDate) แล้วนำวันที่ ที่ใส่นั้นมาคำนวณ (Age) เป็นวัน เช่น
MyDate = 04/09/2001
Datum = 26/07/2001
ได้ Age = 345
ผมลองทำใน Query
Age: Format([MyDate],"dd/mm/yyyy") -Format([dbo_Dbopen].[datum],"dd/mm/yyyy")
แล้วมันขึ้น #ERROR
ลอง ลบกันเฉย ๆ แบบ MyDate - [dbo_Dbopen].[datum] มันก็ขึ้น Error เหมือนกันครับ
ถ้าทำใน Query ไม่ได้ เราไปทำที่ Report ได้ไม๊ครับ ผมลองทำใน Report มันก็ Error
อาจจะเป็นเพราะว่าผมอ้างอิงค่าไม่เป็นครับ คือผมเขียนแบบนี้ครับ
Private Sub Report_Open(Cancel As Integer)
Dim Message, Title, Default, MyValue, CompareDate
Dim TheDate As Date
Dim Msg
Message = "Enter date of aging "
Title = "Date of Aging Entry "
Default = Date
' Display message, title, and default value.
MyValue = InputBox(Message, Title, Default)
Reports!DebtorAging!LblAge.Caption = MyValue
TheDate = Reports!DebtorAging!TxtDatum.Text ****** ผิดตรงนี้ครับ ***** จุดประสงค์คือจะเอาค่าใน datum เช่น
****** 26/07/2001 มาหาวันกับ MyValue ที่เราใส่ไว้ตอนแรก ****
Msg = "Age: " & DateDiff("d", MyValue, TheDate)
MsgBox Msg
End Sub
หลังจากที่แก้โจทย์นี้ได้แล้ว อีก 1 โจทย์คือ
ผมต้องการที่จะคำนวณ โดยการบวก Credit Term เข้าไปอีก 120 วัน แต่ต้องการนับจาก
End of Month เช่น วันที่ใน datum เป็น 26/07/2001 (ต้องให้มันรู้เองว่าเป็นสิ้นเดือนคือ 31/07/2001 แล้ว บวกไปอีก 120
วันก็จะเป็น 28/11/2001 )
ผมควรจะทำใน Query แล้วค่อย ออก Report หรือว่าทำใน Report เลยครับ
ใน datum ดูข้อมูลเป็น 26/07/2001
ผมต้องการที่จะให้ User ใส่ วันที่ ๆ ต้องการ (สมมุตว่าเป็น MyDate) แล้วนำวันที่ ที่ใส่นั้นมาคำนวณ (Age) เป็นวัน เช่น
MyDate = 04/09/2001
Datum = 26/07/2001
ได้ Age = 345
ผมลองทำใน Query
Age: Format([MyDate],"dd/mm/yyyy") -Format([dbo_Dbopen].[datum],"dd/mm/yyyy")
แล้วมันขึ้น #ERROR
ลอง ลบกันเฉย ๆ แบบ MyDate - [dbo_Dbopen].[datum] มันก็ขึ้น Error เหมือนกันครับ
ถ้าทำใน Query ไม่ได้ เราไปทำที่ Report ได้ไม๊ครับ ผมลองทำใน Report มันก็ Error
อาจจะเป็นเพราะว่าผมอ้างอิงค่าไม่เป็นครับ คือผมเขียนแบบนี้ครับ
Private Sub Report_Open(Cancel As Integer)
Dim Message, Title, Default, MyValue, CompareDate
Dim TheDate As Date
Dim Msg
Message = "Enter date of aging "
Title = "Date of Aging Entry "
Default = Date
' Display message, title, and default value.
MyValue = InputBox(Message, Title, Default)
Reports!DebtorAging!LblAge.Caption = MyValue
TheDate = Reports!DebtorAging!TxtDatum.Text ****** ผิดตรงนี้ครับ ***** จุดประสงค์คือจะเอาค่าใน datum เช่น
****** 26/07/2001 มาหาวันกับ MyValue ที่เราใส่ไว้ตอนแรก ****
Msg = "Age: " & DateDiff("d", MyValue, TheDate)
MsgBox Msg
End Sub
หลังจากที่แก้โจทย์นี้ได้แล้ว อีก 1 โจทย์คือ
ผมต้องการที่จะคำนวณ โดยการบวก Credit Term เข้าไปอีก 120 วัน แต่ต้องการนับจาก
End of Month เช่น วันที่ใน datum เป็น 26/07/2001 (ต้องให้มันรู้เองว่าเป็นสิ้นเดือนคือ 31/07/2001 แล้ว บวกไปอีก 120
วันก็จะเป็น 28/11/2001 )
ผมควรจะทำใน Query แล้วค่อย ออก Report หรือว่าทำใน Report เลยครับ
5 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R00861
ลองดู Funtion ที่ อ.สุภาพ แนะนำผม แล้วลองดัดแปลงดูนะครับ
---------------------------------------------------------------------------
Function CalAgeYMD2(BDate As Date)
Dim intYear As Integer
Dim intMonth As Integer
Dim intDay As Integer
If BDate < Now() Then
intMonth = DateDiff("m", BDate, Now())
intDay = DateDiff("d", DateAdd("m", intMonth, BDate), Now())
If intDay < 0 Then
intMonth = intMonth - 1
intDay = DateDiff("d", DateAdd("m", intMonth, BDate), Now())
End If
intYear = intMonth \ 12
intMonth = intMonth Mod 12
CalAgeYMD2 = "อายุ " & intYear & " ปี " & intMonth & " เดือน " & intDay & " วัน."
Else
MsgBox "ยังไม่เกิดครับ"
End If
End Function
---------------------------------------------------------------------
โดยที่
BDate = วันที่ที่คุณป้อนเข้าไป (เช่น วันเกิดของ User)
Now() = วันที่ปัจจุบัน
ลองดูนะครับ
Suchat
ชลบุรี
2 @R00862
ส่วนสูตรการบวกจำนวนวัน ให้ใช้ DateAdd() ครับ
ดังนี้
? DateAdd("d",120,#31/07/2001#)
28/11/2001
3 @R00876
เรียนอาจารย์สุภาพ หรือคุณ Suchart ครับ
ถามต่อครับ คือว่า สมมุติผมมีวันที่ 20/05/2002 ผมจะทำอย่างไรให้มันไปหยุดอยู่ที่ สิ้นเดือนของทุก ๆ เดือน อย่างในคำถาม 20/05/2002 ก็ต้องให้มันเป็น 31/05/2002
Ex. ถ้าค่าเป็น 15/02/2002 ก็ให้เป็น 28/02/2002
ถ้าค่าเป็น 17/04/2002 ก็ให้เป็น 30/04/2002
4 @R00878
ใช้ DateSerial() เพื่อทำให้เป็นวันที่ 1 ของเดือนถัดไปก่อน
DateSerial(Year(วันที่เป้าหมาย), Month(วันที่เป้าหมาย) + 1, 1)
แล้วค่อยใช้ DateAdd() เพื่อให้เลื่อนไปข้างหน้าอีก 1 วัน ก็จะเป็นวันสิ้นเดือนของเดือนที่ได้รับมา
DateAdd("d", -1, MyDate)
ฟังก์ชันมีดังนี้
Function EndOfMonth(dte As Date) As Date
Dim MyDate As Date
MyDate = DateSerial(Year(dte), Month(dte) + 1, 1)
MyDate = DateAdd("d", -1, MyDate)
EndOfMonth = MyDate
End Function
ทดสอบจะได้
? endofmonth(#15/02/2002#)
28/2/2545
? endofmonth(#20/05/2002#)
31/5/2545
? endofmonth(#17/04/2002#)
30/4/2545
5 @R00987
ตัวอย่างการคำนวณอายุอีกรูปแบบหนึ่ง ไปดูได้ที่ http://forums.compuserve.com/scripts/flisapi.dll/AGEFUNC.TXT?ViewFile&SRV=MSDevApps&FID=9183&FVF=1/.TXT ครับ
Time: 0.1559s