กระทู้เก่าบอร์ด อ.Yeadram
1,685 1
URL.หัวข้อ /
URL
นับวันถัดจากวันที่ทำงาน
เรียนอาจารย์ทุกท่านที่เคารพ
ผมมีเรื่องของการนับวันมาปรึกษาครับ
ตามรูปภาพ
Date_Chang = วันที่เปลี่ยนแปลง
Date_Update = วันที่เสร็จงาน
Duration = จำนวนวันทั้งหมด
heBreak = วันหยุดรวม นขัตฤกษ์
Work_Date = จำนวนวันทั้งหมด- วันหยุดรวม นขัตฤกษ์
Work_Goal = เป้าหมายงาน 4 วัน
ปัญหา
1)การทำงานของโปรแกรมมันนับตั้งแต่วัน Date_Change จนถึงวันสุดท้ายและนำมาหักลบวันหยุด จึงจะได้ Work_Date
แต่ในความเป็นจริง งานที่เข้ามาเป็นวัน Date_Change จริง แต่เวลาทำงานจริงคือวันที่ถัดมาผลปรากเช่น Date_Change =12/4/2011 ,Date_Update=
22/4/2011 ซึ่ง Work_Date = 5 วัน และวันที่ Date_Change =13/4/2011 ,Date_Update= 22/4/2011 Work_Date = 4 วัน ซึ่งไม่ถูกต้องมันต้องเป็น 5 วัน คือเริ่มนับตั้งแต่วันที่ 18/4/2011-22/4/2011
ข้อแตกต่างก็คือ ถ้าเราใส่ Date_Change เป็นวันธรรมดา จันทร์ถึงศุกร์ มันจะได้ผลลัพธ์ที่ถูกต้อง แต่ถ้า Date_Change ตรงกับวันหยุดหรือวันนขัตฤกษ์จะไม่ตรง
2)นับวันเป้าหมาย Work_Goal ทั้งหมดกำหนดไว้ที่ 4 วัน ซึ่งผมมี tblCountDay รองรับอยู่ ปัญหาคือ มันต้องไม่นับ Date_Change แต่ต้องนับวันถัดไป และถ้า Date_Change = วันธรรมดา จันทร์ถึงศุกร์ มันต้องไม่นับตัวมันเอง มันต้องโดดข้ามไปอีกวัน เช่น Date_Change 18/4/2011 เป้าหมาย 4 วัน ต้องเป็นวันที่ 22/4/2011 ซึ่งผลที่ออกมามันยังผิดอยู่ คือวันที่ 21/42011 ซึ่งมันนับตัว Date_Change ด้วย
โค้ดตามนี้ครับ สำหรับ (Duration ,heBreak
Function offday(ByVal frDate As Date, ByVal toDate As Date) As Long
Dim j As Long
j = 0
Dim xDate As Date
For xDate = frDate To toDate
If Weekday(xDate, vbMonday) > 5 Or _
DCount("SDate", "tblSpecialDate", "[SDate] = cDate('" & xDate & "')") > 0 _
Then j = j + 1
Next
offday = j
End Function
Work_Goal โค้ดตามนี้
Public Function pfNextWorkDT(pStartDT As Date, pNumOfDy As Long) As Date
' pStartDT = ÇѹàÃÔèÁµé¹
' pNumOfDy = ¨Ó¹Ç¹Çѹ·Ó§Ò¹
'
' ÇÔ¸Õ¡Òä×Í ËÒÇѹËÂØ´ÃÇÁÃÐËÇèÒ§ÇѹàÃÔèÁµé¹áÅÐÇѹÊØ´·éÒ·Õèä´é¨Ò¡¡Òúǡà¢éÒ仵çæ (pStartDT + pNumOfDay)
' ¶éÒ¾ºÇèÒÁÕÇѹËÂØ´ ¡ç¹ÓÇѹËÂØ´·ÕèËÒä´éä»ÃÇÁ¡Ñº¨Ó¹Ç¹Çѹ·Ó§Ò¹·Õèµéͧ¡Òà áÅéÇËÒÇѹÊØ´·éÒÂÍÕ¡¤ÃÑé§ (pStartDT + pNumOfDay + wLastTotalHol)
' ¹ÓÇѹÊØ´·éÒÂãËÁè¹Õé ä»ËÒÇѹËÂØ´ÃÇÁ¨Ò¡ÇѹàÃÔèÁµé¹ÍÕ¡¤ÃÑé§ ·Óä»àÃ×èÍÂ樹¡ÇèҨоºÇèÒ ÇѹËÂØ´ÃÇÁ¤ÃÑ駡è͹˹éÒ ¡Ñº¤ÃÑ駹ÕéÁըӹǹà·èҡѹ
' «Öè§ËÁÒ¤ÇÒÁÇèÒ äÁ辺ÇèÒÁÕÇѹËÂØ´à¾ÔèÁàµÔÁ ´Ñ§¹Ñé¹ÇѹÊØ´·éÒ¨ҡ¤ÃÑ駹Õé ¡ç¨Ðà»ç¹¼ÅÅѾ¸ì·Õèµéͧ¡ÒÃ
Dim wEndDT As Date ' ÇѹÊØ´·éÒÂ
Dim wDay As Integer ' ¨Ó¹Ç¹Çѹ·Õèµéͧ¡Òúǡà¢éҡѺÇѹàÃÔèÁµé¹ à¾×èÍËÒÇѹÊØ´·éÒÂ
Dim wSat As Integer ' ¨Ó¹Ç¹ÇѹàÊÒÃìÃÐËÇèÒ§ÇѹàÃÔèÁµé¹áÅÐÇѹÊØ´·éÒÂ
Dim wSun As Integer ' ¨Ó¹Ç¹ÇѹÍÒ·ÔµÂìÃÐËÇèÒ§ÇѹàÃÔèÁµé¹áÅÐÇѹÊØ´·éÒÂ
Dim wTradHol As Integer ' ¨Ó¹Ç¹ÇѹËÂØ´¹Ñ¡¢ÑµÄ¡ÉìÃÐËÇèÒ§ÇѹàÃÔèÁµé¹áÅÐÇѹÊØ´·éÒÂ
Dim wTotalHol As Integer ' ¨Ó¹Ç¹ÇѹËÂØ´ÃÇÁ·Ñé§ËÁ´ÃÐËÇèÒ§ÇѹàÃÔèÁµé¹áÅÐÇѹÊØ´·éÒÂ
Dim wLastTotalHol As Integer ' ¨Ó¹Ç¹ÇѹËÂØ´ÃÇÁ ¨Ò¡¡ÒÃËÒ¤ÃÑ駡è͹˹éÒ
wTotalHol = 0
Do
wLastTotalHol = wTotalHol
wDay = pNumOfDy + wLastTotalHol
wEndDT = DateAdd("d", wDay - 1, pStartDT)
wSat = DateDiff("ww", pStartDT - 1, wEndDT, 7)
wSun = DateDiff("ww", pStartDT - 2, wEndDT, 7)
wTradHol = DCount("SDate", "tblSpecialDate", "SDate between #" & Format$(pStartDT, "dd-mmm-yyyy") & "# and #" & Format$(wEndDT, "dd-mmm-yyyy") & "#")
wTotalHol = wSat + wSun + wTradHol
Loop Until wTotalHol = wLastTotalHol
pfNextWorkDT = wEndDT
End Function
โค้ดที่ใส่ในคิวรี่
SELECT tblDetail.Date_Change, tblDetail.Date_Update, DateDiff("d",[Date_Change],[Date_Update]) AS Duration, OffDay([Date_Change],[Date_Update]) AS heBreak, [Duration]-[heBreak] AS Work_Date, pfNextWorkDT([tblDetail].[Date_Change],[tblCountDay].[CountDay]) AS Work_Goal
FROM tblDetail, tblCountDay;
********ช่วยเพิ่มเติมให้หน่อยว่าผมต้องเพิ่มอย่างไร
1 Reply in this Topic. Dispaly 1 pages and you are on page number 1
Time: 0.2766s
อีกฟังก์ชั่น offday( ) ก็น่าจะลักษณะเดียวกัน ลองส่ง (วันที่+1) เข้าไปในฟังก์ชั่นดูครับ อันนี้ผมไม่ได้ดูรายละเอียดนะครับ พอดีไม่มีเวลา ลองทำดูครับ