huanmonster > 04-07-17, 10:25 AM
lehongduc > 04-07-17, 11:22 AM
(04-07-17, 10:25 AM)huanmonster Đã viết: Chào các bạn, tôi có code sau,
Option Compare Database
Option Explicit
Const conJetDate = "\#mm\/dd\/yyyy\#"
'
Private Sub cmdCapNhat_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
Dim rndTime As Date
strSQL = "SELECT CheckInOut.* FROM CheckInOut " & _
"WHERE CheckInOut.TimeDate BETWEEN " & Format(Me.txtTuNgay, conJetDate) & " AND " & Format(Me.txtDenNgay, conJetDate) & " AND timevalue(CheckInOut.[TimeStr])>= #" & Me.txtTimeFilter & "#"
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
rs.MoveFirst
Do Until rs.EOF
rs.Edit
rndTime = (Me.txtEndTime - Me.txtStartTime) * Rnd() + Me.txtStartTime
rs!TimeStr = rs!TimeDate + rndTime
rs.Update
rs.MoveNext
rs.MoveNext
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
Code dùng để sửa giá trị thời gian thỏa mãn điều kiện trong khoảng thời gian nhập vào và lớn hơn giá trị cho trước, thay thế bằng thời gian ngẫu nhiên cho trước.
Tôi muốn sửa 1 rec, bỏ qua 2 rec, làm vậy lặp lại đến hết, tôi dùng rs.Movenext 3 lần để bỏ qua 2 rec nhưng bị báo lỗi 3021, no current record, debug ở dòng rs.MoveNext thứ 2 ( đoạn 3 dòng moveNext).
Các bạn giúp mình xem bị lỗi chỗ nào, chỉ tại mình muốn sửa 1 rec bỏ qua 2 rec nên mới lỗi vậy, chứ dùng 1 moveNext thì chạy OK nhưng không bỏ qua 2 rec được mà sửa hết.
Cảm ơn các bạn
huanmonster > 04-07-17, 11:25 AM
(04-07-17, 11:22 AM)lehongduc Đã viết:(04-07-17, 10:25 AM)huanmonster Đã viết: Chào các bạn, tôi có code sau,
Option Compare Database
Option Explicit
Const conJetDate = "\#mm\/dd\/yyyy\#"
'
Private Sub cmdCapNhat_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
Dim rndTime As Date
strSQL = "SELECT CheckInOut.* FROM CheckInOut " & _
"WHERE CheckInOut.TimeDate BETWEEN " & Format(Me.txtTuNgay, conJetDate) & " AND " & Format(Me.txtDenNgay, conJetDate) & " AND timevalue(CheckInOut.[TimeStr])>= #" & Me.txtTimeFilter & "#"
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
rs.MoveFirst
Do Until rs.EOF
rs.Edit
rndTime = (Me.txtEndTime - Me.txtStartTime) * Rnd() + Me.txtStartTime
rs!TimeStr = rs!TimeDate + rndTime
rs.Update
rs.MoveNext
rs.MoveNext
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
Code dùng để sửa giá trị thời gian thỏa mãn điều kiện trong khoảng thời gian nhập vào và lớn hơn giá trị cho trước, thay thế bằng thời gian ngẫu nhiên cho trước.
Tôi muốn sửa 1 rec, bỏ qua 2 rec, làm vậy lặp lại đến hết, tôi dùng rs.Movenext 3 lần để bỏ qua 2 rec nhưng bị báo lỗi 3021, no current record, debug ở dòng rs.MoveNext thứ 2 ( đoạn 3 dòng moveNext).
Các bạn giúp mình xem bị lỗi chỗ nào, chỉ tại mình muốn sửa 1 rec bỏ qua 2 rec nên mới lỗi vậy, chứ dùng 1 moveNext thì chạy OK nhưng không bỏ qua 2 rec được mà sửa hết.
Cảm ơn các bạn
Theo chỉ định trong đọa code của Bạn, khi đã đến tận cùng của Recordset rồi mà còn phải nhảy mấy phát nữa thì bảo sao không báo lỗi được.
tranthanhan1962 > 04-07-17, 01:58 PM
Dim rs As DAO.Recordset
Dim strSQL As String
Dim rndTime As Date
Dim ThuTuRecord as Interger
ThuTuRecord = 1
strSQL = "SELECT CheckInOut.* FROM CheckInOut " & _
"WHERE CheckInOut.TimeDate BETWEEN " & Format(Me.txtTuNgay, conJetDate) & " AND " & Format(Me.txtDenNgay, conJetDate) & " AND timevalue(CheckInOut.[TimeStr])>= #" & Me.txtTimeFilter & "#"
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
rs.MoveFirst
Do Until rs.EOF
if ThuTuRecord mod 3 = 1 then
rs.Edit
rndTime = (Me.txtEndTime - Me.txtStartTime) * Rnd() + Me.txtStartTime
rs!TimeStr = rs!TimeDate + rndTime
rs.Update
rs.MoveNext
ThuTuRecord = ThuTuRecord + 1
else
rs.MoveNext
ThuTuRecord = ThuTuRecord + 1
End if
Loop
rs.Close
Set rs = Nothing
End Sub
huanmonster > 04-07-17, 03:54 PM
(04-07-17, 01:58 PM)tranthanhan1962 Đã viết: Do vị trí record bạn sửa 1 rec, bỏ qua 2 rec, Ta có các thứ tự record được sửa là 1, 4, 7, 10 ... Đó là các số dư 1 khi chia cho 3. Vì vậy có thể xử lý như sau:
Mã:Dim rs As DAO.Recordset
Dim strSQL As String
Dim rndTime As Date
Dim ThuTuRecord as Integer
ThuTuRecord = 1
strSQL = "SELECT CheckInOut.* FROM CheckInOut " & _
"WHERE CheckInOut.TimeDate BETWEEN " & Format(Me.txtTuNgay, conJetDate) & " AND " & Format(Me.txtDenNgay, conJetDate) & " AND timevalue(CheckInOut.[TimeStr])>= #" & Me.txtTimeFilter & "#"
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
rs.MoveFirst
Do Until rs.EOF
if ThuTuRecord mod 3 = 1 then
rs.Edit
rndTime = (Me.txtEndTime - Me.txtStartTime) * Rnd() + Me.txtStartTime
rs!TimeStr = rs!TimeDate + rndTime
rs.Update
rs.MoveNext
ThuTuRecord = ThuTuRecord + 1
else
rs.MoveNext
ThuTuRecord = ThuTuRecord + 1
End if
Loop
rs.Close
Set rs = Nothing
End Sub
ongke0711 > 05-07-17, 10:23 AM
huanmonster > 05-07-17, 10:43 AM
(05-07-17, 10:23 AM)ongke0711 Đã viết: Sorry là mình cũng hơi thắc mắc tại sao bạn lại phải 'bùa' cái bảng giờ chấm công nhân viên vậy? Thông thường thì muốn cập nhật, hiệu chỉnh giờ công bị sai, quên bấm v.v.. thì nhân viên HR cũng phải nhập thủ công từng người, từng ngày chứ không cập nhật hàng loạt như bạn.
tranthanhan1962 > 05-07-17, 12:44 PM
DooHoaangPhuuc > 05-07-17, 12:58 PM
huanmonster > 05-07-17, 01:22 PM