قبلا در مورد خاصیت 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 شده بود
سلام
تشکر از اساد بحری به جهت آموزش های بسیار مفیدشون