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

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

[VB6] การคำนวณหาเวลาการเข้าออกของพนักงาน (Time Attendance) ในระดับนาที

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

311

กระทู้

502

โพสต์

6052

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6052


ก็เป็นอีกหนึ่งคำถามที่ถามเข้ามาบ่อยมาก ในเรื่องของการคำนวณเวลา หรือ การหาค่าความแตกต่างของระยะเวลา แอดมินก็เลยจัดให้ทันทีที่หาโค้ดเจอล่ะกันครับ แหะๆๆๆ ... ข้อมูลจริงที่รับค่าเข้ามาจากเครื่องอ่านลายนิ้วมือ (Finger Scan) ค่อนข้างยุ่งเหยิงมากกว่านี้นะครับ เพราะมีการสแกนลายนิ้วมือซ้ำซ้อนกัน แต่โค้ดนี้เอาไว้ใช้เพื่อศึกษาการทำงาน และการคำนวณ แอดมินก็เลยกรองข้อมูลสมมุติขึ้นมาให้ดูล่ะกัน ...


Project --> Components ...


Design Time ...

มาดูโค้ดกันเถอะ ...
  1. ' / ---------------------------------------------------------------------------------------------
  2. Private Sub cmdOpenFile_Click()
  3. 'On Error Resume Next
  4. On Error GoTo ErrHandler
  5. Dim strFile As String
  6.    
  7.     dlgOpenFile.FileName = ""
  8.     dlgOpenFile.CancelError = True ' ไม่สนใจ Error ที่เกิดขึ้น
  9.     dlgOpenFile.InitDir = App.Path    ' เลือกตำแหน่งปัจจุบันของ Project
  10.     dlgOpenFile.DialogTitle = "เลือกตำแหน่งเท็กซ์ไฟล์ *.txt" ' ตั้งค่า Title ของ Dialog
  11.     dlgOpenFile.Filter = "Text File (*.txt) | *.txt" ' แสดงผลเฉพาะไฟล์ txt extension
  12.     dlgOpenFile.ShowOpen
  13.     dlgOpenFile.DefaultExt = "*.txt" ' ตั้งค่านามสกุล txt เป็นค่าเริ่มต้น
  14.    
  15.     strFile = dlgOpenFile.FileName
  16.     If strFile = "" Then Exit Sub
  17.     txtOpenFile.Text = strFile

  18. ExitProc:
  19.     Exit Sub

  20. ErrHandler:
  21.     ' หากไม่เท่ากับ 32755 ... คือหมายเลข Error 32755 นี้ คือ การกดปุ่ม Cancel น่ะครับ
  22.     ' พูดง่ายๆ ผมไม่สนใจการเกิด Error นี้น่ะครับ ... แต่ Error อื่นๆ จะคอยดักไว้อีกที
  23.     If Err.Number <> 32755 Then
  24.         MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
  25.         ' Resume ExitProc
  26.     End If

  27. End Sub
คัดลอกไปที่คลิปบอร์ด
ส่วนของการเลือกไฟล์ (Text File) ข้อมูลของการเข้าออก


ข้อมูลทดสอบ โดยที่ในแต่ละหลักจะแยกออกจากกันด้วยเครื่องหมายช่องว่าง (Space)

โค้ดในส่วนของการแยกแยะข้อมูลออกจากกัน ก่อนที่จะทำการประมวลผล
  1. ' / ---------------------------------------------------------------------------------------------
  2. Private Sub cmdReadText_Click()
  3.     Dim iRow, i As Long
  4.     Dim iArr As Variant
  5.     Dim StrData As String
  6.     Dim StrTemp As String
  7.     ' ตัวแปร Object ใช้กับ ListView Control
  8.     Dim LV As ListItem
  9.         
  10.     If Trim$(txtOpenFile.Text) = "" Or Len(Trim$(txtOpenFile.Text)) = 0 Then Exit Sub
  11.    
  12.     ' Open Text File
  13.     Open Trim$(txtOpenFile.Text) For Input As #1
  14.    
  15.     iRow = 1
  16.     ' ทำจนกว่าจะหมดข้อมูล (EOF - End Of File)
  17.     Do Until EOF(1)
  18.         ' อ่านข้อมูลเข้ามาทีละบรรทัด
  19.         Line Input #1, StrData
  20.         StrTemp = Trim(StrData)
  21.         ' แยกชุดตัวอักษรออกจากกันด้วยคำสั่ง Split
  22.         ' โดยใช้เครื่องหมายช่องว่าง (Space) ในการจับแยกชุดตัวอักษร แล้วเก็บเข้าไปใน Array
  23.         iArr = Split(StrTemp, " ")
  24.         
  25.         ' Index = 0 it's Item
  26.         Set LV = lvwData.ListItems.Add(, , iRow)
  27.         ' Employee ID
  28.         LV.SubItems(1) = iArr(0)
  29.         ' Date In/Out
  30.         LV.SubItems(2) = iArr(1)
  31.         ' Time In/Out
  32.         LV.SubItems(3) = iArr(2)
  33.         
  34.         ' เลขจำนวนเต็มใดๆหารเอาเศษ (MOD) หากได้ 1 คือเลขคี่ หากได้เลข 0 คือเลขคู่
  35.         If (iRow Mod 2) = 1 Then
  36.             ' คำนวณหาค่าความต่างเวลาตอนเข้า 08.00 หากเวลาติดลบคือเข้าก่อน
  37.             LV.SubItems(4) = CalTime("08:00", Format(iArr(2), "HH:MM"))
  38.         Else
  39.             ' คำนวณหาค่าความต่างเวลาตอนออก 17.00  หากเวลาติดลบคือออกก่อน
  40.             LV.SubItems(4) = CalTime("17:00", Format(iArr(2), "HH:MM"))
  41.         End If
  42.         
  43.         ' Increment Item
  44.         iRow = iRow + 1
  45.     Loop
  46.    
  47.     ' Close Text File
  48.     Close #1
  49. End Sub
คัดลอกไปที่คลิปบอร์ด
การอ่านข้อมูลแบบ Line By Line ... ด้วยการแยกข้อมูลออกจากกันด้วยเครื่องช่องว่าง (Space) หรือค่า ASCII Code = 32 (ฐาน 10)


ฟังค์ชั่นในการคำนวณหาค่าความต่างของเวลา
  1. ' / ---------------------------------------------------------------------------------------------
  2. ' / ฟังค์ชั่นคำนวณหาค่าความต่างเวลาเป็นนาที
  3. Public Function CalTime(StartTime As Date, EndTime As Date) As Integer
  4. ' / ---------------------------------------------------------------------------------------------

  5.     Dim cHH As Integer
  6.     Dim cMM As Integer
  7.    
  8.     ' / ---------------------------------------------------------------------------------------------
  9.     ' หลักการของการหาค่าความแตกต่างของเวลา
  10.     ' ใช้การหาค่าความแตกต่างในระดับจำนวนของวินาทีทั้งหมดออกมาก่อน
  11.     ' แล้วค่อยคิดตัดออกจากจำนวนชั่วโมง นาที และ วินาที ที่ต่างกัน
  12.     ' 1 ชั่วโมง เท่ากับ 3600 วินาที
  13.     ' 1 นาที เท่ากับ 60 วินาที
  14.     Dim SecInMinute As Integer
  15.     Dim SecInHour As Integer
  16.     SecInMinute = 60    ' จำนวน 1 นาทีเท่ากับ 60 วินาที
  17.     SecInHour = 3600    ' มาจากจำนวน 60 นาทีใน 1 ชั่วโมง คูณเข้ากับ 60 วินาทีในแต่ละนาที ดังนั้น 1 ชั่วโมง = 3600 วินาที
  18.     ' / ---------------------------------------------------------------------------------------------
  19.    
  20.     ' หาจำนวนชั่วโมง (Hour) ... หารตัดเศษ ( \ ) ทิ้งไปเลย ... ทำงานได้เร็วกว่าการหารเอาเศษ ( / )
  21.     ' การกำหนดชนิดตัวแปรแบบเลขจำนวนเต็ม (Integer หรือ Long) มันไม่มีเลขทศนิยมอยู่แล้วครับ
  22.     ' หาความแตกต่างของจำนวนชั่วโมง โดยนับเป็นวินาที จากนั้นให้หารตัดเศษด้วย (จำนวนนาที x จำนวนวินาที)
  23.     ' นั่นคือ ค่าที่ได้ \ (60 นาที x 60 วินาที) ... 1 ชั่วโมงก็จะเท่ากับ 3600 วินาที
  24.     cHH = DateDiff("s", StartTime, EndTime) \ SecInHour
  25.    
  26.     ' หาจำนวนนาที (Minute) ...  ไล่เครื่องหมายวงเล็บให้ถูกด้วยน่ะครับ
  27.     ' การใส่วงเล็บ จะมีความสำคัญที่สูงกว่าเครื่องหมาย + - * / ... อย่าลืมเด็ดขาด
  28.     ' ความแตกต่างของจำนวนนาที ค่าที่ได้ให้ลบออกจากจำนวนวินาที
  29.     ' จำนวนวินาทีที่ได้ ให้ลบออกจากเวลาจำนวนชั่วโมงที่ต่างกันก่อน (ชั่วโมง x วินาที)
  30.     ' แล้วค่อยหารตัดเศษด้วย 60 ... เพราะ 1 นาที = 60 วินาที
  31.     cMM = (DateDiff("s", StartTime, EndTime) - (cHH * SecInHour)) \ SecInMinute
  32.    
  33.     ' คืนค่ากลับให้ฟังค์ชั่น โดยเอาจำนวนชั่วโมงคูณ 60 นาที รวมเข้ากับนาทีที่ไม่เกิน 1 ชั่วโมง
  34.     CalTime = (cHH * 60) + cMM
  35. End Function
คัดลอกไปที่คลิปบอร์ด
การคืนค่ากลับของฟังค์ชั่นจะเป็นตัวเลขชนิดจำนวนเต็ม (Integer) โดยให้มีหน่วยนับเป็นนาที

โค้ดในส่วนอื่นๆ ... (เผื่อเอาไว้สำหรับท่านที่ดาวน์โหลดไม่ได้)
  1. ' / ---------------------------------------------------------------------------------------------
  2. ' / Initial ListView
  3. Sub SetupListView()
  4.     With Me.lvwData
  5.         ' Coding with Run Time
  6.         .View = lvwReport
  7.         .Arrange = lvwNone
  8.         .LabelEdit = lvwManual
  9.         .BorderStyle = ccFixedSingle
  10.         .Appearance = cc3D
  11.         
  12.         .HideColumnHeaders = False
  13.         .HideSelection = False
  14.         .LabelWrap = False
  15.         .MultiSelect = False
  16.         .Enabled = True
  17.         .AllowColumnReorder = True
  18.         .Checkboxes = False
  19.         .FlatScrollBar = False
  20.         .FullRowSelect = True
  21.         .GridLines = True
  22.         .HotTracking = False
  23.         .HoverSelection = False
  24.         
  25.         .Sorted = False 'True
  26.         .SortKey = 0
  27.         .SortOrder = lvwAscending 'lvwDescending
  28.         
  29.         ' Add header
  30.         .ColumnHeaders.Add , , "ลำดับที่", .Width \ 5 - 600
  31.         .ColumnHeaders.Add , , "รหัสพนักงาน", .Width \ 5
  32.         .ColumnHeaders.Add , , "วันที่เข้า/ออก", .Width \ 5 - 120
  33.         .ColumnHeaders.Add , , "เวลาเข้า/ออก", .Width \ 5 - 280
  34.         .ColumnHeaders.Add , , "ความต่างเวลา (นาที)", .Width \ 5 + 200, lvwColumnRight
  35.     End With
  36.    
  37. End Sub

  38. Private Sub Form_Load()
  39.     Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
  40.     txtOpenFile.Text = ""
  41.     Call SetupListView
  42. End Sub

  43. Private Sub Form_Resize()
  44.     On Error Resume Next
  45.    
  46.     If Me.WindowState = vbMinimized Then Exit Sub
  47.     ' Fix width & height
  48.     ' width
  49.     If Me.Width <> 10380 Then
  50.         Me.Width = 10380
  51.         Exit Sub
  52.     End If
  53.     ' height
  54.     If Me.Height <> 7410 Then
  55.         Me.Height = 7410
  56.         Exit Sub
  57.     End If
  58. End Sub
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับแบบเต็ม VB6 (SP6) ได้ที่นี่

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

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

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

0

กระทู้

1

โพสต์

5

เครดิต

Newbie

Rank: 1

เครดิต
5
โพสต์ 2017-12-4 15:52:54 | ดูโพสต์ทั้งหมด

ขอบคุณมากครับอาจารย์ ขอรับไปศึกษาต่อนะครับ

0

กระทู้

51

โพสต์

233

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
233
โพสต์ 2017-12-15 14:40:28 | ดูโพสต์ทั้งหมด

ขอบพระคุณมากครับอาจารย์

0

กระทู้

58

โพสต์

10

เครดิต

Member

Rank: 2

เครดิต
10
โพสต์ 2022-10-25 17:07:29 | ดูโพสต์ทั้งหมด

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

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

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

GMT+7, 2024-4-26 17:00 , Processed in 0.213830 second(s), 16 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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