ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 5023|ตอบกลับ: 4

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

[คัดลอกลิงก์]

320

กระทู้

512

โพสต์

6583

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6583




โค้ดชุดนี้จะเป็น การคำนวณหาวันหยุดลาพักร้อน (Vacation Leave) โดยสามารถทำการลบวันหยุดเสาร์หรืออาทิตย์ และวันหยุดราชการตามปีปฏิทิน (ตัวอย่างใช้ข้อมูลสมมุติ) ออกไปจากช่วงเวลาขอลาพักร้อนได้ โดยมีหลักการดังนี้ หาค่าช่วงระหว่างวันที่เริ่มต้นและสิ้นสุดในการลาพักร้อนเข้ามา จากนั้นทำการตรวจสอบว่าตรงกับวันหยุดเสาร์ - อาทิตย์หรือไม่ หากไม่หยุดก็ให้นับวันนั้นเข้ามาด้วย ส่วนวันทำงานปกติจันทร์ - ศุกร์ ให้นับรวมทั้งหมด นำมาเก็บไว้ใน DataTable ตัวที่ 1 (DT1) สำหรับ DataTable ตัวที่ 2 (DT2) จะทำการเก็บค่าวันหยุดทางราชการเอาไว้ (เวลาใช้งานจริงก็คือการดึงมาจากฐานข้อมูลที่ต้องเก็บค่าวันหยุดเอาไว้ล่วงหน้า) ขั้นตอนสุดท้ายก็คือ ทำการเปรียบเทียบค่า DataTable 1 กับ DataTabe 2 หากค่าใน DataTable 1 มีอยู่ใน DataTable 2 จะต้องทำการลบแถว หรือ DataRow ตัวนั้นทิ้งออกไป ก็จะสามารถคำนวณหาจำนวนวัน และวันที่ทำการขอลาหยุดพักร้อนได้นั่นเอง ...

มาดูโค้ดฉบับเต็มกันเถอะ ...
  1. Public Class frmVacationLeave
  2.     Dim DT1 As DataTable
  3.     Dim DT2 As DataTable

  4.     ' / -----------------------------------------------------------------------------
  5.     Private Sub frmVacationLeave_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  6.         Call SetupDataTable()
  7.         lblTotalDay.Text = "Total Vacation Leave: "
  8.     End Sub

  9.     ' / -----------------------------------------------------------------------------
  10.     Sub SetupDataTable()
  11.         '/ Create Column Header
  12.         DT1 = New DataTable
  13.         DT1.Columns.Add(New DataColumn("Date", GetType(String)))
  14.         DT1.Columns.Add(New DataColumn("Day", GetType(String)))
  15.         DT1.Columns.Add(New DataColumn("DayOfWeek", GetType(String)))
  16.         '//
  17.         DT2 = New DataTable
  18.         DT2.Columns.Add(New DataColumn("Date", GetType(String)))
  19.         '// Sample
  20.         DT2.Rows.Add("16/12/2562")
  21.         '// Random Date
  22.         For i = 0 To 2
  23.             Dim row As String() = {Convert.ToDateTime(RandomDate("01/01/2562", "01/12/2562"))}
  24.             DT2.Rows.Add(row)
  25.         Next
  26.         '// Sample dd/MM/yyyy
  27.         DT2.Rows.Add(Format(Convert.ToDateTime(RandomDate("01/12/2562", "31/12/2562")), "dd/MM/yyyy"))
  28.         dgvDate.DataSource = DT2
  29.     End Sub

  30.     ' / -----------------------------------------------------------------------------
  31.     ' / Random Date.
  32.     Function RandomDate(startDate As DateTime, endDate As DateTime)
  33.         RandomDate = DateAdd(
  34.             "d" _
  35.             , Fix(DateDiff("d", startDate, endDate) * Rnd()) _
  36.             , startDate _
  37.         )
  38.     End Function

  39.     ' / -----------------------------------------------------------------------------
  40.     '// https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.dateandtime.weekday?view=netframework-4.8
  41.     ' / -----------------------------------------------------------------------------
  42.     Private Sub btnVacation_Click(sender As System.Object, e As System.EventArgs) Handles btnVacation.Click
  43.         Dim StartDate As DateTime = Convert.ToDateTime(dtpStartDate.Text)
  44.         Dim EndDate As DateTime = Convert.ToDateTime(dtpEndDate.Text)
  45.         '// Find the number of days to loop.
  46.         Dim TotalDays = (EndDate - StartDate).TotalDays
  47.         'MsgBox(TotalDays)
  48.         '// Clear DataTable
  49.         DT1.Rows.Clear()
  50.         Dim row As String() = {}
  51.         '// Read the date values stored in the DataTable first.
  52.         For i = 0 To TotalDays
  53.             '// Check that the DayOfWeek value.
  54.             Dim weekday As DayOfWeek = Convert.ToDateTime(dtpStartDate.Text).AddDays(i).DayOfWeek
  55.             Dim MyFormatDate As String = "dd/MM/yyyy"
  56.             '// FirstDayOfWeek.Saturday = 6
  57.             If weekday = DayOfWeek.Saturday Then
  58.                 '// Working day.
  59.                 If Not chkSaturday.Checked Then
  60.                     row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Saturday.ToString, DayOfWeek.Saturday}
  61.                     DT1.Rows.Add(row)
  62.                 End If

  63.                 '// FirstDayOfWeek.Sunday = 0 (Default)
  64.             ElseIf weekday = DayOfWeek.Sunday Then
  65.                 '// Working day.
  66.                 If Not chkSunday.Checked Then
  67.                     row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Sunday.ToString, DayOfWeek.Sunday}
  68.                     DT1.Rows.Add(row)
  69.                 End If

  70.                 '// Working Days.
  71.             Else
  72.                 Select Case weekday
  73.                     Case DayOfWeek.Monday
  74.                         row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Monday.ToString, DayOfWeek.Monday}
  75.                     Case DayOfWeek.Tuesday
  76.                         row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Tuesday.ToString, DayOfWeek.Tuesday}
  77.                     Case DayOfWeek.Wednesday
  78.                         row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Wednesday.ToString, DayOfWeek.Wednesday}
  79.                     Case DayOfWeek.Thursday
  80.                         row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Thursday.ToString, DayOfWeek.Thursday}
  81.                     Case DayOfWeek.Friday
  82.                         row = {Convert.ToDateTime(dtpStartDate.Text).AddDays(i).ToString(MyFormatDate), DayOfWeek.Friday.ToString, DayOfWeek.Friday}
  83.                 End Select
  84.                 DT1.Rows.Add(row)
  85.             End If
  86.         Next
  87.         '//
  88.         dgvData.DataSource = Nothing
  89.         dgvData.Rows.Clear()
  90.         dgvData.DataSource = DT1

  91.         '// Compare 2 DataTable.
  92.         Call CheckDateExist()
  93.     End Sub

  94.     ' / -----------------------------------------------------------------------------
  95.     ' / Remove Rows from DataTable (DT1) that exists in another DataTable (DT2).
  96.     Sub CheckDateExist()
  97.         Dim RowsToRemove As New List(Of DataRow)()
  98.         For Each Row1 As DataRow In DT1.Rows
  99.             For Each Row2 As DataRow In DT2.Rows
  100.                 If Row1("Date").ToString() = Row2("Date").ToString() Then
  101.                     RowsToRemove.Add(Row1)
  102.                 End If
  103.             Next
  104.         Next
  105.         '//
  106.         For Each row As DataRow In RowsToRemove
  107.             DT1.Rows.Remove(row)
  108.             DT1.AcceptChanges()
  109.         Next
  110.         dgvData.DataSource = Nothing
  111.         dgvData.Rows.Clear()
  112.         dgvData.DataSource = DT1
  113.         lblTotalDay.Text = "Total Vacation Leave: " & dgvData.Rows.Count & " Days."
  114.     End Sub

  115.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  116.         Me.Close()
  117.     End Sub

  118.     Private Sub btnRandomDate_Click(sender As System.Object, e As System.EventArgs) Handles btnRandomDate.Click
  119.         DT2.Rows.Clear()
  120.         '// Random Date
  121.         For i = 0 To 5
  122.             Dim row As String() = {Convert.ToDateTime(RandomDate("01/01/2562", "01/12/2562"))}
  123.             DT2.Rows.Add(row)
  124.         Next
  125.         '// Sample dd/MM/yyyy
  126.         DT2.Rows.Add(Format(Convert.ToDateTime(RandomDate("01/12/2562", "31/12/2562")), "dd/MM/yyyy"))
  127.         dgvDate.DataSource = DT2
  128.     End Sub
  129. End Class
คัดลอกไปที่คลิปบอร์ด


ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

5

กระทู้

21

โพสต์

165

เครดิต

Member

Rank: 2

เครดิต
165
โพสต์ 2020-2-20 10:31:19 | ดูโพสต์ทั้งหมด

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

0

กระทู้

4

โพสต์

28

เครดิต

Newbie

Rank: 1

เครดิต
28
โพสต์ 2020-2-21 10:41:11 | ดูโพสต์ทั้งหมด

ขอบคุณครับ

0

กระทู้

33

โพสต์

372

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
372
โพสต์ 2020-3-1 00:04:46 | ดูโพสต์ทั้งหมด

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

0

กระทู้

58

โพสต์

140

เครดิต

Member

Rank: 2

เครดิต
140
โพสต์ 2022-10-25 15:32:12 | ดูโพสต์ทั้งหมด

ขอบคุณครับ
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-11-27 21:29 , Processed in 0.117373 second(s), 5 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้