thongkorn โพสต์ 2019-12-13 15:42:21

[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) ได้ที่นี่ ...

komenservice โพสต์ 2020-2-20 10:31:19

ขอบคุณครับ อาจารย์

jakapong โพสต์ 2020-2-21 10:41:11

ขอบคุณครับ

MMEE007 โพสต์ 2020-3-1 00:04:46

ขอบคุณคับ อาจารย์:):)

g2gsoftuser โพสต์ 2022-10-25 15:32:12

ขอบคุณครับ
หน้า: [1]
ดูในรูปแบบกติ: [VB.NET] แจกโค้ดวิธีการคำนวณหาวันลาพักร้อน รวมเสาร์อาทิตย์และวันหยุดทางราชการ