قبلا در مورد خاصیت Auto Number و ضرورت کامپکت کردن فایل اکسس صحبت کرده ایم و امروز می خواهیم پیرامون بهینه سازی اکسس فایل جداول برنامه که جدا هستند را بهینه سازی ( Compact And Repair ) کنیم . به شیوه ای که کاربر متوجه آن نشود و اگر فایل جداول پسورد هم داشت ، نیازی به وارد کردن آن نباشد .
مراحل Compact And Repair ( بهینه سازی ) جداول متصل اکسس با کدنویسی.
1- در برنامه خود یک فرم ایجاد کنید که Unbound باشد. ( به هیچ جدول یا کوئری متصل نباشد.)
2- یک دکمه در آن قرار دهید و یک TextBox کع نتیجه مانند تصویر زیر می شود.

3- در رویداد OnClick دکمه خود کدهای زیر را قرار دهید .
On Error GoTo SubError
Dim strDatabaseName As String
Dim X As Boolean
Dim intCount As Integer
Dim DbPWD As String
Dim fso As FileSystemObject
'Sever connection to backend before compacting
intCount = Forms.Count - 1
For intIndex = intCount To 0 Step -1
If Forms(intIndex).Name <> "frmCompact" Then
DoCmd.Close acForm, Forms(intIndex).Name
End If
Next intIndex
'Get database fullpath and password (passing DbPWD ByRef by default)
strDatabaseName = CurBackEnd("tblContacts", DbPWD)
If strDatabaseName = "" Then
MsgBox "Cannot compact database, invalid file name for backend. Contact programmer.", _
vbOKOnly, "Error compacting database"
Exit Sub
End If
Set fso = New FileSystemObject
fso.CopyFile strDatabaseName, CurrentProject.Path & "\Backup\" & CurrentProject.Name & "-" & Format(Now, "yyyymmdd-hhmmss") & ".accdb", True
Set fso = Nothing
X = CompactDatabase(strDatabaseName, DbPWD)
If X = False Then
MsgBox "Error compacting database.", vbCritical + vbOKOnly, "Error compacting database"
Else
MsgBox "عملیات موفقیت آمیز بود", vbInformation + vbOKOnly, "Officebaz.ir"
End If
SubExit:
Exit Sub
SubError:
MsgBox "frmMainMenu - cmdCompact_Click error: " & vbCrLf & Err.Number & " = " & Err.Description
Resume SubExit
امکانات دلخواه :
اگر دوست داشتید در یک تکست باکس مسیر حاوی فایل متصل نمایش داده شود . کد زیر را در رویداد OnLoad فرم خود قرار دهید.
درواقع کد زیر مسیر فایل متصل فعلی را در تکست باکس TxtLink نمایش می دهد.
Dim strSource As String
strSource = Split(Split(CurrentDb.TableDefs("tblContacts").Connect, "Database=")(1), ";")(0)
Me.txtLink = strSource
4- یک ماژول با هر نامی که دوست داشتید ایجاد کرده و کدهای زیر را در آن قرار دهید.
Option Compare Database
Public Function CurBackEnd(TableName As String, DbPWD As String) As String
On Error GoTo SubError
Dim tdf As DAO.TableDef
Dim lenPath As Integer
Dim strPath As String
Dim i, j As Integer
CurBackEnd = ""
' Loop through all tables in the database.
For Each tdf In CurrentDb.TableDefs
If InStr(tdf.Name, TableName) Then
strPath = tdf.Connect ' this is the table that we are hunting for
lenPath = Len(strPath)
' Now remove the datebase prefix (DATABASE=)
j = InStr(strPath, "DATABASE=") + 9
CurBackEnd = Mid(strPath, j, lenPath - j + 1)
' Get database password
j = InStr(strPath, "PWD") + 4
k = InStr(j, strPath, ";") 'length of password
DbPWD = Mid(strPath, j, k - j)
GoTo SubExit
End If
Next tdf
SubExit:
On Error Resume Next
Exit Function
SubError:
MsgBox "frmCompaction - CurBackEnd error: " & vbCrLf & Err.Number & " = " & Err.Description
Resume SubExit
End Function
Public Function CompactDatabase(DatabaseName As String, DbPWD As String) As Boolean
On Error GoTo SubError
Dim booStatus As Boolean
Dim backupCreated As Boolean
Dim strBackupFile As String
Dim dtmStart As Date
Dim strLDB As String
Dim strCurLinkDir As String
Dim compactSuccessfull As Boolean
booStatus = False
backupCreated = False
compactSuccessfull = False
' Make sure that DatabaseName exists
If Len(Dir$(DatabaseName)) > 0 Then
' Figure out what the backup file should be named
If StrComp(Right$(DatabaseName, 6), ".accdb", vbTextCompare) = 0 Then
strBackupFile = Left$(DatabaseName, Len(DatabaseName) - 6) & "-Old.accdb"
' Determine whether the backup file already exists, and delete it if it does.
If Len(Dir$(strBackupFile)) > 0 Then
Kill strBackupFile
End If
strLDB = Left$(DatabaseName, Len(DatabaseName) - 6) & ".laccdb"
If Len(Dir$(strLDB)) > 0 Then
MsgBox "Backend database is still opened. Make sure everyone is logged off " _
& "and try again.", vbCritical + vbOKOnly, "Database still open"
GoTo SubExit
End If
' rename backend to backup name
Name DatabaseName As strBackupFile
backupCreated = True
'DBEngine.CompactDatabase strBackupFile, DatabaseName
DBEngine.CompactDatabase strBackupFile, DatabaseName, , , ";PWD=" & DbPWD
compactSuccessfull = True
If backupCreated = True _
And compactSuccessfull = True Then
Kill strBackupFile
End If
booStatus = True
Else
booStatus = False
End If
End If
SubExit:
CompactDatabase = booStatus
Exit Function
SubError:
booStatus = False
'Undo our attempt at compacting
If backupCreated = True Then
If compactSuccessfull = False Then
Name strBackupFile As DatabaseName
End If
End If
MsgBox Form.Name & " - CompactDatabase error: " & vbCrLf & Err.Number & ": " & Err.Description
Resume SubExit
End Function
5- حالا روی باتن ایجاد شده کلیک کنید ، کارهای زیر انجام خواهد شد.
- یک پشتیبان از Back End در پوشه Backup ایجاد می شود.
- فایل Back End بهینه سازی می شود. ( Compact And Repair )
نکات بسیار مهم :
- در کدهای بخش اول ، نام frmCompact را به نام فرمی که باتن را در آن قرار داده اید تغییر دهید.
- نام tblContacs را هم به نام یکی از جداول لینک شده تغییر نام دهید.
- در رویداد OnLoad فرم هم کدهایی قرار دارد که باید آنجا هم tblContacts را به نام یکی از جداول لینک شده تغییر دهید.
مراحل جدا کردن دیتابیس از جداول و محافظت جداول با پسورد.
1- فایل اکسس خود را باز کرده و به تب Database Tools می رویم.
2- گزینه Access Database را انتخاب می کنیم .

3- در پنجره باز شده روی Split Database کلیک می کنیم .
4- در پنجره ای که باز می شود ، سعی کنید مسیر خود فایل را انتخاب کرده و بدون تغییر نام OK کنید .
5- خواهید دید که فایل شما به دو قسمت تقسیم می شود.

نکته :
- معمولا نام be انتهای نام فایل اکسس مشخص کننده Back End بودن فایل می باشد.
- فایل با پسوند laccdb هم در مواقعی نمایش داده میشود که فایل اصلی باز باشد و در واقع نشان دهنده باز بودن فایل اکسس می باشد.
گذاشتن پسورد روی فایلهای اکسس ، Back End
1- اکسس را باز کنید . ( خود برنامه اکسس را باز کنید )
2- از منوی File روی Open کلیک کنید .
3- فایل Back End مورد نظر را انتخاب کنید و مانند تصویر گزینه Open Exclusive را انتخاب کرده و فایل را باز کنید.

4- از منوی File به تب Info بروید و گزینه Encrypt With Password را بزنید.
5- در قسمت بعد پسورد مورد نظر را انتخاب نمائید.
6- فایل را ببنید و فایل Front End را باز کنید .
7- تمام جداول لینک شده را پاک کنید و به External Data رفته و در سکشن Import & Link گزینه Access را انتخاب کنید.
8- گزینه Link Table را انتخاب نمائید و Browse را بزنید.
8- فایل Back End را انتخاب کرده و پسور را وارد نمائید.
9- تمامی جداول را انتخاب کرده و OK کنید.
میدانیم که برای بهینه سازی اکسس یک قذم مهم جدا کردن جداول از دیتابیس است و قبلا در مورد مزایا و بررسی اتصال و برقراری مجدد ارتباط محصولی منتشر کرده ایم.





باسلام وتشکرازآموزشهای بسیار مفیداستاد بحری عزیز
اگه محبت کنید آموزش چاپ رکورد جاری دربرنامه اکسس ارسال نمائیدممنون میشوم
سلام و سپاس
اگر جداول را پاک کنیم و دوباره ایمپورت کنیم مشکل پسورد برطرف میشود ولی همه ارتباطات بین جداول از بین میرود و باید دوباره آنها را ست کنیم
سلام استاد، بعد اجرای برنامه خطا زیر صادر میشه علتش چیه
frmmainmenu_cmd compact_click error: 76=path not found
با سلام
ممنون بابت آموزش خیلی خیلی خوبتون
سپاس فراوان
سلام و وقت بخیر خدمت استاد گرامی
اگه فایل اکسس جداول داخلش باشه و بک اند نداشته باشه کد بالا کار نمیکنه باید چه کدی در کلید بنویسیم که کامپکت کنه ممنون
چون ریبون ها مخفی شدن از طریق کلید اکیی نمیشه کامپکت کرد
درود
ایا راهی هست گه اطلاعات و روردهای جداول اکسس یا در داخل sql server را encrypt کرد؟قبلا با فایل اکسسی مواجه شدم که اطلاعات جداول encrypt شده بود
سلام
تشکر از اساد بحری به جهت آموزش های بسیار مفیدشون