การค้นหาวันที่ทำงานปกติ (จันทร์ - ศุกร์) จากวันที่ในปฏิทิน
กระทู้เก่าบอร์ด อ.สุภาพ ไชยา

 389   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 
ชลบุรี 

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 ชลบุรี
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.0613s