danhxetnghiem > 03-06-14, 03:54 PM
(03-06-14, 02:41 PM)tmtien261 Đã viết: Chào bạn "danhxetnghiem" !
Như yêu cầu của bạn thì:
1. Muốn nén khi mỗi lần thoát chương trình: Bạn tạo 1 formMain form này phải được đóng sau cùng, tại thủ tục On Close của formMain bạn gọi thực hiện đoạn code nén trên.
2. Muốn nén sau một số ngày nào đó: Bạn tạo 1 table có trường Ngaydanen kiểu Date/Time, lần đầu tiên nén chương bạn Save ngày này vào Ngaydannen. Mỗi khi mở (Hoặc đóng) chương trình bạn so sánh ngày hiện tại với ngày đã lưu, nếu "ngày hiện tại - Ngày đã lưu >= số ngày qui định" thì chương trình gọi lệnh nén.
Chúc bạn thành công !
Xuân Thanh > 03-06-14, 08:46 PM
Private Sub Form_Close()
Dim rsCom As recordset
Set rsCom = CurrentDb.OpenRecordset("tblNgay", dbOpenTable)
If rsCom.RecordCount > 0 Then 'File đã nén
If rsCom!NgayDaNen + 30 > Date Then
rsCom.Edit
rsCom!NgayGaNen = Date
rsCom.Update
' Gọi lệnh nén file ở đây
End If
Else ' File chưa nén lần nào
rsCom.AddNew
rsCom!NgayDaNen = Date
rsCom.Update
' Gọi lệnh nén file ở đây
End If
End Sub
nhimsieunhan > 26-12-16, 12:08 AM
(23-03-13, 01:22 PM)Minh Tiên Đã viết: Đoạn code trên chỉ dùng cho ms Access 2003, còn Ms Access 2007 dùng đoạn code sau để nén (Thay cho chọn Compact on close):
Private Sub Form_Unload(Cancel As Integer)
SendKeys ("%T D C")
End Sub
kieu manh > 30-03-17, 10:51 AM
maidinhdan > 30-03-17, 11:36 AM
(30-03-17, 10:51 AM)kieu manh Đã viết: Các Bạn vui lòng cho mình hỏi một chút 2 cách sau nó khác nhau cái gì ...tại Sao ...?!
Xin Cảm ơn
1/ GetDBEngine.CompactDatabase
2/ GetDBEngine.RepairDatabase
kieu manh > 30-03-17, 11:58 AM
(30-03-17, 11:36 AM)maidinhdan Đã viết:(30-03-17, 10:51 AM)kieu manh Đã viết: Các Bạn vui lòng cho mình hỏi một chút 2 cách sau nó khác nhau cái gì ...tại Sao ...?!
Xin Cảm ơn
1/ GetDBEngine.CompactDatabase
2/ GetDBEngine.RepairDatabase
GetDBEngine.CompactDatabase nghĩa là nén file lại
GetDBEngine.RepairDatabase sửa chửa nếu file đó gặp vấn đề hư hỏng.
Cho nên khi bạn dùng lệnh CompactDatabase, nên thêm lệnh RepairDatabase.
Trong một số trường hợp file ta đang làm bị hỏng do mất điện đột ngột ta sẽ dùng lệnh GetDBEngine.RepairDatabase để xử lý.
Lưu ý : 2 lệnh này chỉ dùng được trên Access 2013 và Access 2016
Thân mến!
kieu manh > 30-03-17, 12:36 PM
Private Function RepairDatabase(ByVal AccPath As String) As Boolean
Rem https://msdn.microsoft.com/en-us/library/office/ff194498.aspx
Dim Acc As Object, Fso As Object, NewName As String
On Error GoTo ErrorHandler
NewName = AccPath & ".temp"
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Acc = CreateObject("Access.Application") ''Manh Viet Them cho nay chay tren Excel
If Fso.FileExists(AccPath) = False Then Exit Function
RepairDatabase = Acc.CompactRepair(AccPath, NewName, True) ''Tien Hanh CompactRepair
Fso.DeleteFile AccPath ''Xoa File Cua
Name NewName As AccPath ''Chuyen ten File NewName Thanh File AccPath
ErrorExit: Set Fso = Nothing: Set Acc = Nothing ''Giai Phong Bien Sau Khi CompactDatabase
Exit Function ''Thoat khi thuc hien xong
ErrorHandler: ''Thong bao Loi
MsgBox "Error #: " & Err.Number _
& vbCrLf & vbCrLf & Err.Description ''Thong bao Loi ma Loi
Err.Clear ''Xoa ma loi
Resume ErrorExit ''Giai Phong Bien ...Khi Gap Loi
End Function
Rem ==========
Public Sub Main_CompactRepair()
Dim Repaired As Boolean, Path As String
Path = ThisWorkbook.Path & "\Data2.accdb"
Repaired = RepairDatabase(Path)
Beep
MsgBox Repaired
End Sub
maidinhdan > 30-03-17, 05:51 PM
(30-03-17, 12:36 PM)kieu manh Đã viết: dựa trên Gợi ý của link sau Mạnh viết thành một Hàm chạy trên Excel ...Nhờ các Bạn xem dùm thế nào ...có bổ sung thêm gì không
https://msdn.microsoft.com/en-us/library...94498.aspx
[php]
Private Function RepairDatabase(ByVal AccPath As String) As Boolean
Rem https://msdn.microsoft.com/en-us/library...94498.aspx
Dim Acc As Object, Fso As Object, NewName As String
On Error GoTo ErrorHandler
NewName = AccPath & ".temp"
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Acc = CreateObject("Access.Application") ''Manh Viet Them cho nay chay tren Excel
If Fso.FileExists(AccPath) = False Then Exit Function
RepairDatabase = Acc.CompactRepair(AccPath, NewName, True) ''Tien Hanh CompactRepair
Trích dẫn:Sao Mình Thấy Link nhà sản xuất có lệnh sau hay là dùng chung cho 2 trường hợp đó ...Vào 1 ?!
RepairDatabase = Access.Application.CompactRepair(sourceDb, destDb, True)
https://msdn.microsoft.com/en-us/library...94498.aspx