นับวันถัดจากวันที่ทำงาน
กระทู้เก่าบอร์ด อ.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

1 @R08102
ฟังก์ชั่น pfNextWorkDT( ) เริ่มนับ 1 จากวันแรกที่ใส่เข้าไปในฟังก์ชั่น ถ้าต้องการนับ 1 ถัดจากวันแรก ทำไมไม่ส่ง (วันที่+1) เข้าไปในฟังก์ชั่นหล่ะครับ

อีกฟังก์ชั่น offday( ) ก็น่าจะลักษณะเดียวกัน ลองส่ง (วันที่+1) เข้าไปในฟังก์ชั่นดูครับ อันนี้ผมไม่ได้ดูรายละเอียดนะครับ พอดีไม่มีเวลา ลองทำดูครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2766s