กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
        
           756   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.0534s
    
      
		