• nén file Access bằng VBA
  • RE: nén file Access bằng VBA

    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 !

    ý 1 thì ok. Còn Cái ý 2 Mình hiểu nhưng mà không biết thực hiện!
  • RE: nén file Access bằng VBA

    Xuân Thanh > 03-06-14, 08:46 PM

    Mã PHP:
    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 

    Sau 30 ngày nén file một lần
    Thân mến
  • RE: nén file Access bằng VBA

    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


    Mình dùng đoạn mã của bạn nén OK nhưng sau khi nén mình không cách nào vào Design View của Form có chứa nút lệnh nén được. Bạn có ý tưởng gì không.
  • RE: nén file Access bằng VBA

    kieu manh > 30-03-17, 10:51 AM

    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
  • RE: nén file Access bằng VBA

    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

    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!
  • RE: nén file Access bằng VBA

    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!

    Cảm ơn Bạn ...Nếu vậy ta Viết chung vào 1 Code CompactDatabase  xong RepairDatabase Luôn liệu có ảnh hưởng gì tới File không Bạ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
  • RE: nén file Access bằng VBA

    kieu manh > 30-03-17, 12:36 PM

    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

    Mã PHP:
    Private Function RepairDatabase(ByVal AccPath As String) As Boolean
        Rem https
    ://msdn.microsoft.com/en-us/library/office/ff194498.aspx
        Dim Acc As ObjectFso As ObjectNewName 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(AccPathNewNameTrue     ''Tien Hanh CompactRepair
        Fso
    .DeleteFile AccPath                                          ''Xoa File Cua
        Name NewName 
    As AccPath                                         ''Chuyen ten File NewName Thanh File AccPath
    ErrorExit
    Set Fso NothingSet 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 BooleanPath As String
        Path 
    ThisWorkbook.Path "\Data2.accdb"
        Repaired RepairDatabase(Path)
        Beep
        MsgBox Repaired
    End Sub 
  • RE: nén file Access bằng VBA

    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ả lời:
    1. Hàm RepairDatabase và hàm GetDBEngine.CompactDatabase; GetDBEngine.RepairDatabase về chức năng thì giống, nhưng về cách thực hoạt động khác nhau hoàn toàn
    * Sự khác nhau:
    - Về thư viện tham chiếu
    + RepairDatabase : thuộc lớp thư viện Visual Basic for Applications; cho nên ta sẽ gọi thẳng với cú pháp Application.CompactRepair(SourceFile, DestinationFile, LogFile) và nó chỉ dùng được trên Access 2016; Access 2013; Access 2010; Nó hoàn toàn không dùng được trên Access 2007, 2003 hoặc thấp hơn ( vài hôm trước mình có 1 bài nói về cái này rồi: Link http://thuthuataccess.com/forum/thread-8...l#pid34534)

    + GetDBEngine.CompactDatabase; GetDBEngine.RepairDatabase: dùng lớp thư viện " Microsoft Data Access Objects reference" lớp phương thức của thư viện DAO; Như trên có trả lời 2 lệnh này chỉ dùng được trên Access 2013 và Access 2016

    và một ý bạn có hỏi
    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


    Cái này liên quan đến phiên bản Access, bởi đến khi có Access 2013 thì nhà sản xuất ta tách hàm compact và repair thành 2 cái lệnh riêng, chứ không để chung.

    * Điểm giống nhau:....

    .....Tôi có việc bận, nên tam trả lời ngắn gọn, có gì bạn thắc mắc tối nay ta trao đổi tiếp