truongtrungviet > 07-07-17, 05:09 PM
ongke0711 > 07-07-17, 07:42 PM
truongtrungviet > 08-07-17, 12:40 AM
(07-07-17, 07:42 PM)ongke0711 Đã viết: Bác xem cái bài này của tôi đi, có cái hàm công thêm ngày nếu là ngày nghỉ hoặc thứ 7, CN đó. Nguyên lý hoạt động cũng giống vậy, bác biến tấu chút cho trường hợp của mình.
Link: http://thuthuataccess.com/forum/post-359...l#pid35969
----------------------------------------------------------
Dữ liệu bác đưa chưa đủ để tính toán.
Lớp A2 có thời gian đào tạo từ ngày: 01/03/2017 đến ngày: 01/05/2017
- Vậy tổng thời gian là bao nhiêu ngày học? 1 tuần học 3 ngày hay ngày nào cũng học hay như thế nào?
- Có học thứ 7, CN hay không?
Vì nếu ngày nghỉ chung không trùng với ngày học thì cần gì phải bù. Do vậy phải xác định được ngày nào học trong khoảng thời gian trên.
ongke0711 > 08-07-17, 11:36 PM
Dim BuoiHocArr() As String
Dim tmpBuoiHoc As String
tmpBuoiHoc = Replace(BuoiHoc, "CN", 1)
BuoiHocArr = Split(tmpBuoiHoc, "-")
Function IsInArray(ByVal stringToBeFound As String, ByVal arr As Variant) As Boolean
Dim element As Variant
For Each element In arr
If element = stringToBeFound Then
IsInArray = True
Exit Function
End If
Next element
End Function
Option Explicit
Public Function BuNgayHoc(NgayBD As Date, NgayKT As Date, BuoiHoc As String) As Integer
Dim BuoiHocArr() As String
Dim tmpBuoiHoc As String
tmpBuoiHoc = Replace(BuoiHoc, "CN", 1)
BuoiHocArr = Split(tmpBuoiHoc, "-")
Dim tmpSoNgayBu As Integer
Dim tmpNgay As Date
Dim tmpNgayBD As Date
tmpNgay = NgayBD
tmpSoNgayBu = 0
Do Until tmpNgay > NgayKT
If DCount("*", "tblNgayNghiChung", "[NgayNghi] =#" & tmpNgay & "#") > 0 Then
If IsInArray(Weekday(tmpNgay), BuoiHocArr) Then
tmpSoNgayBu = tmpSoNgayBu + 1
End If
End If
tmpNgay = tmpNgay + 1
Loop
BuNgayHoc = tmpSoNgayBu
End Function
Function IsInArray(ByVal stringToBeFound As String, ByVal arr As Variant) As Boolean
Dim element As Variant
For Each element In arr
If element = stringToBeFound Then
IsInArray = True
Exit Function
End If
Next element
End Function
truongtrungviet > 10-07-17, 09:22 AM
ongke0711 > 10-07-17, 11:32 AM
(10-07-17, 09:22 AM)truongtrungviet Đã viết: Cách bù như sau:
Tuần học 2-4, như vậy nếu ngày nghỉ chung trùng ngày thứ 2 thì bù vào thứ 2 (Thêm 1 buổi bù vào tuần sau đó) . Nếu ngày nghỉ chung trùng với thứ tư thì bù vào ngày thứ 4 (Thêm 1 buổi bù vào tuần sau đó).
truongtrungviet > 10-07-17, 11:58 AM
(10-07-17, 11:32 AM)ongke0711 Đã viết:(10-07-17, 09:22 AM)truongtrungviet Đã viết: Cách bù như sau:
Tuần học 2-4, như vậy nếu ngày nghỉ chung trùng ngày thứ 2 thì bù vào thứ 2 (Thêm 1 buổi bù vào tuần sau đó) . Nếu ngày nghỉ chung trùng với thứ tư thì bù vào ngày thứ 4 (Thêm 1 buổi bù vào tuần sau đó).
Nếu theo như cách bù ngày nghỉ như trên tức là nghỉ thứ mấy thì bù lại ngày học khác đúng với ngày thứ đó thì bài toán sẽ khác chút nữa. Nhưng mình nghỉ cách bù này nó không hợp lý lắm.
Vd: Ngày nghỉ 2 ngày, trùng vào ngày thứ 2 và thứ 6 (Lớp học 2-4-6) thì khi hết thời gian khóa học phải thêm 1 tuần nữa bù thêm 2 ngày học thứ 2 và thứ 6 vậy thứ 4 tuần đó bỏ trống??
Mình đang làm cái cách bình thường là nếu nghỉ 2 ngày thì cứ bù kế tiếp nhau thêm 2 ngày học nữa là bù thêm ngày thứ 2 và thứ 4. Anh nghĩ sao?
Nếu theo cách này thì mình cũng mới nghĩ ra giải thuật cho nó nhưng để test code lại rồi post lên.
truongtrungviet > 10-07-17, 05:16 PM
Public Function BuNgayHoc(NgayBD As Date, NgayKT As Date, BuoiHoc As String) As Integer[/align]
[align=justify] Dim BuoiHocArr() As String[/align]
[align=justify] Dim tmpBuoiHoc As String[/align]
[align=justify] tmpBuoiHoc = Replace(BuoiHoc, "CN", 1)[/align]
[align=justify] BuoiHocArr = Split(tmpBuoiHoc, "-")[/align]
[align=justify] Dim tmpSoNgayBu As Integer[/align]
[align=justify] Dim tmpNgay As Date[/align]
[align=justify] Dim tmpNgayBD As Date[/align]
[align=justify] tmpNgay = NgayBD[/align]
[align=justify] tmpSoNgayBu = 0[/align]
[align=justify] Do Until tmpNgay > NgayKT[/align]
[align=justify] If DCount("*", "tblNgayNghiChung", "[NgayNghi] =#" & tmpNgay & "#") > 0 Then[/align]
[align=justify] If IsInArray(Weekday(tmpNgay), BuoiHocArr) Then[/align]
[align=justify] tmpSoNgayBu = tmpSoNgayBu + 1[/align]
[align=justify] End If[/align]
[align=justify] End If[/align]
[align=justify] tmpNgay = tmpNgay + 1[/align]
[align=justify] Loop[/align]
[align=justify] BuNgayHoc = tmpSoNgayBu[/align]
[align=justify]End Function
Function IsInArray(ByVal stringToBeFound As String, ByVal arr As Variant) As Boolean
Dim element As Variant
For Each element In arr
If element = stringToBeFound Then
IsInArray = True
Exit Function
End If
Next element
End Function
ongke0711 > 10-07-17, 05:32 PM
truongtrungviet > 10-07-17, 05:52 PM