Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Cách đưa chức năng compact & repair vào form
#1
Em đang tìm cách để đưa Compact & repair vào Command Button trong form vì dự án cũng gần đến hồi kết  015 . Thực tế em có tìm được hướng dẫn như thế này ạ, 
-----------------
nén file Access bằng VBA



Bình thường,khi mà các câu lệnh Make, Append, delete thực hiện nhiều lần thì file access của bạn sẽ phình to không tưởng tượng được, có khi lên tới hàng GB, để nén access ta vào menu tool-->database Ulities-->Compact and repair Database
Nhưng đôi khi chúng ta cần thực hiện điều đó bằng VBA vì đã khóa Menu, thay bằng customise menu, hoặc với mục đích thân thiện với người dùng chỉ trên một nút nhấn.

hãy copy đoạn code sau của tác giả Juan M. Afan de Ribera để làm điều đó

Code:
'   ***** Code Start *****
Public Sub CompactDB()

  CommandBars("Menu Bar"). _
  Controls("Tools"). _
  Controls("Database utilities"). _
  Controls("Compact and repair database..."). _
  accDoDefaultAction

End Sub
'   ***** Code End  *****
Thảo luận thêm: http://thuthuataccess.com/forum

----------------------------
( bài viết của bác Duy Tuấn )

Tuy nhiên em không biết phải làm sao để tạo Public Sub CompactDB() cả, em thử nhét vào module rồi nhưng không được, các bác hướng dẫn cụ thể hơn giúp em với ạ. Thực sự về vụ này em không hiểu lắm, em đã tìm hiểu về public sub và sub rồi nhưng hình như do đọc vội quá chẳng ra vấn đề các bác ạ.
Chữ ký của toancvp Nếu tất cả đường đời đều trơn láng    
Có thể nào ta nhận ra ta Bat
Reply
Những người đã cảm ơn Noname
#2
- Code này chỉ chạy cho Access 2003, bạn đang sử dụng Access bao nhiêu?
- File của bạn có chia ra FE - BE không? Cái lệnh Compact nội tại của Accessc chỉ nén file db hiện hành, nếu bạn kết nối với BE thì nó không có tác dụng compact gì cả.
- Bạn tham khảo file demo Compact & Repair của bác MaiDinhDan đi. Compact từ xa... 007
Link: http://thuthuataccess.com/forum/thread-8731.html
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn toancvp , maidinhdan
#3
(02-08-16, 03:50 PM)ongke0711 Đã viết: - Code này chỉ chạy cho Access 2003, bạn đang sử dụng Access bao nhiêu?
- File của bạn có chia ra FE - BE không? Cái lệnh Compact nội tại của Accessc chỉ nén file db hiện hành, nếu bạn kết nối với BE thì nó không có tác dụng compact gì cả.
- Bạn tham khảo file demo Compact & Repair của bác MaiDinhDan đi. Compact từ xa... 007
Link: http://thuthuataccess.com/forum/thread-8731.html

Em đang chạy Access 2013 bác ạ, big green. Vấn đề FE - BE em chưa biết gì, file em làm chỉ bình thường thôi bác.
Chữ ký của toancvp Nếu tất cả đường đời đều trơn láng    
Có thể nào ta nhận ra ta Bat
Reply
Những người đã cảm ơn
#4
(02-08-16, 06:55 PM)toancvp Đã viết: ...

Mã:
Sub CompactDbs()
    ' Cai nay ap dung voi ung dung co database tach roi (BK - back-end).
    ' Neu khong co database tach roi thi don gian la that thuoc tinh Compact on Close
    ' Cai nay chi chay khi thoat khoi ung dung, dong het cac ket noi voi database nhe
    On Error Resume Next
    Dim tPath As String, tmpFile As String
    ' duong dan den file du lieu
    tPath = CurrentProject.path & "\Data\"
    ' lap ra mot ten file tam thoi de nen
    tmpFile = tPath & Format(Now(), "MMDDYYYYHHMMSS") & "_mp.mdb"
    ' thuc hien nen du lieu
    Application.CompactRepair tPath & "Data.mdb", tmpFile, False
    ' dua file tam thanh file data chinh thuc
    FileCopy tmpFile, tPath & "Data.mdb"
    Kill tmpFile
End Sub
Đây là cái mình hay dùng trong ứng dụng của mình!
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn toancvp , Che_Guevara , Minh Tiên , Noname
#5
(02-08-16, 09:44 PM)paulsteigel Đã viết:
(02-08-16, 06:55 PM)toancvp Đã viết: ...

Mã:
Sub CompactDbs()
    ' Cai nay ap dung voi ung dung co database tach roi (BK - back-end).
    ' Neu khong co database tach roi thi don gian la that thuoc tinh Compact on Close
    ' Cai nay chi chay khi thoat khoi ung dung, dong het cac ket noi voi database nhe
    On Error Resume Next
    Dim tPath As String, tmpFile As String
    ' duong dan den file du lieu
    tPath = CurrentProject.path & "\Data\"
    ' lap ra mot ten file tam thoi de nen
    tmpFile = tPath & Format(Now(), "MMDDYYYYHHMMSS") & "_mp.mdb"
    ' thuc hien nen du lieu
    Application.CompactRepair tPath & "Data.mdb", tmpFile, False
    ' dua file tam thanh file data chinh thuc
    FileCopy tmpFile, tPath & "Data.mdb"
    Kill tmpFile
End Sub
Đây là cái mình hay dùng trong ứng dụng của mình!

Thank bác, dù chưa hiểu lắm nhưng em sẽ mò từ từ cho ra vấn đề thì thôi big green.
Chữ ký của toancvp Nếu tất cả đường đời đều trơn láng    
Có thể nào ta nhận ra ta Bat
Reply
Những người đã cảm ơn
#6
Chào bạn pausteigel !
Dùng VBA để thay thế tính năng "Compact On Close" trong File thì viết như thế nào bạn ?
Thanks !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#7
(23-08-16, 05:25 PM)Minh Tiên Đã viết: Chào bạn pausteigel !
Dùng VBA để thay thế tính năng "Compact On Close" trong File thì viết như thế nào bạn ?
Thanks !
Cách làm của tôi thì hơi phức tạp một chút nhưng đảm bảo an toàn tương đối.
Cách làm như sau:
1. Có 1 bộ đếm số lần chạy chương trình để thực hiện Compact
2. Tạo một thủ tục để sản sinh ra một file Bat để chạy Access từ dòng lệnh
...
Thủ tục chính như sau:
Mã:
Sub DelayCompact()
    Dim CmdPath As String
    
    ' Duong dan den tap tin thuc thi lenh
    CmdPath = Application.CurrentProject.FullName & ".dbCompact.bat"
    
    Dim s As String, sPath As String, AccAppPath As String
    Dim AppFullPath As String, AppName As String
    
    ' Xac dinh duong dan cua file Access
    AccAppPath = SysCmd(acSysCmdAccessDir) & "msaccess.exe"
    
    sPath = CurrentProject.Path
    AppFullPath = CurrentDb.Name
    AppName = CurrentProject.Name
    
    s = s & ":WAITLOOP" & vbCrLf
    ' Kiem tra xem Access co dang chay khong?
    s = s & "tasklist /FI ""IMAGENAME eq msaccess.exe"" 2>NUL | find /I /N ""msaccess.exe"">NUL" & vbCrLf
    s = s & "if ""%ERRORLEVEL%""==""0"" goto RUNNING" & vbCrLf
    s = s & "goto NOTRUNNING" & vbCrLf
    s = s & "rem===============" & vbCrLf
    s = s & ":RUNNING" & vbCrLf
    ' Doan nay de doi cho Access thoat han
    s = s & "ping localhost -w 2000" & vbCrLf
    s = s & "goto WAITLOOP" & vbCrLf
    s = s & "rem===============" & vbCrLf
    s = s & ":NOTRUNNING" & vbCrLf
    
    ' Xoa file backup cu
    s = s & "del """ & Replace(AppFullPath, AppName, "Backup_" & AppName) & """" & vbCrLf
    
    ' Tao 1 file Backup truoc khi compact
    s = s & "copy """ & AppFullPath & """ """ & Replace(AppFullPath, AppName, "Backup_" & AppName) & """" & vbCrLf
    ' Gio thuc hien lenh compact
    ' Day la cu phap chuan
    '"C:\Program Files\Microsoft Office\Office\MSAccess.exe" "C:\MyDatabase.mdb" /compact "C:\Backup.mdb"
        
    s = s & """" & AccAppPath & """ """ & AppFullPath & """ /Compact" & vbCrLf
    s = s & "rem===============" & vbCrLf
    ' Xoa file Bat sau khi thuc hien xong
    s = s & "del %0" & vbCrLf
    
    ' Ghi ra file Bat
    Dim intFile As Integer
    intFile = FreeFile()
    Open CmdPath For Output As #intFile
    Print #intFile, s
    Close #intFile
        
    ' Xoa bo dem so lan can compact
    AppConfig("DB_COMPACT_COUNT") = 1
    
    ' Lap duong dan de goi lenh thuc thi file Bat
    s = """" & CmdPath & """ """ & AppFullPath & """"
    ' goi lenh thuc thi file Bat
    Shell s, vbHide
    
    ' Thoat Access nhe...
    Application.Quit acQuitSaveAll
End Sub

File bat được tạo ra sau 3 lần chạy như thế này
Mã:
:WAITLOOP
tasklist /FI "IMAGENAME eq msaccess.exe" 2>NUL | find /I /N "msaccess.exe">NUL
if "%ERRORLEVEL%"=="0" goto RUNNING
goto NOTRUNNING
rem===============
:RUNNING
ping localhost -w 2000
goto WAITLOOP
rem===============
:NOTRUNNING
del "E:\Users\Paulsteigel\Desktop\GPE\Access\AutoCompact\Backup_dbCompact.mdb"
copy "E:\Users\Paulsteigel\Desktop\GPE\Access\AutoCompact\dbCompact.mdb" "E:\Users\Paulsteigel\Desktop\GPE\Access\AutoCompact\Backup_dbCompact.mdb"
"C:\Program Files (x86)\Microsoft Office\OFFICE11\msaccess.exe" "E:\Users\Paulsteigel\Desktop\GPE\Access\AutoCompact\dbCompact.mdb" /compact
rem===============
del %0

File mẫu ở đây nhé
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn ongke0711 , Minh Tiên , Noname , Che_Guevara


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Help] Thiết kế form nhập và lưu trữ dữ liệu theo yêu cầu brianhuynh 16 624 20-10-16, 10:54 PM
Bài mới nhất: brianhuynh
  [Hỏi] Cách loại bỏ icon Filter trên Datasheet Form có nguồn là Query. toancvp 2 101 19-10-16, 08:53 PM
Bài mới nhất: toancvp
  cách sửa lỗi cant find project or library trungminh 4 231 01-10-16, 03:37 PM
Bài mới nhất: maidinhdan
  [Help] Nhờ tạo form lưu hóa đơn nhập, hóa đơn xuất, hàng nhập hàng xuất không cần tính tồn laxx_xxal 1 132 22-09-16, 02:35 PM
Bài mới nhất: Nguyen Hoang Diep
  Hướng Dẫn Cách lưu (back up database) dữ liệu! danhxetnghiem 20 2,910 07-08-16, 04:40 PM
Bài mới nhất: maidinhdan

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ