กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
467 4
URL.หัวข้อ /
URL
การค้นหาวันที่ทำงานปกติ (จันทร์ - ศุกร์) จากวันที่ในปฏิทิน
รบกวน อ.สุภาพด้วยครับ
คือผมมีปัญหาที่ว่า ผมมีสินค้าที่ ลูกค้า Claim มา และ
ผมจะต้องส่งคืนลูกค้า หลังจากที่ลูกค้า Claim มาแล้ว
ที่เงื่อนไข
1). 5 วันทำงาน (จันทร์ - ศุกร์) หลังจากรับสินค้า Claim จากลูกค้า
เช่น ลูกค้า Claim สินค้า วันที่ 2 พค. 45
ผมต้องส่งสินค้าไปทดแทน วันที่ 9 พค. 45
2). 6 วันทำงาน (จันทร์ - เสาร์) หลังจากรับสินค้า Claim จากลูกค้า
เช่น ลูกค้า Claim สินค้า วันที่ 2 พค. 45
ผมต้องส่งสินค้าไปทดแทน วันที่ 9 พค. 45
เนื่องจากลูกค้าแต่ละคน ใช้เงื่อนไขไม่เหมือนกันครับ
และปัญหาอีกอย่างที่ผมพบก็คือ วันหยุดประจำปีของไทย ซึ่งต้องเลื่อนออกไปอีก
เพราะไม่ได้เป็นวันทำงาน
ถ้าเรากำหนดวันหยุดประจำปีของบริษัทเอง ในแต่ละปี เอาไว้เป็น Table Master
และ กำหนดวันทำงานเอง (เช่น 5 วัน หรือ 6 วัน) ก็จะดีครับ เผื่อลูกค้าคนอื่นๆ จะเปลี่ยนเงื่อนไขอีก
รบกวน อ.สุภาพด้วยครับ
ขอบพระคุณมากๆ ครับ
ด้วยความเคารพ และนับถืออย่างสูง
Suchat
ชลบุรี
คือผมมีปัญหาที่ว่า ผมมีสินค้าที่ ลูกค้า Claim มา และ
ผมจะต้องส่งคืนลูกค้า หลังจากที่ลูกค้า Claim มาแล้ว
ที่เงื่อนไข
1). 5 วันทำงาน (จันทร์ - ศุกร์) หลังจากรับสินค้า Claim จากลูกค้า
เช่น ลูกค้า Claim สินค้า วันที่ 2 พค. 45
ผมต้องส่งสินค้าไปทดแทน วันที่ 9 พค. 45
2). 6 วันทำงาน (จันทร์ - เสาร์) หลังจากรับสินค้า Claim จากลูกค้า
เช่น ลูกค้า Claim สินค้า วันที่ 2 พค. 45
ผมต้องส่งสินค้าไปทดแทน วันที่ 9 พค. 45
เนื่องจากลูกค้าแต่ละคน ใช้เงื่อนไขไม่เหมือนกันครับ
และปัญหาอีกอย่างที่ผมพบก็คือ วันหยุดประจำปีของไทย ซึ่งต้องเลื่อนออกไปอีก
เพราะไม่ได้เป็นวันทำงาน
ถ้าเรากำหนดวันหยุดประจำปีของบริษัทเอง ในแต่ละปี เอาไว้เป็น Table Master
และ กำหนดวันทำงานเอง (เช่น 5 วัน หรือ 6 วัน) ก็จะดีครับ เผื่อลูกค้าคนอื่นๆ จะเปลี่ยนเงื่อนไขอีก
รบกวน อ.สุภาพด้วยครับ
ขอบพระคุณมากๆ ครับ
ด้วยความเคารพ และนับถืออย่างสูง
Suchat
ชลบุรี
4 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R00269
ลองใช้ฟังก์ชันที่ผมสร้างขึ้น ดังนี้ครับ
Function fDeadLine(BegDate As Variant, intType As Integer, intDays As Integer) As Date
Dim I As Integer, intHolidays As Integer
Dim DateCnt As Variant
Dim EndDays As Integer
BegDate = DateValue(BegDate)
EndDays = 0
DateCnt = BegDate
For I = 1 To intDays
If intType = 1 Then
If Format(DateCnt, "ddd") <> "Sat" Then
EndDays = 1
ElseIf DCount("holidays", "tblholidays", "[holidays]= #" & DateCnt & "#") Then
EndDays = 2
Else
EndDays = 3
End If
Else
If Format(DateCnt, "ddd") <> "Sun" Then
EndDays = 1
ElseIf DCount("holidays", "tblholidays", "[holidays]= #" & DateCnt & "#") Then
EndDays = 2
Else
EndDays = 2
End If
End If
DateCnt = DateAdd("d", EndDays, DateCnt)
'Debug.Print Format(DateCnt, "d mmm yy") & " " & EndDays
Next I
If intType = 1 Then
If Format(DateCnt, "ddd") <> "Sat" Then
EndDays = 0
ElseIf DCount("holidays", "tblholidays", "[holidays]= #" & DateCnt & "#") Then
EndDays = 1
Else
EndDays = 2
End If
Else
If Format(DateCnt, "ddd") <> "Sun" Then
EndDays = 0
ElseIf DCount("holidays", "tblholidays", "[holidays]= #" & DateCnt & "#") Then
EndDays = 1
Else
EndDays = 1
End If
End If
DateCnt = DateAdd("d", EndDays, DateCnt)
fDeadLine = DateCnt
End Function
จากฟังก์ชันข้างบนผมใช้หลักการคือ ให้นับวันแรกเป็นวันเริ่มต้น แล้ว +1 เข้าไปถ้าเป็นวันธรรมดา และ +3 ถ้าเป็นวันเสาร์ในกรณีที่นับเสาร์และอาทิตย์ เพื่อให้ได้เป็นวันจันทร์ และบวกเข้าไปเป็น +2 ถ้าเป็นแบบที่ 2 คือ นับเฉพาะวันอาทิตย์ โดยใช้ฟังก์ชัน DateAdd() เพื่อบวกวันเข้าไปตามจำนวนที่ส่งออกมา
จะเห็นว่าจะต้องมีการตรวจสอบถึง 2 ครั้ง ครั้งแรกเพื่อดูว่าวันสุดท้ายคือวันไหน โดยต้องเป็นไปตามเงื่อนไข และครั้งที่ 2 เมื่อได้วันสุดท้ายจะต้องดูว่าไม่ตรงกับเสาร์อาทิตย์ หรือวันหยุดพิเศษ ด้วย
ส่วนวันหยุดที่กำหนดเองจะอยู่ในตารางชื่อ tblholidays โดยผมจะใช้ DCount() มาตรวจดูว่าวันที่นี้ตรงกับวันหยุดพิเศษหรือเปล่า ถ้าตรงก็ให้ +2
การนำฟังก์ชันไปใช้ให้ใช้ดังนี้
fdeadline(วันที่เริ่มต้น,ประเภทของวันหยุดที่ต้องการ,จำนวนวันที่จะถึงกำหนด)
โดย ประเภทของวันหยุดที่ต้องการ จะมีค่าเป็น 1 ถ้าต้องการนับเสาร์อาทิตย์ และ 2 ถ้านับเฉพาะวันอาทิตย์
เช่น ถ้าเป็นวันที่ 2 May 2545 โดยเลือกประเภทของวันแบบที่ 1 และกำหนดวัน 6 วัน จะได้
? fdeadline("2 May 2545",1,6)
11/5/2545
(หักวันที่ 4, 5, 6 วันหยุดพิเศษ ออกจะตกวันที่ 10 แต่วันที่ 10 เป็นวันหยุดพิเศษ จึงได้ค่าเป็นวันที่ 11 แทน)
แต่ถ้าเป็นประเภทที่ 2 (นับวันอาทิตย์วันเดียว) จะได้
? fdeadline("2 May 2545",2,6)
9/5/2545
(หักวันที่ 5, 6 ออกจะตกวันที่ 9)
ไฟล์ตัวอย่างจริงอยู่ที่ http://agserver.kku.ac.th/basiceng/datetime_deadline.zip ครับ
2 @R00271
ขอบพระคุณ อ.สุภาพ มากๆ ครับ
ด้วยความเคารพ และนับถืออย่างสูง
Suchat
ชลบุรี
3 @R00939
ตัวอย่างโค้ดของต่างประเทศ ลองไปอ่านดูที่กระทู้ http://www.utteraccess.com/forums/showflat.php?Cat=&Board=AxxessXP&Number=117278&page=0&view=collapsed&sb=5&o=7&fpart=1
ฟังก์ชันสำหรับการคำนวณวันทำงาน
Function Work_Days (BegDate As Variant, EndDate As Variant) As Integer
' Note that this function does not account for holidays.
Dim WholeWeeks As Variant
Dim DateCnt As Variant
Dim EndDays As Integer
BegDate = DateValue(BegDate)
EndDate = DateValue(EndDate)
WholeWeeks = DateDiff("w", BegDate, EndDate)
DateCnt = DateAdd("ww", WholeWeeks, BegDate)
EndDays = 0
Do While DateCnt < EndDate
If Format(DateCnt, "ddd") <> "Sun" And _
Format(DateCnt, "ddd") <> "Sat" Then
EndDays = EndDays + 1
End If
DateCnt = DateAdd("d", 1, DateCnt)
Loop
Work_Days = WholeWeeks * 5 + EndDays
End Function
ตัวอย่างโค้ดในการคำนวณวันหยุดพิเศษ
' FUNCTION : CalcHolidays(dStartDate As Date, dEndDate As Date) As Integer
' RETURNS : Integer
' PURPOSE : Calculates the number of company holidays between the start date and end date.
' AUTHOR : George Hepworth
' DATE : 5/4/2001
' Requires current holidays be entered in tlkpholidays
'
Public Function CalcHolidays(dStartDate As Date, dEndDate As Date) As Integer
On Error GoTo errCalcHolidays
Dim iholiday As Date
Dim iHolidayCount As Integer
Dim rstHoliday As Recordset
Dim dbHolidayCheck As Database
CalcHolidays = 0
Set dbHolidayCheck = CurrentDb
Set rstHoliday = dbHolidayCheck.OpenRecordset("tlkpHoliday")
With rstHoliday
.MoveFirst
While Not .EOF
iholiday = rstHoliday!Holiday
If iholiday >= dStartDate And iholiday <= dEndDate Then
CalcHolidays = CalcHolidays + 1
End If
.MoveNext
Wend
End With
exitCalcHolidays:
Set dbHolidayCheck = Nothing
Set rstHoliday = Nothing
Exit Function
errCalcHolidays:
MsgBox Err & ": " & Err.Description
Resume exitCalcHolidays
End Function
4 @R00943
ขอบพระคุณ อ.สุภาพ มากๆ ครับ
Suchat
ชลบุรี
Time: 0.1243s