|
โค้ดชุดนี้จะเป็น การคำนวณหาวันหยุดลาพักร้อน (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) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|