[VB.NET] แจกโค้ดวิธีการคำนวณหาวันลาพักร้อน รวมเสาร์อาทิตย์และวันหยุดทางราชการ
http://www.g2gnet.com/webboard/images/vbnet/vacationleave.pngโค้ดชุดนี้จะเป็น การคำนวณหาวันหยุดลาพักร้อน (Vacation Leave) โดยสามารถทำการลบวันหยุดเสาร์หรืออาทิตย์ และวันหยุดราชการตามปีปฏิทิน (ตัวอย่างใช้ข้อมูลสมมุติ) ออกไปจากช่วงเวลาขอลาพักร้อนได้ โดยมีหลักการดังนี้ หาค่าช่วงระหว่างวันที่เริ่มต้นและสิ้นสุดในการลาพักร้อนเข้ามา จากนั้นทำการตรวจสอบว่าตรงกับวันหยุดเสาร์ - อาทิตย์หรือไม่ หากไม่หยุดก็ให้นับวันนั้นเข้ามาด้วย ส่วนวันทำงานปกติจันทร์ - ศุกร์ ให้นับรวมทั้งหมด นำมาเก็บไว้ใน DataTable ตัวที่ 1 (DT1) สำหรับ DataTable ตัวที่ 2 (DT2) จะทำการเก็บค่าวันหยุดทางราชการเอาไว้ (เวลาใช้งานจริงก็คือการดึงมาจากฐานข้อมูลที่ต้องเก็บค่าวันหยุดเอาไว้ล่วงหน้า) ขั้นตอนสุดท้ายก็คือ ทำการเปรียบเทียบค่า DataTable 1 กับ DataTabe 2 หากค่าใน DataTable 1 มีอยู่ใน DataTable 2 จะต้องทำการลบแถว หรือ DataRow ตัวนั้นทิ้งออกไป ก็จะสามารถคำนวณหาจำนวนวัน และวันที่ทำการขอลาหยุดพักร้อนได้นั่นเอง ...
มาดูโค้ดฉบับเต็มกันเถอะ ...
Public Class frmVacationLeave
Dim DT1 As DataTable
Dim DT2 As DataTable
' / -----------------------------------------------------------------------------
Private Sub frmVacationLeave_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Call SetupDataTable()
lblTotalDay.Text = "Total Vacation Leave: "
End Sub
' / -----------------------------------------------------------------------------
Sub SetupDataTable()
'/ Create Column Header
DT1 = New DataTable
DT1.Columns.Add(New DataColumn("Date", GetType(String)))
DT1.Columns.Add(New DataColumn("Day", GetType(String)))
DT1.Columns.Add(New DataColumn("DayOfWeek", GetType(String)))
'//
DT2 = New DataTable
DT2.Columns.Add(New DataColumn("Date", GetType(String)))
'// Sample
DT2.Rows.Add("16/12/2562")
'// Random Date
For i = 0 To 2
Dim row As String() = {Convert.ToDateTime(RandomDate("01/01/2562", "01/12/2562"))}
DT2.Rows.Add(row)
Next
'// Sample dd/MM/yyyy
DT2.Rows.Add(Format(Convert.ToDateTime(RandomDate("01/12/2562", "31/12/2562")), "dd/MM/yyyy"))
dgvDate.DataSource = DT2
End Sub
' / -----------------------------------------------------------------------------
' / Random Date.
Function RandomDate(startDate As DateTime, endDate As DateTime)
RandomDate = DateAdd(
"d" _
, Fix(DateDiff("d", startDate, endDate) * Rnd()) _
, startDate _
)
End Function
' / -----------------------------------------------------------------------------
'// https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.dateandtime.weekday?view=netframework-4.8
' / -----------------------------------------------------------------------------
Private Sub btnVacation_Click(sender As System.Object, e As System.EventArgs) Handles btnVacation.Click
Dim StartDate As DateTime = Convert.ToDateTime(dtpStartDate.Text)
Dim EndDate As DateTime = Convert.ToDateTime(dtpEndDate.Text)
'// Find the number of days to loop.
Dim TotalDays = (EndDate - StartDate).TotalDays
'MsgBox(TotalDays)
'// Clear DataTable
DT1.Rows.Clear()
Dim row As String() = {}
'// Read the date values stored in the DataTable first.
For i = 0 To TotalDays
'// Check that the DayOfWeek value.
Dim weekday As DayOfWeek = Convert.ToDateTime(dtpStartDate.Text).AddDays(i).DayOfWeek
Dim MyFormatDate As String = "dd/MM/yyyy"
'// FirstDayOfWeek.Saturday = 6
If weekday = DayOfWeek.Saturday Then
'// Working day.
If Not chkSaturday.Checked Then
row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Saturday.ToString, DayOfWeek.Saturday}
DT1.Rows.Add(row)
End If
'// FirstDayOfWeek.Sunday = 0 (Default)
ElseIf weekday = DayOfWeek.Sunday Then
'// Working day.
If Not chkSunday.Checked Then
row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Sunday.ToString, DayOfWeek.Sunday}
DT1.Rows.Add(row)
End If
'// Working Days.
Else
Select Case weekday
Case DayOfWeek.Monday
row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Monday.ToString, DayOfWeek.Monday}
Case DayOfWeek.Tuesday
row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Tuesday.ToString, DayOfWeek.Tuesday}
Case DayOfWeek.Wednesday
row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Wednesday.ToString, DayOfWeek.Wednesday}
Case DayOfWeek.Thursday
row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Thursday.ToString, DayOfWeek.Thursday}
Case DayOfWeek.Friday
row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Friday.ToString, DayOfWeek.Friday}
End Select
DT1.Rows.Add(row)
End If
Next
'//
dgvData.DataSource = Nothing
dgvData.Rows.Clear()
dgvData.DataSource = DT1
'// Compare 2 DataTable.
Call CheckDateExist()
End Sub
' / -----------------------------------------------------------------------------
' / Remove Rows from DataTable (DT1) that exists in another DataTable (DT2).
Sub CheckDateExist()
Dim RowsToRemove As New List(Of DataRow)()
For Each Row1 As DataRow In DT1.Rows
For Each Row2 As DataRow In DT2.Rows
If Row1("Date").ToString() = Row2("Date").ToString() Then
RowsToRemove.Add(Row1)
End If
Next
Next
'//
For Each row As DataRow In RowsToRemove
DT1.Rows.Remove(row)
DT1.AcceptChanges()
Next
dgvData.DataSource = Nothing
dgvData.Rows.Clear()
dgvData.DataSource = DT1
lblTotalDay.Text = "Total Vacation Leave: " & dgvData.Rows.Count & " Days."
End Sub
Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
Me.Close()
End Sub
Private Sub btnRandomDate_Click(sender As System.Object, e As System.EventArgs) Handles btnRandomDate.Click
DT2.Rows.Clear()
'// Random Date
For i = 0 To 5
Dim row As String() = {Convert.ToDateTime(RandomDate("01/01/2562", "01/12/2562"))}
DT2.Rows.Add(row)
Next
'// Sample dd/MM/yyyy
DT2.Rows.Add(Format(Convert.ToDateTime(RandomDate("01/12/2562", "31/12/2562")), "dd/MM/yyyy"))
dgvDate.DataSource = DT2
End Sub
End Class
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...
ขอบคุณครับ อาจารย์ ขอบคุณครับ ขอบคุณคับ อาจารย์:):) ขอบคุณครับ
หน้า:
[1]